Różnica między gniazdem a gniazdem internetowym?

178

Tworzę aplikację internetową, która musi komunikować się z inną aplikacją przy użyciu połączeń z gniazdem. To dla mnie nowe terytorium, więc chcę mieć pewność, że gniazda różnią się od gniazd sieciowych . Wygląda na to, że są tylko koncepcyjnie podobne.

Pytanie, ponieważ początkowo planowałem użyć Django jako podstawy dla mojego projektu, ale w poście SO, do którego utworzyłem łącze powyżej, było bardzo jasne, że websockets nie są możliwe (lub przynajmniej nie są niezawodne, nawet z czymś takim jak django-websockets ) przy użyciu preferowanej konfiguracji Django (Apache z mod_wsgi). Jednak znalazłem inne posty, które od niechcenia importują moduł gniazda Pythona w celu czegoś tak prostego, jak pobranie nazwy hosta serwera .

Więc:

  • Czy naprawdę się różnią?
  • Czy jest jakiś powód, aby nie używać Django w projekcie, który polega na nawiązywaniu połączeń gniazdowych z zewnętrznym serwerem?
Jonathon
źródło

Odpowiedzi:

141

Aby odpowiedzieć na Twoje pytania.

  1. Chociaż osiągają (ogólnie) podobne rzeczy, tak , naprawdę różne. WebSockets zwykle uruchamiane są z przeglądarek łączących się z serwerem aplikacji za pośrednictwem protokołu podobnego do HTTP, który działa przez TCP / IP . Są więc przeznaczone głównie dla aplikacji internetowych, które wymagają stałego połączenia z serwerem. Z drugiej strony zwykłe gniazda są mocniejsze i bardziej ogólne. Działają przez TCP / IP, ale nie są ograniczone do przeglądarek ani protokołu HTTP . Można je wykorzystać do realizacji dowolnego rodzaju komunikacji.
  2. Nie. Nie ma powodu.
Pablo Santa Cruz
źródło
128
WebSockets nie są podobne do HTTP. Są to zwykłe gniazda z pewnym ramkami i zgodnym z HTTP uzgadnianiem. Uzgadnianie zgodne z protokołem HTTP ma na celu zezwolenie na połączenie WebSocket na tym samym porcie, na którym działa serwer WWW (aby serwer WWW mógł je przekazywać), ale po nawiązaniu połączenia serwer WWW nie jest zapętlony. WebSockets nie ogranicza się do klientów przeglądarki. Zobacz libwebsocket, który ma zarówno klienta innego niż przeglądarkę, jak i serwer.
kanaka
14
DOBRZE. Rozumiem ... Ponieważ nie mogę usunąć tej zaakceptowanej odpowiedzi, uprzejmie proszę o jej poprawną informację. Dzięki!
Pablo Santa Cruz
2
Możesz budować klientów Websocket i używać ich poza przeglądarkami. Protokół websocket to HTTP 1.1 z ulepszonym połączeniem do „websocket”.
Roger F. Gay
2
@huggie nope. Jest trochę kadrowania: tools.ietf.org/html/rfc6455#section-5 (2 bajty dla małych wiadomości).
kanaka
2
@NiCkNewman to prawdopodobnie dobre osobne pytanie. Narzut kadrowania jest minimalny i nie stanowi problemu. Problem z WebSockets do sieci MMO jest dwojaki: dotyczy tylko serwera klienta i protokołu TCP (opartego na strumieniu). Aby uzyskać dobrą wydajność sieci MMO, potrzebujesz również bezpośredniej sieci peer-to-peer i potrzebujesz datagramu (spójne niskie opóźnienie jest ważniejsze niż odbieranie każdego pakietu). Dobrą wiadomością jest to, że WebRTC DataChannel ma obie te właściwości, więc zacznie wypełniać lukę i umożliwi pełną grę MMO AAA w przeglądarce.
kanaka
21

Websockets używają gniazd w swojej implementacji. Gniazda sieciowe są oparte na standardowym protokole (obecnie w ostatecznym wywołaniu, ale jeszcze nie ostatecznym), który definiuje „uzgadnianie” połączenia i „ramkę” wiadomości. Obie strony przechodzą przez procedurę uzgadniania, aby wzajemnie zaakceptować połączenie, a następnie używają standardowego formatu wiadomości („ramki”) do przekazywania komunikatów w tę iz powrotem.

Tworzę framework, który pozwoli ci komunikować się bezpośrednio między maszyną z zainstalowanym oprogramowaniem. To może pasować do twojego celu. Możesz śledzić mój blog, jeśli chcesz: http://highlevellogic.blogspot.com/2011/09/websocket-server-demonstration_26.html

Roger F. Gay
źródło
11

Trzeba by użyć WebSockets (lub jakiś podobny protokół modułu np jako obsługiwany przez wtyczkę Flash), ponieważ po prostu normalna aplikacja przeglądarka nie może otworzyć czystego gniazda TCP.

Socket.IOModuł dostępne node.jsmogą bardzo pomóc, ale zauważ, że to nie czysta moduł websocket w sobie.

W rzeczywistości jest to bardziej ogólny moduł komunikacyjny, który może działać na podstawie różnych innych protokołów sieciowych, w tym gniazd WebSockets i Flash.

Dlatego jeśli chcesz używać Socket.IOna końcu serwera, musisz również użyć ich kodu klienta i obiektów. Nie możesz łatwo nawiązywać surowych WebSocketpołączeń z socket.ioserwerem, ponieważ musiałbyś emulować ich protokół wiadomości.

Alnitak
źródło
11

WebSocket to po prostu kolejny protokół poziomu aplikacji w protokole TCP, podobnie jak HTTP.

Niektóre fragmenty <Spring in Action 4> zacytowane poniżej, mają nadzieję, że pomogą ci lepiej zrozumieć WebSocket.

Mówiąc najprościej, WebSocket jest po prostu kanałem komunikacji między dwiema aplikacjami (niekoniecznie jest to przeglądarka) ... Komunikacja WebSocket może być używana między wszelkiego rodzaju aplikacjami , ale najczęściej używanym WebSocket jest ułatwienie komunikacji między aplikacja serwerowa i aplikacja oparta na przeglądarce.

smwikipedia
źródło
2

Jeśli chodzi o twoje pytanie (b), pamiętaj, że specyfikacja Websocket nie została sfinalizowana. Według W3C :

Osoby wdrażające powinny mieć świadomość, że ta specyfikacja nie jest stabilna.

Osobiście uważam, że Websockets jest zbyt krwawiący, aby go obecnie używać. Chociaż prawdopodobnie uznam je za przydatne za jakiś rok.

Phil Hunt
źródło
A co teraz, 9 lat później?
Venryx