ptcpdump v0.33 ~ v0.37 的主要变更内容

前言

本文将按变更顺序介绍一下 ptcpdump 从上次的 v0.32 之后的 v0.33 版本到最新的 v0.37 版本期间所发布的主要变更内容。

主要变更内容

优先使用 BPF ringbuf 代替 BPF perfbuf

如果当前系统使用的 Linux 内核支持 BPF ringbuf 的话, ptcpdump 将优先使用 BPF ringbuf 技术优化程序性能。 关于 BPF ringbuf 的更多信息,详见 BPF ring buffer

修复使用 cgroup-skb 后端时按进程过滤数据包功能失效的问题

修复之前的版本中,通过 --backend=cgroup-skb 参数指定使用 cgroup-skb 后端时, --pid--pname 参数对应的功能失效的问题。

支持从标准输入中读取 PcapNG 格式的数据

现已支持通过 -r - 从标准输入中读取 PcapNG 格式的数据:

$ cat data.pcapng | ptcpdump -r -
$ ptcpdump -r - < data.pcapng

支持 -C 和 -W 参数实现文件轮转功能

现已支持在使用 -w 保存数据到文件中时,使用 -C-W 参数实现文件轮转功能:

sudo ptcpdump -i any -w data.pcapng -C 1mb
sudo ptcpdump -i any -w data.pcapng -C 1mb -W 5

其中:

  • -C 指定文件的最大大小,当超过该大小时,将在旧的文件名后面追加数字(比如 data.pcapng1 ),来保存历史数据。
  • -W 自定保存的文件数量,需要与 -C 一起使用,用于限制文件数量。

支持 -F/--expression-file 参数实现从文件中读取 pcap fitler 表达式

现已支持使用 -F 或者 --expression-file 参数从文件中读取 pcap filter 包过滤表达式:

sudo ptcpdump -i any -c 10 -F filter.txt
sudo ptcpdump -i any -c 10 --expression-file filter.txt

支持 -tt, -ttt, -tttt, -ttttt 参数实现指定输出的时间格式

现已支持使用 -tt, -ttt, -tttt, -ttttt 指定输出包信息时的时间信息格式。

  • -tt : 显示时间戳格式,比如 1764417816.346098 ens33 sshd.183127 Out IP xx.xx.xx.xx.22 > xx.xx.xx.xx.64755:...
  • -ttt : 显示两条记录的时间间隔, 比如 00:00:00.000265 ens33 sshd.183127 Out IP xx.xx.xx.xx.22 > xx.xx.xx.xx.64755:...
  • -tttt : 显示日期和时间,比如 2025-11-29 20:03:36.346098 ens33 sshd.183127 Out IP xx.xx.xx.xx.22 > xx.xx.xx.xx.64755:...
  • -ttttt : 显示距离第一条记录的时间间隔,比如 00:00:00.002708 ens33 sshd.183127 Out IP xx.xx.xx.xx.22 > xx.xx.xx.xx.64755:...

支持通过动态链接的方式使用系统安装的 libpcap

之前的版本只支持以静态链接的方式编译依赖的 libpcap 库, 现已支持通过动态链接的方式使用系统安装的 libpcap 库,满足简化系统库管理的需求。

可以通过下面任一编译方式使用动态链接库:

$ CGO_ENABLED=1 go build -tags dynamic
$ make build-dynamic-link

修复 -s 0 参数会导致程序崩溃的问题

在之前的版本中,如果使用 -s 0 参数会导致 ptcpdump 程序崩溃,这个问题现已修复。

修复终端输出中的时间信息不准确的问题

在之前的版本中,终端输出的包信息的时间信息随着时间的推移会与实践的事件时间差距越来越大, 这个问题现已修复。

实验性支持 armv7 CPU 架构

在新版本中已实验性支持 armv7 CPU 架构。 因为缺少支持 armv7 架构的 CI 环境, 因此只能作为实验性支持, 没法保证未来版本的兼容性。如果某个版本不再支持 armv7 了, 欢迎反馈。

新增 tp-btf 后端

新版本增加了一个新的后端 tp-btf , 当指定使用该后端时,ptcpdump 将使用 BPF_PROG_TYPE_TRACING 类型的 eBPF 程序来捕获数据包。 该后端与 tc 后端的主要区别是:tp-btf 默认将能捕获所有网络命名空间下的数据, 而 tc 后端默认只捕获当前网络命名空间下的数据(可以通过 --netns 命令指定捕获特定网络命名空间下的数据)。 关于该后端与其他后端的区别,详见 Backend

可以通过 --backend tp-btf 使用新增的 tp-btf 后端。

新增 socket-filter 后端

新版本增加了另一个新的后端 socket-filter , 当指定使用该后端时,ptcpdump 将使用 BPF_PROG_TYPE_SOCKET_FILTER 类型的 eBPF 程序来捕获数据包。 使用该后端时,ptcpdump 的输出结果将更接近 tcpdump 的输出结果,因为此时它们两个捕获数据包的时机会更接近。 关于该后端与其他后端的区别,详见 Backend

可以通过 --backend socket-filter 使用新增的 socket-filter 后端。

在跨网络命名空间的数据结果中显示 inode ID 信息

从新版本开始,当输出结果中包含非当前网络命名空间的数据时,程序将会尝试在输出网络接口信息时,显示对应网络命名空间的 inode ID 信息:

12:20:31.336316 eth0@4026533097 curl.405939 Out IP 172.17.0.4.38670 > 1.1.1.1.80: Flags [S], seq 3064539219, win 64240, options [mss 1460,sackOK,TS val 1731159046 ecr 0,nop,wscale 7], length 0, ParentProc [bash.405653]
12:20:31.336382 veth1d387b0 curl.405939 In IP 172.17.0.4.38670 > 1.1.1.1.80: Flags [S], seq 3064539219, win 64240, options [mss 1460,sackOK,TS val 1731159046 ecr 0,nop,wscale 7], length 0, ParentProc [bash.405653]

-v 的输出中增加 IP Options 信息

新版本在使用 -v 参数输出详情时,将输出 IP Options 信息:

09:48:31.908813 IP (tos 0x0, ttl 64, id 39183, offset 0, flags [none], proto TCP (6), length 80, options (RR 1.2.3.4, 1.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0,EOL))
    ${IP}.1373 > 1.1.1.1.80: Flags [S], cksum 0xbfb4, seq 122218745, win 512, length 0

新增输出 HTTP 信息

如果某一行的数据包是 HTTP 数据,新版本将默认输出基本的 HTTP 信息:

13:27:02.285015 IP ${IP}.57166 > ${IP}.80: Flags [P.], ..., length 73: HTTP: GET / HTTP/1.1
13:27:02.516911 IP ${IP}.80 > ${IP}.57166: Flags [P.], ..., length 349: HTTP: HTTP/1.1 301 Moved Permanently

如果使用 -v 参数输出详情,则会包含详细的 HTTP 信息:

13:27:02.285015 IP (tos 0x0, ttl 64, id 8683, offset 0, flags [DF], proto TCP (6), length 113)
    ..., length 73: HTTP: GET / HTTP/1.1
        GET / HTTP/1.1
        Host: kernel.org
        User-Agent: curl/8.5.0
        Accept: */*

13:27:02.516911 IP (tos 0x0, ttl 128, id 62994, offset 0, flags [none], proto TCP (6), length 389)
    ..., length 349: HTTP: HTTP/1.1 301 Moved Permanently
        HTTP/1.1 301 Moved Permanently
        Server: nginx
        Date: Sat, 05 Jul 2025 13:27:02 GMT
        Content-Type: text/html
        Content-Length: 162
        Connection: keep-alive
        Location: https://kernel.org/

        <html>
        <head><title>301 Moved Permanently</title></head>
        <body>
        <center><h1>301 Moved Permanently</h1></center>
        <hr><center>nginx</center>
        </body>
        </html>

新增输出 TLS 信息

如果某一行的数据包是 TLS 数据,新版本将默认输出 TLS Client Hello 或 Server Hello 信息:

13:48:40.371849 IP ${IP}.47812 > ${IP}.443: Flags [P.], ..., length 517: TLSv1.0: Client Hello (SNI=kernel.org)
13:48:40.606677 IP ${IP}.443 > ${IP}.47812: Flags [P.], ..., length 1412: TLSv1.3: Server Hello

新增支持对 L3 网络接口设备抓包

之前的版本只支持对 L2 网络接口设备抓包,新版本已增加对 L3 网络接口(比如 TUN 设备)的支持。

改为默认以相对数字显示 TCP 序列号

在之前的版本中,默认会显示 TCP 序列号的原始数字,比较难阅读:

20:03:36.346098 ens33 sshd.183127 Out IP ${IP}.22 > ${IP}.64755: Flags [P.], seq 1457857145:1457857369, ack 1966040526, win 65535, length 224, ParentProc [sshd.16678]
20:03:36.346909 ens33 sshd.183127 In IP ${IP}.64755 > ${IP}.22: Flags [.], seq 1966040526, ack 1457857369, win 64240, length 0, ParentProc [sshd.16678]
20:03:36.348807 ens33 sshd.183127 Out IP ${IP}.22 > ${IP}.64755: Flags [P.], seq 1457857369:1457857593, ack 1966040526, win 65535, length 224, ParentProc [sshd.16678]

新版本将默认以相对数字的形式显示 TCP 序列号信息:

20:03:36.346098 ens33 sshd.183127 Out IP ${IP}.22 > ${IP}.64755: Flags [P.], seq 1457857145:1457857369, ack 1966040526, win 65535, length 224, ParentProc [sshd.16678]
20:03:36.346909 ens33 sshd.183127 In IP ${IP}.64755 > ${IP}.22: Flags [.], ack 224, win 64240, length 0, ParentProc [sshd.16678]
20:03:36.348807 ens33 sshd.183127 Out IP ${IP}.22 > ${IP}.64755: Flags [P.], seq 224:448, ack 0, win 65535, length 224, ParentProc [sshd.16678]

同时新增 -S--absolute-tcp-sequence-numbers 参数用于控制恢复之前的显示原始数字的模式。

如果你对 ptcpdump 有额外的改进或新功能建议,欢迎在评论区或项目 issues 中留言。


Comments