Подсчет ретрансляции TCP в пышарк


10

Насколько я знаю, pyshark - это оболочка Python для tshark, которая является версией Wireshark для командной строки. Поскольку Wireshark и tshark позволяют обнаруживать ретрансляцию TCP, мне было интересно, как я могу это сделать с помощью pyshark. Я не нашел хорошей документации, поэтому я не уверен, что вы не можете просто сделать это, или я просто не могу найти правильный путь. Спасибо!


Под «обнаружением передачи по TCP» подразумевается ли просто просмотр пакета TCP? Или вы имеете в виду нечто более конкретное, например, TCP, но для определенных удаленных хостов / постов?
— Росс Джейкобс

Мои знания о телекоммуникационных системах немного ржавые. Я хотел бы определить (или оценить) количество потерянных пакетов как в исходящем, так и во входящем направлении. Это проясняет?
— user1315621

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

Я думаю, что tcp.analysis.retransmission, вероятно, будет работать нормально. Но можете ли вы дать мне пример в PyShark о том, как его использовать?
— user1315621

Эта статья о взаимодействии с Wireshark с помощью Pyshark является наиболее близкой к вашему вопросу.
— Линни

Ответы:


5

Код ниже обнаруживает повторные передачи TCP в 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)

Это должно отображать это в пакетах:

# 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, поэтому с вашим кодом я должен прочитать его дважды: первый раз для обработки повторно переданных пакетов и второй раз для обработки всех других пакетов. Есть ли решение?
— user1315621

Я обновил код, чтобы прочитать файл 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 Len = 21 ". Поэтому я предполагаю, что должен быть атрибут пакета, который говорит, что это возможная повторная передача.
— user1315621

Мой pcap имеет их под флагами анализа TCP. Вы используете мой пример кода для запроса вашего файла?
— Жизнь сложна

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