javascript - Integritet poruka Websocketa
Kada koristim WebSocket veze s punim duplexom podataka između klijenta i poslužitelja, jesam li zajamčeno, kada šaljem dvije poruke s poslužitelja, da ću te dvije iste poruke primiti na klijentu, nešto što TCP ne radi?
Drugim riječima, ako poslužitelj pošalje redom hello a zatim its me, prima li klijent uvijek dvije poruke koje sadrže hello i its me ili je moguće da klijent primi helloit a zatim s me ili čak samo jednu poruku poput helloits me?
Odgovor #1
WebSocket je izvorno imao početne i završne bajtove za tekstualne poruke, ali to su stare informacije. Postoji komponenta duljine u (prosinac 2011.) okvirima. I usput, u specifikaciji okvira postoji zastavica koja određuje je li okvir cijela "poruka" ili "fragment poruke", tj. postoje drugi okviri koji čine ovu "poruku". Na primatelju je da pravilno spoji fragmente kako bi ih proslijedio aplikacijskom kodu. Obično ne morate razmišljati o tome osim ako imate vrlo velike "poruke" (razmislite o WS "porukama" kao o "podatcima" više nego o pravim porukama... WS zapravo nije "protokol za poruke" per se).
Ali imajte na umu, WebSocket je transport niskog nivoa. Zamislite ga kao web bazirani TCP. Programeri aplikacija trebali bi koristiti visoko razine protokole „preko WS/WSS“ i ne brinuti o redoslijedu, ponovnom povezivanju, prisutnosti, pub/sub, tuple-prostorima, zajamčenoj isporuci, itd., itd. Ako to ne učinimo, desetine i desetine desetljeća starih aplikacijskih protokola bit će ponovno izumljene.
Odgovor #2
Ako imate vrlo lošu vezu, možete izgubiti poruku (međutim, trebala bi biti ponovno poslana s TCP-om), ali vrlo je malo vjerojatno da će biti podijeljena na takav način. Svaka tekstualna poruka ima granice - početni (0x00) i završni (0xFF) bajt. Preglednik ne bi trebao miješati poruke. Vjerojatno možete dobiti poruke u drugom redoslijedu.
Kako možete biti sigurniji:
- Dodajte svoje kontrolne sume porukama (ali to je zapravo dodatni teret).
- Koristite wss (websockets+tls/ssl) protokol - oštećene poruke se ne bi dobro dešifrirale.