На каком транспортном протоколе основан протокол WebSocket?

«На каком транспортном протоколе основан протокол WebSocket?» — вопрос из категории Сети, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Протокол WebSocket работает поверх TCP (Transmission Control Protocol).

Ключевые этапы установки соединения:

  1. Handshake (рукопожатие): Инициируется клиентом через обычный HTTP/HTTPS запрос с заголовками Upgrade: websocket и Connection: Upgrade. Это позволяет проходить через большинство брандмауэров и прокси.
  2. Переключение протокола: Если сервер поддерживает WebSocket, он отвечает кодом 101 Switching Protocols. После этого соединение переиспользует тот же самый TCP-сокет, но общение продолжается уже по протоколу WebSocket.

Пример кода (клиент на Java с использованием JSR-356):

@ClientEndpoint
public class SimpleWebSocketClient {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("[Connected] Session ID: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("[Message from Server] " + message);
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        System.out.println("[Disconnected] Reason: " + closeReason.getReasonPhrase());
    }

    public static void main(String[] args) throws Exception {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        String serverUri = "ws://echo.websocket.org:80/";
        Session session = container.connectToServer(SimpleWebSocketClient.class, URI.create(serverUri));
        session.getBasicRemote().sendText("Hello, WebSocket!");
        Thread.sleep(5000); // Даём время на получение ответа
        session.close();
    }
}

Преимущества перед HTTP:

  • Полноценный дуплекс: Двусторонняя связь в реальном времени.
  • Низкие накладные расходы: После handshake данные передаются в виде легких фреймов (2-14 байт заголовка), а не тяжелых HTTP-заголовков с каждым сообщением.