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?
Odpowiedz
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.
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.
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
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. –
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
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.
Co masz na myśli przez połączenia _between_ TCP? – simplename
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 ...
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
FYI, "warstwa serwera" dla TCP to IP, który jest oczywiście "bezpołączeniowy" i nie gwarantuje dostarczenia zamówienia pakietowego. – jldupont
Masz rację. Wyjaśnię. Dzięki. –
- 1. Czy guava jest dostarczany z analizatorem argumentów wiersza poleceń
- 2. W xUnit.net, czy możliwe jest uruchomienie testów w kolejności?
- 3. Czy mogę używać TCP w usłudze RESTULT?
- 4. Czy connect() blokuje gniazdo TCP?
- 5. Kanał "tcp" jest już zarejestrowany
- 6. Jak sprawdzić, czy port TCP jest już odsłuchiwany?
- 7. W jaki sposób TCP realizuje/gwarantuje kolejność transmisji danych w kolejności?
- 8. Czy dla aplikacji log4net jest aplikator TCP o niskim poziomie?
- 9. Dlaczego orig_eax jest dostarczany jako dodatek do eax?
- 10. Czy Class.getDeclaredFields() zwraca członków w spójnej kolejności?
- 11. Dlaczego konstruktor jest wywoływany w odwrotnej kolejności?
- 12. OCMock - weryfikacja kolejności wywołań metod. Czy jest jakiś inny sposób?
- 13. T-SQL procedury przechowywanej - wykrywanie, czy parametr jest dostarczany jako wyjście
- 14. Jaki jest poprawny sposób zamknięcia połączenia TCP?
- 15. Czy mogę przekierować ruch nie-SSL, który jest dostarczany na porcie SSL z Nginxem
- 16. Czy jaśmin ma wykonywać specyfikacje w kolejności, w jakiej są zadeklarowane lub w przypadkowej kolejności?
- 17. Sprawdzanie, czy został dostarczony komunikat dotyczący tcp.
- 18. Co to jest aktualizacja okna TCP?
- 19. Konwersja Ilość STRING (Kodowanie Dostarczany) JavaScript
- 20. Standardowy analizator składni JSON dostarczany w pakiecie z językiem Java
- 21. Plugin vs silnika w Rails 3, dostarczany jako gem
- 22. Zmiana kolejności wierszy w data.table w określonej kolejności
- 23. Czy kolejne żądania AJAX są gwarantowane, aby otrzymać je w kolejności?
- 24. os.walk() w odwrotnej kolejności?
- 25. Czy zmiana kolejności Java wpływa na System.currentTimeMillis()?
- 26. Symulacja połączenia TCP w Go
- 27. Przykład "klienta" TCP w Clojure!
- 28. Jak powtórzyć atrybuty klasy, w kolejności, w jakiej zostały zdefiniowane?
- 29. zmiana kolejności w UITableView
- 30. TemplateBeginRepeat w odwrotnej kolejności
Ponieważ TCP nie ma pojęcia, gdzie wiadomości rozpoczęcia lub zakończenia, jak mogłaby ona uporządkować je nawet gdyby chciał? –