Conteggio della ritrasmissione TCP in pyshark


10

Per quanto ne so pyshark è un wrapper Python per tshark che è la versione da riga di comando di Wireshark. Dato che Wireshark e tshark consentono di rilevare la ritrasmissione TCP, mi chiedevo come avrei potuto farlo usando pyshark. Non ho trovato alcuna buona documentazione, quindi non sono sicuro che non puoi semplicemente farlo o se non riesco a trovare la strada giusta. Grazie!


"Rileva la trasmissione TCP", intendi solo vedere se un pacchetto TCP è visto? O intendi qualcosa di più specifico come TCP, ma per host / post remoti specifici?
— Ross Jacobs,

La mia conoscenza dei sistemi di telecomunicazione è un po 'arrugginita. Vorrei rilevare (o stimare) il numero di pacchetti persi in entrambe le direzioni. Ciò chiarisce?
— user1315621

2
È possibile utilizzare il filtro di visualizzazione tcp.analysis.retransmission, che può essere utilizzato con Wireshark e PyShark. In caso contrario, potresti voler porre la tua domanda (con più contesto) sul forum di Wireshark se desideri aiuto per sfruttare Wireshark o Server Fault se vuoi aiutare a rintracciare la perdita.
— Ross Jacobs,

Penso che tcp.analysis.retransmission probabilmente funzionerebbe bene. Ma puoi fornirmi un esempio in PyShark su come usarlo?
— user1315621

Questo articolo sull'interazione con Wireshark usando Pyshark è il più vicino che ho trovato alla tua domanda.
— Linny,

Risposte:


5

Il codice seguente rileva le ritrasmissioni TCP 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)

Dovrebbe visualizzarlo nei pacchetti:

# 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

Se includi only_summaries = True in LiveCapture vedresti qualcosa del genere:

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

È inoltre possibile filtrare questi pacchetti in modo più specifico applicando bpf_filter in LiveCapture per filtrare la ritrasmissione 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)

Ecco un modo per leggere un pcap con 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: **********

Grazie! Sto leggendo un file PCAP, quindi con il tuo codice dovrei leggerlo due volte: la prima volta per elaborare i pacchetti ritrasmessi e la seconda volta per elaborare tutti gli altri pacchetti. C'è una soluzione?
— user1315621

Ho aggiornato il codice per leggere un file pcap e filtrare le ritrasmissioni.
— vita è complessa il

Il fatto è che se stampo tutti i pacchetti (senza alcun filtro durante la lettura), posso trovare alcuni pacchetti ritrasmessi stampando i pacchetti. Ad esempio, packet.summary_line, restituisce "2 4.1e-05 175.45.176.3 149.171.126.16 TCP 77 [Ritrasmissione TCP] 22592 \\ xe2 \\ x86 \\ x92 143 [PSH, ACK] Seq = 1 Ack = 1 Win = 1 Win = 16383 Len = 21 ". Pertanto suppongo che ci dovrebbe essere un attributo del pacchetto che dice che si tratta di una possibile ritrasmissione.
— user1315621

Il mio pcap ha questi sotto Flag di analisi TCP. Stai usando il mio esempio di codice per interrogare il tuo file?
— vita è complessa il

1
@ user1315621 - Se l'acquisizione è fondamentale per la domanda, è necessario modificare il post per includere un collegamento all'acquisizione e modificare la domanda. Altrimenti, contrassegnerei questa risposta come accettata perché risponde alla domanda che è attualmente pubblicata .
— Ross Jacobs,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.