Підрахунок повторної передачі TCP в писарці


10

Наскільки я знаю, pyshark - це обгортка Python для tshark, що є версією командного рядка Wireshark. Оскільки Wireshark і tshark дозволяють виявити ретрансляцію TCP, мені було цікаво, як я міг зробити це за допомогою pyshark. Я не знайшов жодної гарної документації, тому я не впевнений, ви можете просто не зробити це чи я просто не можу знайти належний спосіб. Дякую!


"Визначити передачу TCP", ви хочете мати на увазі просто побачити, чи бачиться пакет TCP взагалі? Або ви маєте на увазі щось більш конкретне, як TCP, але для конкретних віддалених хостів / постів?
Росс Джейкобс

Мої знання телекомунікаційних систем трохи іржаві. Я хотів би виявити (або оцінити) кількість пакетів, втрачених як у вихідному, так і вхідному напрямках. Це уточнює?
користувач1315621

2
Ви можете використовувати фільтр дисплея tcp.analysis.retransmission, який можна використовувати як з Wireshark, так і з PyShark. Якщо цього не зробити, ви можете поставити своє запитання (з більш широким контекстом) на форумі Wireshark, якщо ви хочете допомогти використовувати Wireshark або Server Fault, якщо ви хочете допомогти відстежувати втрати.
Росс Джейкобс

Я думаю, що tcp.analysis.retramis передаватиметься, напевно, добре. Але чи можете ви надати мені приклад в PyShark про те, як ним користуватися?
користувач1315621

Ця стаття про взаємодію з Wireshark за допомогою Pyshark розповідає про те, що я можу знайти до вашого питання.
Лінні

Відповіді:


5

Код нижче виявляє повторну передачу TCP у писарці

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)

Він повинен відображати це в пакетах:

# 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

Якщо ви включите only_summaries = True в LiveCapture, ви побачите щось подібне:

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

Ви також можете фільтрувати ці пакети більш конкретно, застосувавши bpf_filter в LiveCapture для фільтрування повторної передачі 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)

Ось один із способів прочитати pcap з 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: **********

Дякую! Я читаю файл PCAP, так що з вашим кодом, я повинен прочитати його двічі: перший раз обробляти повторно передані пакети та другий раз обробляти всі інші пакети. Чи є рішення?
користувач1315621

Я оновив код, щоб прочитати файл pcap і відфільтрувати повторні передачі.
Життя складна

Вся справа в тому, що якщо я надрукую всі пакети (без жодного фільтра під час читання), я можу знайти кілька повторно переданих пакетів, надрукувавши пакети. Наприклад, packet.summary_line, повертає "2 4.1e-05 175.45.176.3 149.171.126.16 TCP 77 [Повторна передача TCP] 22592 \\ xe2 \\ x86 \\ x92 143 [PSH, ACK] Seq = 1 Ack = 1 Win = 16383 Лен = 21 ". Тому я припускаю, що має бути атрибут пакету, який говорить про можливу повторну передачу.
користувач1315621

Мій pcap має це під прапорами аналізу TCP. Чи використовуєте ви мій приклад коду для запиту вашого файлу?
Життя складна

1
@ user1315621 - Якщо ваше захоплення є критичним для питання, вам слід відредагувати свою публікацію, щоб включити посилання на захоплення та змінити своє запитання. В іншому випадку я зазначив би цю відповідь прийнятою, оскільки вона відповідає на запитання, яке наразі розміщено .
Росс Джейкобс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.