2010-12-20 14 views
3

Ich habe bemerkt, dass, wenn ich Pakete in gleichen Intervallen von einem Udp-Socket senden, das erste Paket gesendet wird, scheint verzögert zu sein. Wenn ich zum Beispiel die Pakete alle 100 ms sende, finde ich die Verzögerung zwischen dem Empfang der normal zu verteilenden Pakete mit mittleren 100 ms und der durchschnittlichen Standardabweichung von 4 in meinem Netzwerk. Der Abstand zwischen der Empfangszeit für das erste und das zweite Paket beträgt jedoch normalerweise etwa 10 bis 40 ms - wie Sie sehen können, ist dies eindeutig ein statistisch signifikanter Unterschied, und meine Frage ist, was verursacht es?Was verursacht UDP-Empfangsverzögerung?

Ich verwende die sendto-Funktion von C auf Linux. Jemand schlug vor, dass die Verzögerung durch eine ARP-Auflösung verursacht werden könnte, die verhindert, dass das Paket gesendet wird, bis die Ziel-IP in eine MAC-Adresse konvertiert wurde - ist das wahrscheinlich? Wenn ich das sendende Programm neu starte, dauert das erste Paket wieder zu lange, und die Verzögerung ist inkonsistent - 10 bis 40 ms sind ein ziemlich großer Bereich.

Ich muss herausfinden, warum dieses erste Paket zu lange dauert, und wie man es umgehen kann.

Edit: Weitere Analyse mit pcap zeigt an, dass das sendende Programm die Pakete im richtigen Intervall sendet. Das Problem muss beim Empfänger liegen, der mit select() auf einen lesbaren Socket wartet, dann recvfrom aufruft und das Paket druckt. Gibt es eine Art Pufferung, von der ich vielleicht nichts weiß?

+1

Sie können einen Sniffer verwenden, um zu überprüfen, ob etwas mit Ihrem Computer etwas in Zusammenhang mit der Übertragung des Pakets verwandt ist. –

+0

Hey, könnte wer auch immer downvoted bitte warum? – Benubird

Antwort

0

Sie haben nach Workarounds gefragt. Eine mögliche Problemumgehung, wenn die Empfangszeit des Pakets wichtig ist, ist das Festlegen der Socket-Option SO_TIMESTAMP. Dadurch erhalten Sie die Zeit, die jedes Paket vom Zielkernel empfangen wurde - Sie können diese Zeit dann in der nachfolgenden Verarbeitung und nicht in der "aktuellen Zeit" verwenden.

Alternativ könnte der Absender einen hoch aufgelösten Zeitstempel in das Paket aufnehmen, das er sendet, und diese verwenden.

1

Spekulation wird uns nirgendwohin bringen, feuern Wireshark und es wird Ihnen alles erzählen, was Sie wissen müssen.

+0

Ich betreibe ein wirklich reduziertes System, nichts außer Asche und meinem Programm, und ich hatte Schwierigkeiten, pcap zu laufen. Wireshark ist genau richtig. – Benubird

+0

Wenn wireshark aus ist, was ist mit tcpdump? Wenn dies nicht funktioniert, wenn Sie einen Ethernet-Hub (im Gegensatz zu einem Switch) erhalten, sollten Sie in der Lage sein, das Netzwerk aus der Ferne zu schnüffeln. – doron

+1

Ja - ich habe es geschafft, dass das endlich funktioniert, und es scheint, dass die Pakete mit der richtigen Lücke zwischen ihnen gesendet werden; Die Verzögerung muss auf der Empfängerseite liegen. – Benubird

2

Es ist höchstwahrscheinlich die Zeit, die für die Adressauflösung ARP erforderlich ist. Dies ist das Protokoll, das MAC-Adressen in IP-Adressen auflöst.

Um dies zu umgehen, verwenden Sie statische Einträge im ARP-Cache mit arp -s ip-address hw_address.

+0

Leider kann ich nicht - Arp Befehl ist nicht verfügbar. '-sh: arp: nicht gefunden'. Gute Idee aber. – Benubird

+0

Für mich ist es Teil des Pakets "net-tools" (wie ifconfig etc) und in/sbin/arp. Es ist ein sehr einfaches Werkzeug, das in fast jeder Distribution enthalten ist, was hast du? – hirschhornsalz

+0

Ich habe BusyBox v1.7.2 (2010-11-17 12:19:56 GMT) eingebaute Shell (Asche) – Benubird

0

Ist dies in einem einzelnen LAN? Wenn dies der Fall ist, liegt es wahrscheinlich an der ARP- und/oder Hostnamen-Auflösung. Wenn es sich um ein größeres Netzwerk handelt, kann es alles sein (obwohl es wahrscheinlich mit der Routensuche und der Cache-Population zusammenhängt).

+0

Ja, einzelnes LAN. zwei Maschinen und ein DHCP-Server über Switch verbunden. – Benubird

+0

Unwahrscheinlich, arp zu sein, weil ich festgestellt habe, dass die Pakete in der richtigen Reihenfolge gesendet werden, und weil ich sicher bin, dass der ARP-Cache länger als ein paar Sekunden dauern muss. – Benubird

+0

@benubird ARP-Cache-Speicherung ist vom Betriebssystem abhängig. Wenn Sie sich Ihren letzten Kommentar zur wireshark-Empfehlung ansehen, scheint es etwas im Switch-Fabric zu sein, das die Verzögerung verursacht. – Vatine

0

Ich habe nicht genug "Reputation", um zu stimmen, was ich für die beste Lösung halte, also sage ich nur, dass der Typ, der ARP-Nachrichten erwähnt, höchstwahrscheinlich recht hat. Ich denke, die ARP-Nachrichten sollten nur für das LAN gelten. Sie werden auf Wireshark als "wer hat 192.168.0.24?" zum Beispiel ... und dann wird es eine Antwort von jedem Host geben, der behauptet, diese IP-Adresse zu haben. Das anfängliche Paket, das über UDP an diese Adresse gesendet wird, muss eine ARP-Antwort erhalten, um die IP-Adresse in eine Ethernet-MAC-Adresse aufzulösen ... so UDP, auf der Oberfläche mag es so aussehen, als sollte es niemals BLOCKEN ... dies ist jedoch nur einmal der Fall Die ARP-Adresse ist aufgelöst. Ich bin mir nicht sicher, aber ich denke, wenn Sie UDP an eine Adresse senden, die nicht im LAN ist, sollte es kein ARP erfordern ... es sei denn, es gibt ein Problem, das primäre Gateway zu finden.

Verwandte Themen