[LINUX] Einwegverzögerungsmessung des Netzwerks mit Python

Motivation

Bei internationaler Kommunikation mit großen Verzögerungen und Schwankungen möchte ich herausfinden, ob sich die Hin- oder Rückreise auf die Kommunikation auswirkt. Ich möchte die Hin- und Rückrouten getrennt messen, anstatt die RTT-Verzögerung durch Ping zu messen. Der Grund, warum eine Einwegverzögerung derzeit schwierig ist, besteht darin, dass die Zeiten der beiden zu messenden Knoten genau synchronisiert werden müssen. Da die internationale Leitung wie diese Zeit jedoch RTT 100 ms hat, ist die nächste NTP-Synchronisation gut. Es wird angenommen, dass der Fehler höchstens einige ms beträgt, die theoretisch kürzeste Einwegverzögerung geschätzt werden kann und der NTP-Synchronisationsabweichungswert bis zu einem gewissen Grad daraus geschätzt werden kann. In Anbetracht des Verarbeitungsaufwands sollte es auch nicht von einem Skript verarbeitet werden. Wenn es sich jedoch um ein Skript handelt, verursacht es bei einem aktuellen Server keinen Fehler von 1 ms. Daher habe ich mich für einfaches Python entschieden. Um es einfach auszudrücken: "Grob herausschneiden"

Methode

1 Roundtrip-Aktualisierungspaket zwischen Client und Server

  1. Der Client (a) speichert die Startzeit und fragt den Server nach der Paketankunftszeit ab.
  2. Der Server (b) gibt die Zeit zurück, zu der das Paket an den Client empfangen wurde.
  3. Der Client (c) zeichnet die Zeit auf, zu der er die Antwort vom Server erhalten hat
  4. (b) - (a) = ausgehende Verzögerung / (c) - (b) = eingehende Verzögerung

Code (Minimum)

Server

owpingserver.py


#!/usr/bin/env python

import socket
import time

host = '0.0.0.0'
port = 12345
bufsize = 512

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host,port))
while True:
   data,addr = sock.recvfrom(bufsize)
   sock.sendto("%.6f" % time.time(), addr)

Client

owpingclient.py


#!/usr/bin/env python

import socket
import time

host = 'localhost' #Geben Sie vorerst Ihre eigene IP an
port = 12345
bufsize = 512

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
stime = "%.6f" % time.time()
sock.sendto(stime, (socket.gethostbyname(host), port))
data, addr = sock.recvfrom(bufsize)
etime = "%.6f" % time.time()

print  "forward : " + str(float(data) - float(stime))
print  "backward: " + str(float(etime) - float(data))
print  "total:    " + str(float(etime) - float(stime))

time.sleep(1)
sock.close()

Eigentlich ist Pakeros auch schrecklich, daher sind Wiederholungs- und Timeout-Verarbeitung erforderlich, und ich habe es mit einer Ausgabe implementiert, die etwas einfacher zu handhaben ist, aber ich habe es jetzt weggelassen.

Vorerst auf lokalem Host ausführen

Wird im selben Host (localhost) durchgeführt

$ python owpingserver.py &
$ python owpingclient.py
forward : 0.000324964523315
backward: 4.81605529785e-05
total:    0.000373125076294

$ ping localhost -c 1
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.017 ms

--- localhost ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.017/0.017/0.017/0.000 ms

Es ist mindestens eine Größenordnung weniger genau als Ping. .. .. Hauptsächlich ist der ausgehende Overhead hoch. Nun, der Unterschied in der Genauigkeit zwischen 10 μs und 100 μs ist fast wie erwartet. Sie können es auf internationalen Linien ignorieren. (Aufgeben ist wichtig)

Messergebnisse auf tatsächlichen internationalen Linien

Blaue Linie: Hin- und Rückfahrt, orange: ausgehend, grün: eingehend. Sie können es etwa einen halben Tag lang im Batch ausführen und als Grafik lesen

  1. Offensichtlich ist die Auswirkung der ausgehenden Verzögerung auf die RTT-Verzögerung enorm
  2. Die geografische Route ist (sollte) fast gleich, und ich bin der Meinung, dass 15 ms in eine Richtung etwas kurz sind, sodass die Knotenzeit um bis zu 3 ms verschoben werden kann.
  3. Was mache ich seit dem frühen Morgen der Ferien? image

Übrigens, als ich es auf verschiedenen Instanzen desselben Rechenzentrums ausprobierte, kam die zukünftige Zeit ungefähr 1 Mikrosekunde zurück.

Nachtrag

26.02.2017: Ich habe den entsprechenden Code in C geschrieben, aber er hat sich um ca. 150 μs verringert. Es hat sich nicht so sehr verbessert, wie ich erwartet hatte. Python ist vorerst in Ordnung.

Recommended Posts

Einwegverzögerungsmessung des Netzwerks mit Python
Netzwerkprogrammierung mit Python Scapy
Neuronales Netzwerk mit OpenCV 3 und Python 3
3. Verarbeitung natürlicher Sprache durch Python 2-1. Netzwerk für das gleichzeitige Auftreten
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Python mit Go
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
3. Verarbeitung natürlicher Sprache durch Python 2-2. Koexistenznetzwerk [mecab-ipadic-NEologd]
Generierung der Vorlagen-Netzwerkkonfiguration mit Python und Jinja2
Serielle Kommunikation mit Python
Zip, entpacken mit Python
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Sequentielle Suche mit Python
"Objektorientiert" mit Python gelernt
Führen Sie Python mit VBA aus
Löse AtCoder 167 mit Python
Serielle Kommunikation mit Python
[Python] Verwenden Sie JSON mit Python
Lerne Python mit ChemTHEATER
Führen Sie prepDE.py mit python3 aus
Tweets mit Python sammeln
3. 3. KI-Programmierung mit Python
Kernel-Methode mit Python
Nicht blockierend mit Python + uWSGI
Scraping mit Python + PhantomJS
Versuchen Sie, assoziativen Speicher durch Hop-Field-Netzwerk in Python zu implementieren
Tweets mit Python posten
Fahren Sie WebDriver mit Python
Verwenden Sie Mecab mit Python 3
[Python] Mit CGIHTTPServer umleiten
Sprachanalyse mit Python
Denken Sie an Yaml mit Python
Kinesis mit Python betreiben
Erste Schritte mit Python
Verwenden Sie DynamoDB mit Python
Zundko Getter mit Python
Behandle Excel mit Python
Ohmsches Gesetz mit Python
Primzahlbeurteilung mit Python