1. Kompilierung und Installation von Packetdrill
/* Setzen Sie die Offload-Flags wie bei einem typischen Ethernet-Gerät */ statisches void set_device_offload_flags(Struktur local_netdev *netdev) { #ifdef linux // const u32 offload = // TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | TUN_F_TSO_ECN | TUN_F_UFO; // wenn (ioctl(netdev->tun_fd, TUNSETOFFLOAD, offload) != 0) // die_perror("TUNSETOFFLOAD"); #endif } ./konfigurieren && make Anwendung ./packetdrill test.pkt test.pkt ist ein Testskript, das in der Packetdrill-Syntax geschrieben ist. Erfolg: Keine Ausgabe, was darauf hinweist, dass das Skript korrekt ist und alles wie erwartet ist. Fehler: Gibt an, wo und warum das Skript fehlgeschlagen ist. 2. Packetdrill führt seine eigenen Testfälle aus
// Schnelle Neuübertragung mit 4 ausstehenden Paketen testen, Empfänger sendet SACKs. // In dieser Variante unterstützt der Empfänger SACK. // Eine Verbindung herstellen. 0 Socket (..., SOCK_STREAM, IPPROTO_TCP) = 3 +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 +0 bind(3, ..., ...) = 0 +0 hören(3, 1) = 0 //Drei-Wege-Handshake+0 < S 0:0(0) win 32792 <mss 1000,sackOK,nop,nop,nop,wscale 7> +0 > S. 0:0(0) ack 1 <...> +.1 < . 1:1(0) ack 1 Sieg 257 +0 akzeptieren(3, ..., ...) = 4 // Systemaufruf, lass den Protokollstapel 100 Bytes senden. // Sende 1 Datensegment und erhalte eine ACK, also ist cwnd jetzt 4. +0 schreiben(4, ..., 1000) = 1000 //Der Protokollstapel soll psh, ack senden, sendet aber tatsächlich ack1 //+0 > P.1:1001(1000) ack 2 // ACK in den Protokollstapel einfügen +.1 < . 1:1(0) ack 1001 Gewinn 257 // 4 Datensegmente schreiben. //Systemaufruf, lass den Protokollstapel 4000 Bytes senden + 0 write(4, ..., 4000) = 4000 //Der Protokollstapel soll psh, ack senden, aber er sendet tatsächlich seq 1001:2001, ack 1; seq 2001:3001, ack 1; seq 3001:4001, ack 1; [P.], seq 4001:5001, ack 1 //+0 > P.1001:5001(4000) ack 1 // Hol dir 3 SACKS. //Sende drei Bestätigungen nacheinander an den Protokollstapel +.1 < . 1:1(0) ack 1001 win 257 <sack 2001:3001,nop,nop> +0 < . 1:1(0) ack 1001 win 257 <sack 2001:4001,nop,nop> +0 < . 1:1(0) ack 1001 win 257 <sack 2001:5001,nop,nop> // Wir haben 3 doppelte ACKs erhalten, also führen wir eine schnelle erneute Übertragung durch. //Der Protokollstapel soll eine schnelle Neuübertragung Seq 1001:2001, ack 1 ausgeben. //+0 > . 1001:2001(1000) ack 1 // Der Empfänger bestätigt alle Daten. //ACK an den Protokollstapel und auf die ACK aller Nachrichten antworten. +.1 < . 1:1(0) ack 6001 Gewinn 257 4. Ändern Sie fr-4pkt-sack-linux.pkt wie folgt. +0 > P. 1:1001(1000) Bestätigung 2 +0 > P. 1:1001(1000) Bestätigung 1 //+0 > P.1001:5001(4000) ack 1 +0 > . 1001:2001(1000) ack 1 +0 > . 2001:3001(1000) ack 1 +0 > . 3001:4001(1000) Bestätigung 1 +0 > S. 4001:5001(1000) ack 1 [Hinweis: Wenn beim Ausführen des von Packetdrill bereitgestellten Testfalls ein Fehler auftritt, liegt dies normalerweise daran, dass das vom Protokollstapel gesendete Paket nicht dem erwarteten Paket entspricht. Eliminieren Sie zuerst den Teil, der größer als der erwartete ist, führen Sie dann den Testfall aus und analysieren Sie anschließend das erwartete Ergebnis, indem Sie das Paket erfassen. Normalerweise aufgrund der Einschränkung des Drei-Wege-Handshakes mss]
// Erstellen Sie das Paket selbst, um drei wiederholte 1001-Acks zu implementieren. 07:57:36.469280 IP 192.0.2.1.36840 > TENCENT64.site.webcache: Flags [.], ack 1001, win 257, Optionen [sack 1 {2001:3001},nop,nop], Länge 0 07:57:36.469836 IP 192.0.2.1.36840 > TENCENT64.site.webcache: Flags [.], ack 1001, win 257, Optionen [sack 1 {2001:4001},nop,nop], Länge 0 07:57:36.470349 IP 192.0.2.1.36840 > TENCENT64.site.webcache: Flags [.], ack 1001, win 257, Optionen [sack 1 {2001:5001},nop,nop], Länge 0 // Der Protokollstapel leitet eine schnelle erneute Übertragung ein. Sequenz 1001:2001,ack 1,1000 07:57:36.470376 IP TENCENT64.site.webcache > 192.0.2.1.36840: Flags [.], Sequenz 1001:2001, Ack 1, Win 229, Länge 1000 3. Packetdrill erklärt seine eigene Testfallbeschreibung Hier erklären wir hauptsächlich die grundlegende Syntax von Packetdrill. Ein Skript kann vier Arten von Anweisungen enthalten: Datenpakete, Systemaufrufe, Shell-Befehle und Python-Anweisungen.
Datenpakete werden unterteilt in: Eingabedatenpakete und Ausgabedatenpakete, das Format ähnelt tcpdump, Eingabedatenpaket (< bedeutet Eingabe): Packetdrill erstellt ein echtes Datenpaket und fügt es dann in den Protokollstapel ein. Beispiel: 0,100 < S 0:0(0) Gewinn 32792 <mss 1000, nop, nop, sackOK, nop, wscale 7> 0,250 < [1:1461(1460)] ICMP nicht erreichbar frag_needed MTU 1200 Datenpaket ausgeben (> bedeutet Ausgabe): packetdrill prüft, ob der Protokollstapel tatsächlich ein solches Paket sendet. +0 > udp (1472)
Das Format der Systemaufrufe ähnelt strace. Beispiele für gängige Systemaufrufe: connect(3, ..., ...) = -1 EINPROGRESS (Operation wird gerade ausgeführt) //Client stellt Verbindung zum Server her getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 //Holen Sie sich socketopt fcntl(3, F_SETFL, O_RDWR) = 0 //Fcntl-Einstellungen ioctl(4, SIOCINQ, [1000]) = 0 //Ioctl-Einstellungen read(3, ..., 1024) = 785 //Daten lesen write(3, ..., 57) = 57 //Daten schreiben close(3) = 0 //Verbindung schließen socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 //TCP-Socket setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 //Adresse wiederverwenden bind(3, ..., ...) = 0 //Port binden listen(3, 1) = 0 //Port abhören accept(3, ..., ...) = 4 //Verbindung akzeptieren
Üblicherweise werden Shell-Skripte zum Festlegen von Kernel-Parametern oder zum Aufrufen von Shell-Befehlen zum Erfassen von TCP-Statistiken verwendet. aufstellen Beispiel: +0 `sysctl -q net.ipv4.tcp_timestamps=0` +0 `ss -4 -n status SYN-RECV | grep 192.168.0.1:8080 > /dev/null`
Eine häufige Verwendung besteht darin, die Assert-Funktion von Python zu verwenden, um festzustellen, ob die Informationen in tcp_info den Erwartungen entsprechen. Beispiel: 0,310 % behaupten tcpi_reordering == 3 behaupten tcpi_unacked == 10 behaupten tcpi_sacked == 6 behaupten tcpi_ca_state == TCP_CA_Recovery }%
Jede Anweisung muss mit einem Zeitstempel beginnen, der angibt, wann sie ausgeführt wurde oder wann mit dem Eintreten eines Ereignisses zu rechnen ist. Der Testfall kann aufgrund von Zeitproblemen fehlschlagen. Zeitstempel können verschiedene Formate verwenden: Absolut: 0,75 Relativ: +0,2 Platzhalter (jederzeit):* Bereich (absolutes Zeitintervall): 0,750 ~ 0,900 Relativer Bereich: +0,1~+0,2 Lose (zulässiger Fehlerwert): --tolerance_usecs=800 Sperrung (Sperrzeitintervall): 0,750...0,900 Tritt das entsprechende Ereignis nicht zum angegebenen Zeitstempel auf, wird ein Fehler gemeldet und der tatsächliche Zeitpunkt des Auftretens des Ereignisses mitgeteilt. +1.0 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 6> Es wird erwartet, dass TCP nach 1 Sekunde ein SYNACK-Paket sendet. In der Praxis wird im Allgemeinen –tolerance_usecs=405000 angegeben, was bedeutet, dass ein Zeitfehler von 4 ms zulässig ist. 4. Packetdrill implementiert einen grundlegenden Szenario-Konstruktionstest Die Szenenstruktur einer Szene ist entweder eine Client-Szene oder eine Server-Szene. Einzelheiten zum Erstellen eines bestimmten Pakets finden Sie in den Testfällen, die mit Packetdrill geliefert werden. 1. Server-Szenario Erstellen Sie das serverseitige Szenario: Das Datenpaket-Eingabeende ist der Client. Das Ende der Paketausgabe ist der Systemaufruf, der als Server fungiert. // Eine Verbindung herstellen. 0,000 Socket (..., SOCK_STREAM, IPPROTO_TCP) = 3 0,000 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 0,000 bind(3, ..., ...) = 0 0,000 listen(3, 1) = 0 0,000 ... 0,200 akzeptieren (3, ..., ...) = 4 0,100 < S 0:0(0) Gewinn 32792 <mss 1000,nop,wscale 7> 0,100 > S. 0:0(0) ack 1 <mss 1460,nop,wscale 6> 0,200 < . 1:1(0) ack 1 Sieg 257 //Der Server ruft den Systemaufruf auf und erwartet, 2 Pakete zu senden. 0,300 schreiben(4, ..., 2000) = 2000 //0,300 > S. 1:2001(2000) ack 1 0,300 > . 1:1001(1000) Bestätigung 1 0,300 > S. 1001:2001(1000) Bestätigung 1 1. Aufbau der Kundenszene Konstruieren Sie das serverseitige Szenario: Das Datenpaket-Eingabeende ist das Serverende. Das Ende der Paketausgabe ist der Systemaufruf, der als Client fungiert. // Erstellen Sie einen Socket und stellen Sie ihn auf nicht blockierend ein. 0,000 Socket (..., SOCK_STREAM, IPPROTO_TCP) = 3 0,000 fcntl(3, F_GETFL) = 0x2 (Flags O_RDWR) 0,000 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 // Verbindung herstellen und prüfen, dass kein Fehler aufgetreten ist. 0.100 connect(3, ..., ...) = -1 EINPROGRESS (Operation wird gerade ausgeführt) 0,100 > S 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 6> 0,200 < S. 0:0(0) ack 1 win 5792 <mss 1460,sackOK,TS val 700 ecr 100,nop,wscale 7> 0,200 > . 1:1(0) ack 1 <nop,nop,TS val 200 ecr 700> //Der Client ruft den Systemaufruf auf und erwartet eine HTTP-Anfrage. // Senden Sie die HTTP-Anfrage. 0,200 schreiben(3, ..., 57) = 57 0,200 > S. 1:58(57) ack 1 <nop,nop,TS val 200 ecr 700> 0,300 < . 1:1(0) ack 58 win 92 <nop,nop,TS val 800 ecr 200> Zusammenfassen Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Wenn Sie mehr darüber erfahren möchten, schauen Sie sich bitte die folgenden Links an Das könnte Sie auch interessieren:
|
<<: Detaillierte Erklärung von JavaScript Reduce
>>: Lösung für das Problem, dass Emoji-Ausdrücke nicht in MySQL eingefügt werden können
1. Software-Einführung VirtualBox VirtualBox ist ...
<Vorlage> <div Klasse="App-Containe...
Anforderung: Bei der Anzeige von Daten in einer L...
Lassen Sie mich Ihnen ohne weitere Umschweife den...
Die Leistung Ihrer Website oder Ihres Dienstes hä...
zählen(*) erreichen 1. MyISAM: Speichert die Gesa...
In diesem Artikel wird der spezifische Code von V...
Navigation, kleine Datenmenge Tabelle, zentriert &...
Datentyp: Die grundlegenden Regeln, die definiere...
1. Melden Sie sich mit dem IE-Browser beim VPN an...
Inhaltsverzeichnis Was ist Docker einsetzen 1. Zi...
1. Melden Sie sich bei der MySQL-Datenbank an mys...
Inhaltsverzeichnis Regelmäßig beschneiden Spiegel...
1. Einführung in Middleware 1. Grundlegende Konze...
In diesem Artikel werden MySQL-Protokolle sowie B...