在pyshark中计算TCP重传


10

据我所知pyshark是tshark的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

这篇关于使用Pyshark与Wireshark进行交互的文章是关于我能找到的最接近您的问题的文章。
林尼

Answers:


5

下面的代码检测pyshark中的 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 =真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

您还可以通过在LiveCapture中应用bpf_filter来更具体地过滤这些数据包,以过滤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)

这是用pyshark读取pcap的一种方法:

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 19-10-14

我更新了代码以读取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 Analysis Flags下有这些。您是否使用我的代码示例查询文件?
生活很复杂,

1
@ user1315621-如果捕获对问题至关重要,则应编辑帖子以包括捕获的链接并修改问题。否则,我会将此答案标记为已接受,因为它会回答当前发布的问题
罗斯雅各布
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.