2016-05-02 13 views
5

Ich lernte über die Ping-Implementierung.Wie berechnet die Ping-Implementierung die Umlaufzeit?

Darin hatte ich einen Zweifel. Der Zweifel besteht darin, wie sie die Umlaufzeit berechnen.

Sie haben eine Berechnung durchgeführt, um die Umlaufzeit zu berechnen. Ich kann diese Berechnung nicht verstehen.

Hier ist der Code für die Berechnung der Umlaufzeit.

tsum += triptime; 
tsum2 += (long long)triptime * (long long)triptime; 
if (triptime < tmin) 
     tmin = triptime; 
if (triptime > tmax) 
     tmax = triptime; 
if (!rtt) 
     rtt = triptime*8; 
else 
     rtt += triptime-rtt/8; 

Die Tsum, tsum2, triptime sind tmax Variablen zunächst 0. Der tmin den Wert als 2147483647 enthält, wie ursprünglich. Die Zeit wird von der vor dem Senden des Pakets berechnet, einmal notiert. Im Ziel wird das Paket empfangen, bevor es die Notiz einmal senden und es im Antwortpaket ausfüllen und es die Antwort sendet. Die beiden Zeiten werden subtrahiert und konvertieren diese subtrahierte Zeit in Mikrosekunden. Die Variable triptime enthält diese Mikrosekunden.

Nehmen Sie zum Beispiel die folgende Ausgabe für die Berechnung der RTT.

Die Auslösezeit für das erste Paket ist 42573, und die zweite Paket 43707, 48047 drittes Paket und vierte Paket 42559.

dieser Verwendung, wie sie die Umlaufzeit berechnen. Warum multiplizieren sie mit 8 im Start und danach teilen sie sich mit 8 und subtrahieren mit dem ersten RTT. Ich kann nicht herausfinden, warum sie das RTT so berechnen. Kann mir bitte jemand erklären, warum sie mit 8 multiplizieren, wenn sie beginnen und danach, warum sie mit 8 teilen und mit dem vorher berechneten rtt subtrahieren. Der folgende Link enthält den vollständigen Code für die Ping-Implementierung.

ping_common.c

ping.c

Vielen Dank im Voraus.

+1

Ich denke, es ist ein Weg, um einen Durchschnitt von akkumulierten 8 Werte zu tun. Das erste Paket ist die Initialisierung des durchschnittlichen Akkumulators ('triptime * 8'). Danach wird nur die Variation (Differenz) zum letzten berechneten Durchschnitt addiert. – LPs

+0

BTW wie üblich für Linux Mudules: schamlos Mangel an Kommentaren, jedes Mal ein überall ... – LPs

Antwort

-1

Weil Sie mit Bits beschäftigen. Die Bitrate und die Übertragungszeit sind nicht die gleichen, also müssen Sie ein kleines bisschen Arithmetik zum Konvertieren verwenden. Die Formel lautet:

Paketübertragungszeit = Paketgröße/Bitrate

unter der Annahme, also 100 Mbit/s und eine Paketgröße von 1.526 Bytes, erhalten Sie:

1526 Bytes x 8 Bits/(100 x 10 6 Bits/Sekunde)) = 116 Mikrosekunden

Die Biteinheit aufhebt ou t und Sie sind mit Sekunden übrig.

Jetzt ist hier ein anderes Beispiel. Angenommen, Sie haben eine Umlaufzeit von 225 Millisekunden und der Durchsatz beträgt 32 Kilobyte. Sie erhalten:

32.000 Bytes * 8 Bits/0.255 = 1.003.921 Bits pro Sekunde

+1

'Ping' ist nicht mit Übertragungsraten betroffen. –

+0

Ich habe nicht nach der Übertragungsrate gefragt. Bitte lesen Sie die Frage noch einmal. –

0

rtt ist Modified Moving Average von triptime Werten von 8 für eine einfache Berechnung multipliziert mit N==8.

+0

Die Formel ist so etwas wie 'RTT_new = RTT_old * 7/8 + triptime * 1/8'. Der 'rtt' in Ihrem Code ist' RTT_new * 8', um eine Division zu speichern. Sehen Sie sich auch [RFC6298] (https://tools.ietf.org/html/rfc6298) an. –

+0

warum sie mit 8 multipliziert und warum nicht 16 oder eine andere Zahl? –

+0

Was ist die Verwendung von 8 hier? –

0

rtt in der Programmvariablen Name ist nicht unbedingt rtt in der Ausgabe - Und hier ist es nicht.

Die 'durchschnittliche Roundtrip-Verzögerung' in der Implementierung, die Sie anzeigen, ist in tsum/Anzahl der Pakete. Wenn Sie sich rtt ansehen, sehen Sie tatsächlich etwas anderes. Dies wird nur angezeigt, wenn Sie ping im adaptiven Modus verwenden.

+0

In der Ping-Statistik gibt es ein einziges Feld namens rtt. Im obigen Code berechnen sie die rtt. Ich brauche die Antwort für was ist die Formel zur Berechnung der RTT? –

+0

Und ich habe Ihnen gerade gesagt, dass die Ausgabe der Ping-Statistik, die als "rtt" bezeichnet wird, nicht dasselbe ist wie die Variable "rtt" – tofro

Verwandte Themen