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

10

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

user1315621
источник
Под «обнаружением передачи по 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 - Если ваш захват имеет решающее значение для вопроса, вы должны отредактировать свое сообщение, чтобы включить ссылку на захват и изменить свой вопрос. В противном случае я бы пометил этот ответ как принятый, поскольку он отвечает на вопрос, который в данный момент размещен .
Росс Джейкобс