Różnice między gniazdami TCP a gniazdami sieciowymi, jeszcze raz [duplikat]

To pytanie ma już odpowiedź tutaj:

Starając się jak najlepiej zrozumieć różnice między gniazdem TCP a websocket, znalazłem już wiele przydatnych informacji w tych pytaniach:

I tak dalej...

W moim śledztwie przejrzałem to zdanie na Wikipedii :

Websocket różni się od TCP tym, że umożliwia strumień wiadomości zamiast strumienia bajtów

Nie jestem do końca pewien, co to dokładnie znaczy. Jakie są wasze interpretacje?

Author: kanaka, 0000-00-00

2 answers

Gdy wysyłasz bajty z bufora z normalnym gniazdem TCP, funkcja send Zwraca liczbę bajtów bufora, które zostały wysłane. Jeśli jest to gniazdo nieblokujące lub nieblokujące wysyłanie, to liczba wysłanych bajtów może być mniejsza niż rozmiar bufora. Jeśli jest to gniazdo blokujące lub blokujące wysyłanie, to zwrócona liczba będzie zgodna z rozmiarem bufora, ale wywołanie może zostać zablokowane. W WebSockets dane przekazywane do metody send są zawsze wysyłane jako cała " wiadomość" albo wcale. Ponadto implementacje WebSocket przeglądarki nie blokują połączenia wysyłania.

Ale są ważniejsze różnice po stronie odbiorczej rzeczy. Gdy odbiornik wykonuje recv (lub odczyt) na gnieździe TCP, nie ma gwarancji, że liczba bajtów zwróconych odpowiada pojedynczemu wysłaniu (lub zapisowi) po stronie nadawcy. Może to być to samo, może być mniej (lub zero), a nawet więcej (w tym przypadku są odbierane bajty z wielu wysyłek/zapisów). Z WebSockets, odbiór wiadomości jest sterowany zdarzeniami (zazwyczaj rejestrujesz procedurę obsługi wiadomości), a dane w zdarzeniu to zawsze cała wiadomość wysłana przez drugą stronę.

Zauważ, że możesz wykonywać komunikację opartą na wiadomościach za pomocą gniazd TCP, ale potrzebujesz dodatkowej warstwy / enkapsulacji, która dodaje dane ramki/granicy Wiadomości do wiadomości, aby oryginalne wiadomości mogły być ponownie złożone z elementów. W rzeczywistości WebSockets jest zbudowany na normalnych gniazdach TCP i używa nagłówków ramek zawiera rozmiar każdej klatki i wskazuje, które klatki są częścią wiadomości. WebSocket API ponownie montuje fragmenty danych TCP do ramek, które są montowane w wiadomości przed wywołaniem obsługi zdarzeń wiadomości raz na wiadomość.

 151
Author: kanaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 01:31:24

WebSocket jest w zasadzie protokołem aplikacji (w odniesieniu do stosu sieciowego ISO/OSI), zorientowanym na wiadomości, który wykorzystuje TCP jako warstwę transportową.

Idea protokołu WebSocket polega na ponownym wykorzystaniu ustalonego połączenia TCP między Klientem a serwerem. Po HTTP handshake klient i serwer zaczynają mówić protokół WebSocket poprzez wymianę koperty WebSocket. Http handshaking służy do pokonania wszelkich barier (np. firewalli) pomiędzy Klient i serwer oferujący pewne usługi (zazwyczaj port 80 jest dostępny z dowolnego miejsca, przez każdego). Klient i serwer mogą w każdej chwili przełączać się na mówienie HTTP, korzystając z tego samego połączenia TCP (które nigdy nie jest uwalniane).

Za kulisami WebSocket przebudowuje ramki TCP w spójnych kopertach / wiadomościach. Kanał full-duplex jest używany przez serwer do wysyłania aktualizacji do Klienta w sposób asynchroniczny: kanał jest otwarty i klient może wywołać dowolne futures / callbacks / obiecuje zarządzać każdą asynchroniczną wiadomością otrzymaną przez WebSocket.

Mówiąc prościej, WebSocket jest protokołem wysokiego poziomu (jak sam HTTP) zbudowanym na TCP (reliable transport layer, on per frame basis), który umożliwia budowanie efektywnej aplikacji w czasie rzeczywistym z Klientami JS (wcześniej stosowane były techniki Comet i long-polling do pobierania aktualizacji z serwera przed implementacją Websocketów. Zobacz post Stackoverflow: różnice między websocketami i długa ankieta na turowy serwer gier ).

 95
Author: Paolo Maresca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-16 05:08:50