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.