2010-09-19 14 views
7

im przy użyciu 2 komputerów z aplikacją do wysyłania i odbierania datagramów udp.
nie ma kontroli przepływu (ICMP wyłączone)
często, gdy wysyłam plik jako datpany udp za pośrednictwem aplikacji, otrzymuję 2 pakiety zmieniające ich kolejność, a do nich - packetloss.zapewnienie zamówienia pakietu w UDP

czy jest jakiś sposób, aby upewnić się, że winsock i send() wyślą pakiety w taki sam sposób, jak tam dotarły?
czy system operacyjny to robi? ive wyłączone i rodzaj zapory i nie ma żadnego przełącznika sprzętowego podłączonego między komputerami (są one bezpośrednio podłączone). potrzebna konfiguracja urządzenia sieciowego?
dziękuje

Odpowiedz

10

UDP to lekki protokół, który z założenia nie obsługuje takich czynności jak sekwencjonowanie pakietów. TCP jest lepszym wyborem, jeśli chcesz zapewnić niezawodne dostarczanie i sekwencjonowanie pakietów.

UDP jest ogólnie zaprojektowany dla aplikacji, w których utrata pakietów jest akceptowalna lub korzystniejsza niż opóźnienie, które TCP powoduje, gdy musi ponownie zażądać pakietów. Dlatego protokół UDP jest powszechnie używany do przesyłania strumieniowego multimediów.

Jeśli ograniczasz się do korzystania z UDP, musisz opracować metodę identyfikacji pakietów poza kolejnością i ponownego ich sekwencjonowania.

+0

można wyjaśnić, co to jest [UDP dla zakonów] (http://www.nasdaqtrader.com/ content/technicalsupport/specifications/TradingProducts/UFO.pdf)? – Sajuuk

+0

@Sajuuk. Wygląda jak dokument PDF. Jeśli masz pytanie, najlepiej będzie zadać nowe pytanie. – PaulG

7

UDP nie gwarantuje, że twoje paczki zostaną dostarczone w kolejności. (Nie gwarantuje to nawet, że twoje pakiety dotrą w ogóle.) Jeśli potrzebujesz tego poziomu odporności, lepiej jest, jeśli używasz TCP. Ewentualnie możesz dodać znaczniki sekwencji do datagramów i zmienić je na drugim końcu, ale po co wymyślać nowe koło?

+0

z powodu prostaty nie mogę opisać tylko ograniczone do udp tylko. rzadka utrata pakietu danych, a potem jest dostępna.to, że 1 z 3 plików dostaje stratę. Po prostu muszę znaleźć sposób, żeby nadawca wysłał pakiety w odpowiedniej kolejności, reszta nie ma dla mnie znaczenia. dzięki – Davidallencoe

+1

Nie chodzi o to, że nadawca przesyła pakiety w odpowiedniej kolejności, a odbiornik składa je w odpowiedniej kolejności. Tak jak powiedziałem, dodaj znaczniki sekwencji na odpowiednim poziomie. – crazyscot

+0

UDP gwarantuje, że pakiet dotrze nienaruszony lub wcale (tj. Ma sumę kontrolną), a także doda numery portów do surowego adresu IP. Nie gwarantuje to dostarczenia ani sekwencjonowania; to właśnie dodaje TCP (w zasadzie krzyczy pakiet, dopóki drugi koniec nie mówi, że już przybył). Gwarantowana poprawność dostarczania w kolejności jest również wystarczająca, aby udawać, że masz strumień danych (stąd TCP jest gniazdem strumieniowym, ponieważ jest to dość pożądane). –

4
czy istnieje sposób, aby upewnić się, że winsock i send() wyślą pakiety w taki sam sposób, jak tam dotarły?

Nazywa się TCP.

Alternatywnie można wypróbować niezawodny protokół UDP, taki jak UDT. Zgaduję, że możesz być na małej platformie osadzonej, więc potrzebujesz bardziej kompaktowego protokołu, takiego jak Bell Lab's RUDP.

0

nie ma kontroli przepływu (ICMP wyłączone)

można zaimplementować własną kontrolę przepływu za pomocą UDP:

  • Wyślij jeden lub więcej pakietów UDP
  • oczekuje potwierdzenia (wysyłane jako inne pakiety UDP od odbiorcy do nadawcy)
  • Powtórz powyższą instrukcję:

Aby uzyskać więcej informacji, patrz Sliding window protocol.

[Byłoby oprócz o liczbie sekwencji w pakietach, które wysyłasz.]