【问题标题】:Counting TCP retransmission in pyshark在pyshark中计算TCP重传
【发布时间】:2026-01-22 00:15:01
【问题描述】:

据我所知,pyshark 是 tshark 的 Python 包装器,它是 Wireshark 的命令行版本。 由于 Wireshark 和 tshark 允许检测 TCP 重传,我想知道如何使用 pyshark 来检测。我没有找到任何好的文档,所以我不确定你是否不能这样做,或者我是否找不到正确的方法。 谢谢!

【问题讨论】:

  • “检测 TCP 传输”,你的意思是仅仅查看是否看到了 TCP 数据包吗?或者你的意思是更具体的东西,比如 TCP,但针对特定的远程主机/帖子?
  • 我对电信系统的了解有点生疏。我想检测(或估计)在传出和传入方向丢失的数据包数量。这说明清楚了吗?
  • 您可以使用显示过滤器tcp.analysis.retransmission,它可以与Wireshark 和PyShark 一起使用。如果做不到这一点,您可能想在Wireshark's Forum 上询问您的问题(更多上下文),如果您需要帮助利用 Wireshark 或Server Fault,如果您需要帮助追踪损失。
  • 我认为 tcp.analysis.retransmission 可能会正常工作。但是你能给我提供一个 PyShark 中如何使用它的例子吗?
  • This article 关于使用 Pyshark 与 Wireshark 进行交互是我能找到的最接近您的问题。

标签: python tcp tshark pyshark


【解决方案1】:

下面的代码检测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

如果您在 LiveCapture 中包含 only_summaries=True,您会看到如下内容:

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 文件,因此使用您的代码,我应该读取它两次:第一次处理重新传输的数据包,第二次处理所有其他数据包。有解决办法吗?
  • 我更新了代码以读取 pcap 文件并过滤重传。
  • 问题是如果我打印所有的数据包(读取时没有任何过滤器),我可以通过打印数据包找到一些重传的数据包。例如,packet.summary_line,返回“ 2 4.1e-05 175.45.176.3 149.171.126.16 TCP 77 [TCP Retransmission] 22592 \\xe2\\x86\\x92 143 [PSH, ACK] Seq=1 Ack=1 Win= 16383 长度=21"。因此我想应该有一个数据包的属性告诉它可能是重传。
  • 我的 pcap 在 TCP 分析标志下有这些。你是在使用我的代码示例来查询你的文件吗?
  • @user1315621 - 如果您的捕获对问题至关重要,您应该edit 您的帖子包含捕获链接并修改您的问题。否则,我会将此答案标记为已接受,因为它回答了当前发布的问题