J'essaie d'utiliser Pyshark pour capturer le trafic sur une connexion TCP, pour déterminer des métriques telles que le RTT, le débit et la perte de paquets. Cependant, il semble que ces attributs ne sont pas toujours disponibles.
Je réussis à capturer des paquets, avec une couche TCP. Cependant, lors de l'accès à la valeur packet.tcp.analysis_ack_rtt, parfois une valeur est renvoyée, tandis que d'autres fois une AttributeError est levée.
capture = pyshark.LiveCapture(interface="eno1", bpf_filter="tcp and port 5201") for packet in capture.sniff_continuously(): print("RTT", packet.tcp.analysis_ack_rtt)
Je m'attendais en quelque sorte à ce que tous les paquets aient ce champ, et je ne vois pas pourquoi certains paquets le font alors que d'autres ne le font pas.
Par ailleurs, est-ce que quelqu'un sait comment accéder à tcp.analysis.lost_segment? Il semble que ce ne soit pas non plus un attribut des paquets.
3 Réponses :
Eh bien, je vois que vous écoutez sur l'interface Ethernet. Je dirais que la raison pour laquelle cela ne fonctionne pas est que tous les paquets ne seront pas tcp. D'où l'erreur. Je considérerais que vous faites un essai et attrapez (pour les erreurs d'attribut) et tout devrait bien se passer.
Voir ci-dessous:
import pyshark capture = pyshark.FileCapture(<path to pcap file>) for packet in capture: try: print("Protocol: "+ packet.highest_layer +"source:"+ packet.ip.src +" Destination:"+ packet.ip.dst +" RTT:"+ packet.tcp.analysis_ack_rtt) except AttributeError as e: pass
Le problème des références de couche dynamique est expliqué ici :
L'utilisation des attributs de couche dynamique que j'ai mentionnés précédemment nous donne une certaine flexibilité lors de l'analyse des paquets. Si vous essayez d'accéder à l'attribut pkt.dns.qry_resp de chaque paquet, vous recevrez une AttributeError si le paquet n'a pas d'informations DNS. Ceci s'applique également à la couche de transport, puisque chaque paquet aura une couche TCP ou UDP. Nous pouvons imprimer les adresses et les ports source et de destination (pour le mappage de conversation IP) et utiliser une boucle try / except pour nous protéger contre AttributeError si le paquet n'est ni TCP ni UDP
Vous avez probablement déjà résolu ce problème, mais j'ai pensé que je fournirais quand même une réponse, car je suis intéressé par pyshark et ses fonctionnalités.
Espérons que ces réponses vous seront utiles.
Exemple un
# Network interface used by TShark for live capture network_interface = 'en0' capture = pyshark.LiveCapture(interface='en0', display_filter='tcp.analysis.ack_rtt or tcp.analysis.lost_segment') capture.sniff(timeout=50) for raw_packet in capture.sniff_continuously(): try: source_address = raw_packet.ip.src source_port = raw_packet[raw_packet.transport_layer].srcport destination_address = raw_packet.ip.dst destination_port = raw_packet[raw_packet.transport_layer].dstport ack_rtt = raw_packet[raw_packet.transport_layer].analysis_ack_rtt # analysis_lost_segment can produce multiple messages: # # (1) 'tcp previous segment not captured. # This message is created when TShark didn't see a packet that should have been in the trace. # This warning was previously called "tcp previous segment lost" # # (2) 'Previous segment not captured (common at capture start)' # This means that on the receiver side you capture an outgoing ACK packet # for a sequence number where you haven't seen the respective segment. # This is common, as it might be possible that a segment arrived, # you started the capture and afterwards your TCP stack replied # with an ACK. So there was no way to see the incoming packet. # lost_segment = raw_packet[raw_packet.transport_layer].analysis_lost_segment print(f'Source Address: {source_address}\n' f'Source Port: {source_port}\n' f'Destination address: {destination_address}\n' f'Destination port: {destination_port}\n' f'RTT to ACK was: {ack_rtt} seconds\n' f'{lost_segment}\n') # PRINT OUTPUT Source Address: 192.168.86.35 Source Port: 64490 Destination address: 31.13.66.174 Destination port: 443 RTT to ACK was: 0.000162000 seconds Previous segment(s) not captured (common at capture start) except AttributeError as e: pass