Zählen der TCP-Neuübertragung in Pyshark

10

Soweit ich weiß, ist pyshark ein Python-Wrapper für tshark, die Befehlszeilenversion von Wireshark. Da Wireshark und tshark die Erkennung von TCP-Neuübertragungen ermöglichen, habe ich mich gefragt, wie ich dies mit Pyshark erreichen kann. Ich habe keine gute Dokumentation gefunden, daher bin ich mir nicht sicher, ob Sie das nicht einfach tun können oder ob ich einfach nicht den richtigen Weg finde. Vielen Dank!

user1315621
quelle
Wollen Sie mit "TCP-Übertragung erkennen" nur sehen, ob überhaupt ein TCP-Paket gesehen wird? Oder meinst du etwas Spezifischeres wie TCP, aber für bestimmte Remote-Hosts / Posts?
Ross Jacobs
Mein Wissen über Telekommunikationssysteme ist etwas verrostet. Ich möchte die Anzahl der Pakete, die sowohl in ausgehender als auch in eingehender Richtung verloren gehen, ermitteln (oder schätzen). Klärt das?
user1315621
2
Sie können den Anzeigefilter verwenden tcp.analysis.retransmission, der sowohl mit Wireshark als auch mit PyShark verwendet werden kann. Andernfalls möchten Sie möglicherweise Ihre Frage (mit mehr Kontext) im Wireshark-Forum stellen, wenn Sie Hilfe bei der Nutzung von Wireshark oder Server Fault benötigen, wenn Sie Hilfe beim Aufspüren des Verlusts benötigen.
Ross Jacobs
Ich denke, tcp.analysis.retransmission würde wahrscheinlich gut funktionieren. Aber können Sie mir in PyShark ein Beispiel zur Verwendung geben?
user1315621
Dieser Artikel über die Interaktion mit Wireshark über Pyshark befasst sich mit dem, was ich Ihrer Frage am nächsten kommen kann.
Linny

Antworten:

5

Der folgende Code erkennt TCP-Neuübertragungen in Pyshark

import pyshark

###################################################
# these filters can be applied under LiveCapture
# display_filter: A display (wireshark) filter to apply on the cap before reading it.
# display_filter='tcp.analysis.fast_retransmission'
# display_filter='tcp.analysis.retransmission'
###################################################
capture = pyshark.LiveCapture(interface='en1', display_filter='tcp.analysis.fast_retransmission')
capture.sniff(timeout=50)

for packet in capture.sniff_continuously(packet_count=5):
  print ('Just arrived:', packet)

Dies sollte in den Paketen angezeigt werden:

# display_filter='tcp.analysis.retransmission'
TCP Analysis Flags
Expert Info (Note/Sequence): This frame is a (suspected) retransmission
This frame is a (suspected) retransmission

# display_filter='tcp.analysis.fast_retransmission'
TCP Analysis Flags
This frame is a (suspected) fast retransmission
This frame is a (suspected) retransmission
Expert Info (Note/Sequence): This frame is a (suspected) fast retransmission
Expert Info (Note/Sequence): This frame is a (suspected) retransmission

Wenn Sie only_summaries = True in LiveCapture einfügen, wird Folgendes angezeigt :

Just arrived: 223 71.890878 fe80::cabc:c8ff:feec:d46d fe80::1416:1ca1:307c:b0e6 TCP 86 [TCP Spurious Retransmission] 59005 \xe2\x86\x92 49373 [FIN, ACK] Seq=1855 Ack=2365 Win=4096 Len=0 TSval=930665353 TSecr=692710576

Just arrived: 371 121.293913 fe80::1416:1ca1:307c:b0e6 fe80::cabc:c8ff:feec:d46d TCP 98 [TCP Retransmission] 62078 \xe2\x86\x92 59012 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1440 WS=64 TSval=692717653 TSecr=930714614 SACK_PERM=1

Sie können diese Pakete auch genauer filtern, indem Sie den bpf_filter in LiveCapture anwenden , um die TCP-Neuübertragung zu filtern.

import pyshark

capture = pyshark.LiveCapture(interface='en1', bpf_filter='ip and tcp port 443', display_filter='tcp.analysis.retransmission')
capture.sniff(timeout=50)

for packet in capture.sniff_continuously(packet_count=5):
  print ('Just arrived:', packet)

Hier ist eine Möglichkeit, eine PCAP mit Pyshark zu lesen:

capture = pyshark.FileCapture('test.pcap', display_filter='tcp.analysis.retransmission')
counter = 0
for packet in capture:
  counter +=1
  print ('*' * 10, f'Retransmission packet {counter}:', '*' * 10)
  # output 
  ********** Retransmission packet 1: **********
  ********** Retransmission packet 2: **********
  ********** Retransmission packet 3: **********
  ********** Retransmission packet 4: **********
  ********** Retransmission packet 5: **********
Das Leben ist komplex
quelle
Vielen Dank! Ich lese eine PCAP-Datei, daher sollte ich sie mit Ihrem Code zweimal lesen: das erste Mal, um die erneut übertragenen Pakete zu verarbeiten, und das zweite Mal, um alle anderen Pakete zu verarbeiten. Gibt es eine Lösung?
user1315621
Ich habe den Code aktualisiert, um eine PCAP-Datei zu lesen und die erneuten Übertragungen zu filtern.
Leben ist komplex
Die Sache ist, dass ich, wenn ich alle Pakete drucke (ohne Filter beim Lesen), einige erneut übertragene Pakete finden kann, indem ich die Pakete drucke. Beispielsweise gibt packet.summary_line "2 4.1e-05 175.45.176.3 149.171.126.16 TCP 77 [TCP-Neuübertragung] 22592 \\ xe2 \\ x86 \\ x92 143 [PSH, ACK] Seq = 1 Ack = 1 Win = zurück 16383 Len = 21 ". Daher sollte es ein Attribut des Pakets geben, das besagt, dass es sich um eine mögliche erneute Übertragung handelt.
user1315621
Mein PCAP hat diese unter TCP-Analyse-Flags. Verwenden Sie mein Codebeispiel, um Ihre Datei abzufragen?
Leben ist komplex
1
@ user1315621 - Wenn Ihre Erfassung für die Frage kritisch ist, sollten Sie Ihren Beitrag so bearbeiten , dass er einen Link zur Erfassung enthält, und Ihre Frage ändern. Andernfalls würde ich diese Antwort als akzeptiert markieren, da sie die aktuell gestellte Frage beantwortet .
Ross Jacobs