You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Linux tcpretrans的TCP重传追踪转为FreeBSD的DTrace脚本?

能否将Linux的tcpretrans工具转为FreeBSD下的DTrace脚本实现TCP重传追踪?

Brendan Gregg开发的tcpretrans是一款基于Linux内核动态追踪特性的工具,它通过/sys/kernel/debug/tracing接口追踪TCP重传事件。针对该工具能否转换为FreeBSD平台下的DTrace脚本实现相同功能,答案是肯定的。

FreeBSD原生支持DTrace,且内核中暴露了足够的TCP层探针来追踪重传行为。以下是一个实现类似tcpretrans功能的DTrace脚本示例:

#!/usr/sbin/dtrace -s

#pragma D option quiet
#pragma D option switchrate=10hz

dtrace:::BEGIN
{
        printf("%-16s %-5s %-16s %-5s %-10s %-10s %s\n",
            "SOURCE", "SPT", "DEST", "DPT", "SEQ", "RETRIES", "TIME");
}

fbt::tcp_remit:entry
{
        /* 获取TCP控制块 */
        struct tcpcb *tp = args[0];
        /* 过滤掉非重传的包 */
        if (!(tp->t_flags & TF_RETRANSMIT))
                return;

        /* 提取IP和端口信息 */
        this->saddr = ipaddr_string(&tp->t_inpcb->inp_laddr);
        this->daddr = ipaddr_string(&tp->t_inpcb->inp_faddr);
        this->sport = ntohs(tp->t_inpcb->inp_lport);
        this->dport = ntohs(tp->t_inpcb->inp_fport);

        /* 输出重传详情 */
        printf("%-16s %-5d %-16s %-5d %-10u %-10u %Y\n",
            this->saddr, this->sport, this->daddr, this->dport,
            tp->snd_nxt, tp->t_rxtcur, walltimestamp);
}

脚本说明:

  • 利用fbt::tcp_remit:entry探针追踪TCP重传包的发送入口
  • 通过TCP控制块(tcpcb)过滤出标记为TF_RETRANSMIT的重传事件
  • 提取并格式化输出源/目的IP、端口、重传的序列号、当前重传次数以及时间戳
  • quiet选项关闭默认输出,switchrate控制输出频率

使用注意事项:

  • 需以root权限运行脚本
  • FreeBSD内核需启用DTrace支持(默认已启用,若未开启可通过loader.conf设置dtrace_load="YES")
  • 脚本依赖FreeBSD内核的tcpcb结构体定义,不同版本的FreeBSD可能存在结构体字段差异,需根据实际内核版本调整

内容的提问来源于stack exchange,提问作者Payam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:46:37