В чем принципиальная разница между WebSockets и чистым TCP?

167

Я читал о WebSockets и удивляюсь, почему браузер не может просто открыть тривиальное TCP-соединение и связаться с сервером, как любое другое настольное приложение. И почему это общение возможно через веб-сокеты?

xap4o
источник
8
Но в чем проблема? Пусть они используют TCP.
xap4o
2
Дополнительная информация stackoverflow.com/questions/8051516/…
Эрнан Эче
2
«WebSocket - это протокол, обеспечивающий полнодуплексные каналы связи по одному TCP-соединению». Вы также можете создавать TCP-соединения, которые являются полнодуплексными? Что это особенного в WebSockets?
Абхишек Джайн
12
Проблема состоит в том, что обычно веб-серверы имеют только один открытый порт из соображений безопасности, а именно порт 80. По определению один порт можно подключить к одному приложению ТОЛЬКО . Так что, если клиент хочет использовать службу, отличную от веб (HTTP), но доступен только один порт? Вуаля! WebSockets!
Питикос,
3
@Pithikos сразу понял, зачем нам нужна такая сложность веб-сокетов, а не просто иметь дело с прямыми TCP-сокетами для связи между браузером и сервером.
Солнечный

Ответы:

260

Проще общаться через TCP-сокеты, когда вы работаете в пределах границ интрасети, так как вы, вероятно, имеете контроль над машинами в этой сети и можете открывать порты, подходящие для создания соединений TCP.

Через Интернет вы общаетесь с чужим сервером на другом конце. Они крайне маловероятны , чтобы иметь какой - либо старый сокет открытым для соединений. Обычно у них будет только несколько стандартных, таких как порт 80 для HTTP или 443 для HTTPS. Итак, для связи с сервером вы обязаны подключиться через один из этих портов.

Учитывая, что это стандартные порты для веб-серверов, которые обычно используют HTTP, вы обязаны соблюдать протокол HTTP, иначе сервер не будет с вами общаться. Назначение веб-сокетов состоит в том, чтобы позволить вам инициировать соединение через HTTP, а затем договориться об использовании протокола веб-сокетов (при условии, что сервер способен на это), чтобы позволить поток сообщений, более похожий на «сокет TCP».

ясень
источник
2
Спасибо за легкое объяснение, Эш.
xap4o
То есть WebSocket - это просто оболочка для TCP в том смысле, что UDP - просто оболочка для IP?
Pacerier
3
@Pacerier: WebSocket требует своего рода транспортного протокола для работы, но этот транспортный уровень не обязательно должен быть TCP (хотя на практике он почти всегда будет TCP). Вы можете думать о WebSockets как об обертке вокруг TCP, но я не верю, что между ними есть какая-то предписывающая связь.
Ash
4
«Через Интернет вы общаетесь с чужим сервером на другом конце». «Учитывая, что это стандартные порты (80 и 443) для веб-серверов, которые обычно используют HTTP, вы, следовательно, обязаны соблюдать протокол HTTP. иначе сервер не будет с вами разговаривать. " Обычно сервер веб-сокетов, к которому мы обращаемся, является нашим собственным. Таким образом, у нас может быть приложение с протоколом, который мы определяем для прослушивания порта. Тогда зачем нам HTTP-рукопожатие и переключение протокола? Вместо этого, почему мы не можем напрямую следовать протоколу, похожему на веб-сокет?
ратул
2
В соответствии с RFC6455, WebSocket требуется сначала рукопожатие в HTTP, а затем обновление протокола до WebSocket. Большинство браузеров следуют этому. Я не знаю, как ваша клиентская сторона (браузер) будет поддерживать, если вы используете какой-либо протокол на сервере. Как будто мы можем общаться на французском, только мы оба знаем французский. И рукопожатие, как, я спрашиваю вас: «Можем ли мы общаться на французском?» На английском языке (здесь HTTP). Здесь браузеры (например, Chrome) знают французский, но мы должны учить сервер французскому. Мой вопрос состоял в том, почему RFC6455 (WebSocketProtocol) хочет сделать рукопожатие в HTTP и усложнить вещи, почему они не могут сделать это по-своему?
ратул
31

Веб-браузеры работают на уровне приложений, тогда как TCP работает на транспортном уровне. Как разработчик веб-приложений, проще отправлять сообщения по сети через прикладной уровень, а не необработанные байты на транспортном уровне.

В основе WebSockets лежит TCP, он просто абстрагирован для простоты.

wulfgarpro
источник
2

Websocket - это протокол прикладного уровня, а TCP - протокол транспортного уровня. На транспортном уровне у нас обычно есть протоколы TCP и UDP. Любое сообщение от прикладного уровня должно пройти через транспортный уровень для передачи на другой компьютер. Следовательно, websocket и tcp имеют отношение друг к другу и не могут быть сопоставимы.

Минь Трён
источник
2

Для простоты связь через веб-сокет осуществляется через TCP-порт № 80 (или 443 в случае соединений, зашифрованных по протоколу TLS), что выгодно для тех сред, которые блокируют не-интернет-соединения с использованием брандмауэра .

Вы хотите использовать существующий порт TCP или открыть новый порт TCP, который может быть заблокирован брандмауэром?

Евгений
источник