2013-06-05 19 views
86

Próbując zrozumieć, jak najlepiej mogę różnice między gniazda TCP i websocket, już znaleźć wiele użytecznych informacji w tych kwestiach:Różnice między gniazd TCP i gniazd internetowych, jeszcze raz

i tak dalej ...

W moich badaniach, przeszedłem przez to zdanie na wikipedia:

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

nie jestem całkowicie pewien, co to znaczy dokładnie. Jakie są twoje interpretacje?

+1

Myślę, że twoje zdanie z Wikipedii jest trochę mylące. Z tego, co właśnie przeczytałem z twoich linków, wynika, że ​​WebSockets to tylko połączenia HTTP TCP używane dla ruchu innego niż http. IE, negocjujesz z serwerem na połączeniu TCP z jego portem 80, aby użyć gniazda dla ruchu typu VPN lub coś podobnego. Tak więc websocket byłby po prostu gniazdem http, nie-http? Spitballing ... Nie wiem, co rozumieją przez "wiadomości" zamiast bajtów z fragmentu Wikipedii. – 0xhughes

Odpowiedz

132

Podczas wysyłania bajtów z bufora z normalnym gniazdem TCP, funkcja wysyłania zwraca liczbę bajtów wysłanego bufora. Jeśli jest to gniazdo bez blokowania lub wysyłanie nieblokujące, liczba wysłanych bajtów może być mniejsza niż rozmiar bufora. Jeśli jest to blokujące gniazdo lub blokowanie wysyłania, wówczas zwrócona liczba będzie odpowiadać rozmiarowi bufora, ale połączenie może blokować. W przypadku WebSockets dane przekazywane do metody wysyłania są zawsze wysyłane jako całość "wiadomości" lub wcale. Ponadto implementacje przeglądarki WebSocket nie blokują połączenia wysyłanego.

Istnieją jednak ważniejsze różnice po stronie odbiorcy. Kiedy odbiornik robi recv (lub czyta) na gnieździe TCP, nie ma gwarancji, że liczba zwróconych bajtów odpowiada pojedynczemu wysłaniu (lub zapisaniu) po stronie nadawcy. Może być taki sam, może być mniejszy (lub zero) i może być nawet większy (w tym przypadku odbierane są bajty z wielu wysyłek/zapisów). W przypadku WebSockets, odbiór komunikatu jest sterowany zdarzeniami (generalnie rejestruje się procedurę obsługi komunikatów), a dane w zdarzeniu są zawsze całą wiadomością wysłaną przez drugą stronę.

Zauważ, że możesz komunikować się przez komunikację za pomocą gniazd TCP, ale potrzebujesz dodatkowej warstwy/enkapsulacji, która dodaje do wiadomości dane ramek/granic wiadomości, dzięki czemu oryginalne wiadomości mogą zostać ponownie złożone z fragmentów. W rzeczywistości WebSockets jest zbudowany na normalnych gniazdach TCP i używa nagłówków ramek, które zawierają rozmiar każdej klatki i wskazują, które ramki są częścią wiadomości. Interfejs WebSocket API ponownie składa porcje danych TCP na ramki, które są składane w wiadomościach przed wywołaniem obsługi zdarzeń komunikatu raz na wiadomość.

+0

Dziękuję bardzo! bardzo pomocne dla mnie ... Czy nie chcesz zaktualizować artykułu wikipedia? :) – PierrOz

+5

@kanaka jest ekspertem w tej dziedzinie i zgodnie z polityką Wikipedii, eksperci nie powinni redagować artykułów tematycznych: polityki "konfliktu interesów" (COI). Zostałem tam też spalony i usmażony. Zapomnij o Wikipedii. – oberstet

+1

Więc gniazdo internetowe jest tylko dodatkową warstwą pomiędzy normalnym gniazdem tcp a przeglądarką internetową? –

80

WebSocket to w zasadzie protokół aplikacji (w odniesieniu do stosu sieci ISO/OSI), zorientowany na komunikaty, który wykorzystuje TCP jako warstwę transportową.

Idea protokołu WebSocket polega na ponownym wykorzystaniu nawiązanego połączenia TCP między klientem a serwerem. Po uzgadnianiu HTTP klient i serwer zaczynają mówić protokołem WebSocket, wymieniając koperty WebSocket. Uzgadnianie HTTP jest używane do pokonania dowolnej bariery (np. Zapory ogniowej) między klientem a serwerem oferującym niektóre usługi (zwykle port 80 jest dostępny z dowolnego miejsca, przez dowolną osobę). Klient i serwer mogą w dowolnym momencie przełączać się na komunikaty HTTP, korzystając z tego samego połączenia TCP (które nigdy nie jest wydawane).

Za kulisami WebSocket odbudowuje ramki TCP w spójnych kopertach/wiadomościach.Kanał full-duplex jest wykorzystywany przez serwer do przesyłania aktualizacji w stronę klienta w sposób asynchroniczny: kanał jest otwarty, a Klient może wywoływać wszelkie transakcje futures/callbacks/promises w celu zarządzania wszelkimi asynchronicznymi wiadomościami odebranymi przez WebSocket.

Mówiąc prościej, WebSocket jest protokołem wysokiego poziomu (podobnie jak sam HTTP) opartym na TCP (niezawodna warstwa transportowa, w oparciu o jedną ramkę), który umożliwia budowanie efektywnej aplikacji czasu rzeczywistego z klientami JS (wcześniej Kometa i wykorzystano techniki długiego odpytywania: , aby pobrać aktualizacje z serwera na serwer).

Powiązane problemy