Liczenie retransmisji TCP w pyshark

10

O ile mi wiadomo, pyshark to otoki Pythona dla tshark, który jest wersją Wiresharka w wierszu poleceń. Ponieważ Wireshark i tshark pozwalają wykryć retransmisję TCP, zastanawiałem się, jak to zrobić za pomocą pyshark. Nie znalazłem żadnej dobrej dokumentacji, więc nie jestem pewien, czy nie możesz tego po prostu zrobić, czy też nie mogę znaleźć właściwej drogi. Dziękuję Ci!

użytkownik1315621
źródło
Czy przez „wykrywanie transmisji TCP” rozumiesz, czy w ogóle widzisz pakiet TCP? Czy masz na myśli coś bardziej szczegółowego, na przykład TCP, ale dla określonych zdalnych hostów / postów?
Ross Jacobs
Moja wiedza na temat systemów telekomunikacyjnych jest nieco zardzewiała. Chciałbym wykryć (lub oszacować) liczbę pakietów utraconych zarówno w kierunku wychodzącym, jak i przychodzącym. Czy to wyjaśnia?
user1315621,
2
Możesz użyć filtra wyświetlania tcp.analysis.retransmission, którego można używać zarówno z Wireshark, jak i PyShark. W przeciwnym razie możesz zadać pytanie (z szerszym kontekstem) na forum Wireshark, jeśli potrzebujesz pomocy w korzystaniu z Wireshark lub Server Fault, jeśli chcesz pomóc w śledzeniu strat.
Ross Jacobs,
Myślę, że tcp.analysis.retransmission prawdopodobnie działałoby dobrze. Ale czy możesz podać mi przykład w PyShark, jak go używać?
user1315621,
Ten artykuł na temat interakcji z Wireshark za pomocą Pyshark jest o tym, co mogę znaleźć najbliżej twojego pytania.
Linny,

Odpowiedzi:

5

Poniższy kod wykrywa retransmisje TCP w 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)

Powinien wyświetlać to w pakietach:

# 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

Jeśli dodasz only_summaries = True w LiveCapture , zobaczysz coś takiego:

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

Możesz także filtrować te pakiety bardziej szczegółowo, stosując filtr bpf_filter w LiveCapture, aby odfiltrować retransmisję 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)

Oto jeden ze sposobów na odczytanie pcap za pomocą 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: **********
Życie jest złożone
źródło
Dziękuję Ci! Czytam plik PCAP, więc wraz z twoim kodem powinienem go przeczytać dwa razy: pierwszy raz przetwarzam retransmitowane pakiety i drugi raz przetwarzam wszystkie pozostałe pakiety. Czy jest jakieś rozwiązanie?
user1315621,
Zaktualizowałem kod, aby odczytać plik pcap i filtrować retransmisje.
Życie jest złożone
Chodzi o to, że jeśli wydrukuję wszystkie pakiety (bez filtra podczas odczytu), mogę znaleźć niektóre retransmitowane pakiety, drukując je. Na przykład packet.summary_line zwraca „2 4.1e-05 175.45.176.3 149.171.126.16 TCP 77 [Retransmisja TCP] 22592 \\ xe2 \\ x86 \\ x92 143 [PSH, ACK] Seq = 1 Ack = 1 Win = 16383 Len = 21 ". Dlatego przypuszczam, że powinien istnieć atrybut pakietu, który mówi, że jest to możliwa retransmisja.
user1315621,
Mój pcap ma je pod Flagami analizy TCP. Czy używasz mojego kodu przykładowego do zapytania pliku?
Życie jest złożone
1
@ user1315621 - Jeśli Twoje przechwycenie ma zasadnicze znaczenie dla pytania, powinieneś edytować swój post, dołączając link do przechwytywania i zmodyfikować pytanie. W przeciwnym razie oznaczę tę odpowiedź jako zaakceptowaną, ponieważ odpowiada ona na pytanie, które jest obecnie opublikowane .
Ross Jacobs