Различия между сокетами TCP и веб-сокетами, еще раз

Попытка понять, насколько я могу различать TCP-сокет и websocket, я уже нашел много полезной информации в этих вопросах:

и т.д.

В моих исследованиях я просмотрел это предложение на wikipedia:

Websocket отличается от TCP тем, что он включает поток сообщений вместо потока байтов

Я не совсем уверен, что это значит. Каковы ваши интерпретации?

Ответ 1

Когда вы отправляете байты из буфера с обычным сокетом TCP, функция send возвращает количество байтов отправляемого буфера. Если это неблокирующий сокет или неблокирующая передача, тогда количество отправленных байтов может быть меньше размера буфера. Если это блокирующий сокет или блокировка отправки, то возвращаемый номер будет соответствовать размеру буфера, но вызов может блокироваться. С помощью WebSockets данные, передаваемые методу отправки, всегда отправляются как "сообщение" или вообще не передаются. Кроме того, реализация браузера WebSocket не блокирует вызов отправки.

Но есть более важные различия в принимающей стороне вещей. Когда получатель выполняет recv (или чтение) в сокете TCP, нет гарантии, что количество возвращенных байтов соответствует одной отправке (или записи) на стороне отправителя. Это может быть одно и то же, оно может быть меньше (или равно нулю), и может быть даже больше (в этом случае принимаются байты из нескольких отправлений/записей). С помощью WebSockets получение сообщения управляется событиями (обычно вы регистрируете процедуру обработчика сообщений), а данные в событии всегда являются целым сообщением, отправленным другой стороной.

Обратите внимание, что вы можете осуществлять связь на основе сообщений с использованием сокетов TCP, но вам нужен дополнительный слой/инкапсуляция, которая добавляет данные кадрирования/сообщения в сообщения, чтобы исходные сообщения могли быть собраны повторно из фрагментов. Фактически, WebSockets построен на обычных сокетах TCP и использует заголовки кадров, которые содержат размер каждого кадра и указывают, какие кадры являются частью сообщения. API WebSocket повторно собирает TCP-фрагменты данных в фреймы, которые собраны в сообщения, прежде чем вызывать обработчик событий сообщения один раз за сообщение.

Ответ 2

WebSocket - это в основном протокол приложения (со ссылкой на сетевой стек ISO/OSI), ориентированный на сообщения, который использует TCP как транспортный уровень.

Идея протокола WebSocket заключается в повторном использовании установленного TCP-соединения между клиентом и сервером. После установления связи HTTP клиент и сервер начинают говорить по протоколу WebSocket, обмениваясь конвертами WebSocket. Подтверждение HTTP используется для преодоления любого барьера (например, брандмауэров) между Клиентом и сервером, предлагающим некоторые услуги (обычно порт 80 доступен из любого места, кем угодно). Клиент и сервер могут в любой момент переключать разговор HTTP, используя одно и то же TCP-соединение (которое никогда не выпускается).

За кулисами WebSocket перестраивает кадры TCP в согласованных конвертах/сообщениях. Полнодуплексный канал используется сервером для push-атак для клиента в асинхронном режиме: канал открыт и клиент может вызывать любые фьючерсы/обратные вызовы / promises для управления любым асинхронным WebSocket получил сообщение.

Проще говоря, WebSocket - это протокол высокого уровня (например, сам HTTP), построенный на TCP (надежный транспортный уровень, на основе каждого кадра), который позволяет создавать эффективные приложения реального времени с JS-клиентами (ранее комета и длинные -потоки использовались для загрузки обновлений с сервера).