Compter la retransmission TCP dans pyshark

10

Pour autant que je sache, pyshark est un wrapper Python pour tshark qui est la version en ligne de commande de Wireshark. Étant donné que Wireshark et tshark permettent de détecter la retransmission TCP, je me demandais comment je pouvais le faire en utilisant pyshark. Je n'ai pas trouvé de bonne documentation, donc je ne sais pas si vous ne pouvez pas simplement faire cela, ou si je ne peux pas trouver la bonne façon. Je vous remercie!

user1315621
la source
Par «détecter la transmission TCP», voulez-vous simplement voir si un paquet TCP est vu du tout? Ou voulez-vous dire quelque chose de plus spécifique comme TCP, mais pour des hôtes / publications distants spécifiques?
Ross Jacobs
Ma connaissance des systèmes de télécommunication est un peu rouillée. Je voudrais détecter (ou estimer) le nombre de paquets perdus dans les directions sortantes et entrantes. Est-ce que cela clarifie?
user1315621
2
Vous pouvez utiliser le filtre d'affichage tcp.analysis.retransmission, qui peut être utilisé avec Wireshark et PyShark. À défaut, vous souhaiterez peut-être poser votre question (avec plus de contexte) sur le forum de Wireshark si vous souhaitez vous aider à tirer parti de Wireshark ou de la défaillance du serveur si vous souhaitez aider à localiser la perte.
Ross Jacobs
Je pense que tcp.analysis.retransmission fonctionnerait probablement très bien. Mais pouvez-vous me donner un exemple dans PyShark sur la façon de l'utiliser?
user1315621
Cet article sur l'interaction avec Wireshark à l'aide de Pyshark est à peu près le plus proche de votre question.
Linny

Réponses:

5

Le code ci-dessous détecte les retransmissions TCP dans 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)

Il devrait afficher cela dans les paquets:

# 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

Si vous incluez only_summaries = True dans LiveCapture, vous verrez quelque chose comme ceci:

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

Vous pouvez également filtrer ces paquets plus spécifiquement en appliquant le bpf_filter dans LiveCapture pour filtrer la retransmission TCP.

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)

Voici une façon de lire un pcap avec pyshark:

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: **********
La vie est complexe
la source
Je vous remercie! Je lis un fichier PCAP donc avec votre code, je devrais le lire deux fois: la première fois pour traiter les paquets retransmis et la deuxième fois pour traiter tous les autres paquets. Y a-t-il une solution?
user1315621
J'ai mis à jour le code pour lire un fichier pcap et filtrer les retransmissions.
vie est complexe
Le fait est que si j'imprime tous les paquets (sans aucun filtre lors de la lecture), je peux trouver des paquets retransmis en imprimant les paquets. Par exemple, packet.summary_line, renvoie "2 4.1e-05 175.45.176.3 149.171.126.16 TCP 77 [Retransmission TCP] 22592 \\ xe2 \\ x86 \\ x92 143 [PSH, ACK] Seq = 1 Ack = 1 Win = 16383 Len = 21 ". Par conséquent, je suppose qu'il devrait y avoir un attribut du paquet qui indique qu'il s'agit d'une retransmission possible.
user1315621
Mon pcap les a sous les drapeaux d'analyse TCP. Utilisez-vous mon exemple de code pour interroger votre fichier?
vie est complexe
1
@ user1315621 - Si votre capture est essentielle à la question, vous devez modifier votre message pour inclure un lien vers la capture et modifier votre question. Sinon, je marquerais cette réponse comme acceptée car elle répond à la question actuellement affichée .
Ross Jacobs