2009-11-06 11 views
27

Jeśli wysyłam dwie wiadomości TCP, czy muszę zająć się sprawą, w której ta ostatnia przychodzi przed pierwszą? Czy jest zagwarantowane, że dotrzesz w kolejności, w jakiej go wysłałem? Zakładam, że nie jest to przykład specyficzny dla Twisted, ponieważ powinien on być zgodny ze standardem TCP, ale jeśli ktoś znający Twisted mógłby zapewnić odpowiedź na Twisted specyficzną dla mojego spokoju ducha, to byłoby to docenione :-)Czy TCP jest dostarczany w kolejności?

+3

Ponieważ TCP nie ma pojęcia, gdzie wiadomości rozpoczęcia lub zakończenia, jak mogłaby ona uporządkować je nawet gdyby chciał? –

Odpowiedz

44

Dopóki dwie wiadomości zostały wysłane na tym samym połączeniu TCP, zamówienie zostanie zachowane. Jeśli wiele połączeń zostanie otwartych między tymi samymi procesami, możesz mieć kłopoty.

Jeśli chodzi o Twisted lub jakikolwiek inny asynchroniczny system zdarzeń: Oczekuję, że otrzymasz komunikaty dataReceived w kolejności odebrania bajtów. Jeśli jednak zaczniesz odkładać pracę na odroczone połączenia, możesz, erm ... "przekręcić" swój przepływ sterowania nie do poznania.

7

TCP to strumień, UDP to wiadomość. Mieszasz terminy. W przypadku TCP prawdą jest, że strumień dotrze w tej samej kolejności, w jakiej został wysłany. W TCP nie ma żadnych niepoprawnych komunikatów, pojawiają się bajty po ich nadejściu, interpretując je jako wiadomości od Ciebie.

+1

Re: warunki - Tak, oczywiście. Jednak Twisted streszcza to w odrębne komunikaty (więc interpretowanie ich jako wiadomości nie zależy ode mnie). – Smashery

+0

I warto zauważyć, że podczas gdy możesz mieć dwa napisy na stronie nadawcy, mogą one spaść w jeden odczyt po stronie odbiorcy, i wady versa - w zależności od rozmiarów buforów i warunków sieci. –

+1

Nie, Twisted nie streszcza TCP w "wiadomościach". Otrzymasz porcję bajtów (aż do jednego bajtu na raz w ekstremalnych przypadkach) w protokole podstawowym. – truppo

20

TCP jest zorientowany na połączenie i oferuje swoim klientom w zamówieniu dostawy. Oczywiście dotyczy to poziomu połączenia: poszczególne połączenia są niezależne.

Należy pamiętać, że zwykle odnosimy się do "strumieni TCP" i "komunikatów UDP".

Niezależnie od używanej biblioteki klienta (np. Twisted), podstawowe połączenie TCP jest od niej niezależne. TCP będzie dostarczać "komunikaty protokołu" do twojego klienta. Przez "komunikat protokołu" odsyłam oczywiście do protokołu używanego w warstwie TCP.

Dalsza uwaga, że ​​operacja We/Wy są asynchroniczne w przyrodzie i bardzo zależny od obciążenia systemu + również mieszanie sieć opóźnia & straty, nie można polegać na wiadomości nakazującej między połączenia TCP.

+0

Co masz na myśli przez połączenia _between_ TCP? – simplename

11

TCP "gwarantuje", że odbiorca otrzyma odtworzony strumień bajtów, tak jak został pierwotnie wysłany przez nadawcę. Jednakże pomiędzy punktami końcowymi wysyłania/odbierania TCP (to znaczy siecią fizyczną), dane mogą być odbierane nie w kolejności, mogą być pofragmentowane, mogą być uszkodzone, a nawet mogą zostać utracone. TCP uwzględnia te problemy za pomocą mechanizmu uzgadniania, który powoduje ponowne przesyłanie niepoprawnych pakietów. Stos TCP w odbiorniku umieszcza te pakiety w takiej kolejności, w jakiej zostały przesłane, aby po odczytaniu z gniazda TCP dane były odbierane tak, jak zostały pierwotnie wysłane.

Po wywołaniu metody doRead w trybie Twisted dane są odczytywane z gniazda do rozmiaru bufora. Te dane mogą reprezentować pojedynczą wiadomość, częściową wiadomość lub wiele wiadomości. Od ciebie zależy wyodrębnienie komunikatów z bufora, ale masz gwarancję, że bajty znajdują się w ich wysyłanej kolejności w tym momencie.

Niestety do zaciemniania wody z moim wcześniejszym poście ...

+0

prosimy o ponowną odpowiedź, ponieważ bardzo się mylisz. API wyeksponowany przez TCP jest bardzo strumieniem z dostawą uporządkowaną według bajtów. Odwołujesz się tutaj do podstawowej metody transportu (tzn. Pakietów), która oczywiście nie jest gwarantowana. – jldupont

+0

FYI, "warstwa serwera" dla TCP to IP, który jest oczywiście "bezpołączeniowy" i nie gwarantuje dostarczenia zamówienia pakietowego. – jldupont

+0

Masz rację. Wyjaśnię. Dzięki. –

Powiązane problemy