首页 > 代码库 > tcpprobe ——监听TCP信息的内核模块

tcpprobe ——监听TCP信息的内核模块

1 tcpprobe模块的加载与卸载

1) 用modprobe加载tcpprobe

// 如果是通过修改.config来编译tcpprobe的,可以使用modprobe加载

# modprobe tcp_probe port=5001 // 监听所有本地端口是5001的TCP流,仅在cwnd变化时捕捉信息

# modprobe tcp_probe full=1 port=5001 // full选项表示每次收到数据包都捕捉信息

2) 用insmod加载

// 如果是普通内核模块形式编译的,则使用insmod加载

# insmod tcp_probe.ko full=1 port=5001

3 )卸载tcpprobe

// 卸掉tcpprobe模块的命令也很简单,只要当前没有任务在使用tcpprobe模块即可卸载

# rmmod tcp_probe

2  tcpprobe模块的使用

加载tcpprobe模块后,会新增一个/proc/net/tcpprobe的接口,可以通过这个接口获取tcpprobe捕捉的信息。

# cat /proc/net/tcpprobe > data.out &    // tcpprobe捕捉的信息是持续性的,因此读这个接口可以放到后台读  # pid=$!   // 保存上一个读命令的pid,用于结束读tcpprobe接口  # iperf -c otherhost    // 使用iperf建立一个TCP流  # kill $pid 

 记录在data.out中的数据大致是这个样子:

11.172120204 193.168.0.2:8089 193.168.0.25:54320 32 0x842ccad 0x84299c5 10 168 14608 143

 每行的各列分别为:

timestamp   //时间戳saddr:port  // 源IP及端口,我的数据是在发送端捕捉的,所以port是固定的8089    daddr:port  // 目的IP及端口  skb->len    // 收到的数据包skb大小,收到的都是ACK包,所以len都比较小。  snd_nxt     // 下一个待发送数据的序列号  snd_una     // 待确认数据的序列号  snd_cwnd    // 拥塞窗口大小  ssthresh    // 慢启动阈值  snd_wnd     // 接收窗口大小  srtt        // smoothed RTT  

 参考:http://perthcharles.github.io/2014/12/19/tcp-probe-intro/

tcpprobe ——监听TCP信息的内核模块