1
votes

Pyshark packet.tcp.analysis_ack_rtt n'est pas toujours disponible

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.


0 commentaires

3 Réponses :


0
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires