У чому полягає принципова відмінність WebSockets від чистого TCP?


167

Я читав о WebSockets, і мені цікаво, чому браузер не міг просто відкрити тривіальне TCP-з'єднання і спілкуватися з сервером, як і будь-який інший настільний додаток. І чому таке спілкування можливе через веб-розетки?


8
Але в чому проблема? Нехай вони використовують TCP.
xap4o

2
Більш детальна інформація stackoverflow.com/questions/8051516 / ...
Ернан Eche

2
"WebSocket - це протокол, що забезпечує повнодуплексні канали зв'язку через одне з'єднання TCP". Ви також можете створити TCP-з'єднання, які є повнофункціональними? у чому особливість WebSockets?
Абхішек Джайн

12
Проблема полягає в тому, що звичайно веб-сервери мають лише один порт з міркувань безпеки, а саме порт 80. За визначенням один порт можна підключити до одного з додатком ТІЛЬКИ . Що робити, якщо клієнт хоче скористатися послугою, крім веб (HTTP), але доступний лише один порт? Вуаля! Веб-розетки!
Pithikos

3
@Pithikos вдарив бику в очі, чому нам потрібна така складність веб-розеток, а не просто мати справу з прямими TCP-сокетами для спілкування браузер-сервер.
Сонячно

Відповіді:


260

Простіше спілкуватися через TCP-сокети, коли ви працюєте в межах інтрамережі, оскільки ви, ймовірно, маєте контроль над машинами в цій мережі і можете відкривати порти, придатні для встановлення TCP-з'єднань.

Через Інтернет ви спілкуєтесь із чужим сервером на іншому кінці. Вони надзвичайно малоймовірні , щоб мати якийсь - або старий сокет відкритим для з'єднань. Зазвичай у них буде лише кілька стандартних, таких як порт 80 для HTTP або 443 для HTTPS. Отже, для зв'язку з сервером ви зобов'язані підключитися за допомогою одного з цих портів.

Зважаючи на те, що це стандартні порти для веб-серверів, які зазвичай говорять HTTP, ви зобов'язані відповідати протоколу HTTP, інакше сервер не буде спілкуватися з вами. Мета веб-сокетів - дозволити вам ініціювати з'єднання через HTTP, але потім домовитись про використання протоколу веб-сокетів (якщо припустити, що сервер це може зробити), щоб дозволити більш "потік зв'язку", як "TCP socket".


2
Дякую за просте пояснення, Еш.
xap4o

Отже, WebSocket - це просто обгортка для TCP в тому сенсі, що UDP - це просто обгортка для IP?
Pacerier

3
@Pacerier: WebSocket вимагає деякого транспортного протоколу для роботи, але цей транспортний рівень не повинен бути TCP (хоча це практично завжди буде TCP). Ви можете подумати про WebSockets як про якусь обгортку навколо TCP, але я не вірю, що між ними є якийсь розпорядчий зв’язок.
Еш

4
"Через Інтернет ви спілкуєтесь з чужим сервером на іншому кінці." "З огляду на те, що це стандартні порти (80 та 443) для веб-серверів, які зазвичай говорять HTTP, ви зобов'язані відповідати протоколу HTTP. , інакше сервер не буде спілкуватися з вами. " Зазвичай сервер websocket, до якого ми звертаємось, був би власним. Таким чином, ми можемо мати додаток з протоколом, який ми визначаємо для прослуховування порту. Тоді для чого нам потрібно рукостискання HTTP та комутація протоколів? Натомість, чому ми не можемо безпосередньо слідувати протоколу веб-розетки?
ratul

2
За RFC6455, WebSocket спочатку потребує рукостискання в HTTP, а потім протокол оновляється до WebSocket. Більшість браузерів стежать за цим. Я не знаю, як підтримуватиме ваш клієнт (браузер), якщо ви використовуєте будь-який протокол на сервері. Це так, як ми можемо спілкуватися французькою мовою, тільки ми обидва знаємо французьку. І рукостискання схоже, я запитую вас: «Чи можемо ми спілкуватися по-французьки?» Англійською мовою (тут HTTP). Тут браузери (як хром) знають французьку мову, але ми маємо навчити серверну французьку. Моє запитання полягало в тому, чому RFC6455 (WebSocketProtocol) хочу зробити рукостискання в HTTP і ускладнити речі, чому вони не можуть зробити це по-своєму?
ratul

31

Веб-браузери працюють на рівні програми, тоді як TCP працює на транспортному шарі. Як розробник веб-додатків, простіше надсилати повідомлення по дроту через Прикладний шар замість необроблених байтів на транспортному шарі.

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


2

Websocket - це протокол рівня додатків, а TCP - протокол транспортного рівня. На транспортному шарі у нас зазвичай є протокол TCP та UDP. Будь-яке повідомлення із шару програми потрібно пройти через транспортний шар, щоб передати його іншій машині. Отже, websocket і tcp мають стосунки один до одного і не можуть бути порівнянні.


2

Щоб зробити це простішим, зв’язок веб-розетки здійснюється через порт TCP № 80 (або 443 у випадку зашифрованих TLS з'єднань), що є корисним для тих середовищ, які блокують немережеві підключення до Інтернету за допомогою брандмауера. .

Чи хочете ви використовувати існуючий порт TCP або відкрити новий порт TCP, який може бути заблокований брандмауером?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.