包阅导读总结
1.
– 字节跳动、netcap、网络抓包、内核网络、开源
2.
– 字节跳动开源内核网络抓包工具 netcap,它基于 eBPF 技术,相比传统工具效率更高,能跟踪内核网络协议栈。介绍了其使用示例、工作原理、过滤和显示方式等,还提到未来的优化方向和团队招聘信息。
3.
– 字节跳动开源 Linux 内核网络抓包工具 netcap
– 背景
– 网络丢包问题常见,传统抓包工具效率低、定位深度网络问题能力有限,eBPF 技术带来新能力
– netcap 特点
– 可跟踪整个内核网络协议栈,使用 tcpdump 语法作为过滤条件,以 skb 为上下文
– 列举查看特定包是否到达预期函数调用点、查看 tcp 端口报文丢包位置等示例
– 工作原理
– 通过 kprobe / tracepoint 方式 hook 函数,获取关键结构体和数据,经过滤后给 netcap 应用程序
– 可按 tcpdump 语法过滤,将数据包用 tcpdump 显示,尽力推导还原不完整数据包
– 能统计数据包经过多个点的时间分析性能,支持用户自定义过滤和输出函数
– 未来优化
– 对 DPDK 的进一步支持
– 解决自定义输出时打印错乱问题
– 团队招聘
– 多地设岗,可扫描二维码投递简历,咨询小助手微信,欢迎加入
思维导图:
文章地址:https://mp.weixin.qq.com/s/GyjpY3QpeaPqN6s-YgeWMA
文章来源:mp.weixin.qq.com
作者:字节跳动STE团队
发布时间:2024/8/20 5:59
语言:中文
总字数:3024字
预计阅读时间:13分钟
评分:87分
标签:网络抓包工具,Linux 内核,eBPF 技术,网络性能优化,开源项目
以下为原文内容
本内容来源于用户推荐转载,旨在分享知识与观点,如有侵权请联系删除 联系邮箱 media@ilingban.com
在 Linux 内核网络开发过程中,网络丢包问题是一个常见的挑战。传统的网络抓包工具(如 tcpdump)虽然能够帮助开发者定位问题,但其效率较低,且在深度网络问题定位方面能力有限。随着 eBPF 技术的快速发展,出现了更高级的问题跟踪能力。字节跳动 STE 团队基于此技术开发了下一代内核网络抓包工具:netcap(net capture,内部原名:xcap),并正式对外开源,GitHub 地址:https://github.com/bytedance/netcap
与 tcpdump 工具只能作用于内核网络协议栈准备发包和收包的固定点相比,netcap 可以几乎跟踪整个内核网络协议栈(有skb作为参数的函数)。字节跳动 STE 团队使用 tcpdump 语法作为过滤条件,以 skb(socket buffer)为上下文,可以轻松掌握整个报文在内核网络协议栈的完整踪迹,从而帮助开发者大大提高内核网络丢包问题的定位效率。
netcap skb -f icmp_rcv@1 -i eth0 -e "host 10.227.0.45" -t "-nnv"
其中 -f 后面的参数是 kprobe 或者 tracepoint 的具体函数(默认是kprobe),并且需要告诉 netcap,skb 在这个函数(本例是 icmp_rcv )的第几个参数(从1开始),本例是第1个。
-
-i 后面是指skb的dev参数对应的网卡,这里要谨慎使用,因为有些函数的 skb 是没有设置 dev 的。 -
-t 的参数是 tcpdump 的显示方式,netcap 并没有自己显示数据包内容,而是借用了 tcpdump 的显示方式。
例2:查看内核对于 tcp 端口 9000 的报文的丢包位置
netcap skb -f tracepoint:skb:kfree_skb -e "tcp port 9000" -S
其中 -f 后面的参数是 kprobe 或者 tracepoint 的具体函数,tracepoint 不需要传递 skb 是第几个参数。
-S 表示连带着打印出此调用的 stack,本例中通过 stack 可以看到是哪里丢包的。
举个例子,在机器上配置一个丢包的 iptables 规则把来访的 tcp 9000 的包丢掉,如下图所示:
iptables -A INPUT -p tcp --dport 9000 -j DROP
netcap 通过 kprobe / tracepoint 方式实现函数的 hook,通过函数参数获取 skb 和 sock 关键结构体,拿到网络包的数据,通过 bpf map 和用户态进行数据传递。
netcap 的 工作原理大体如下:在 eBPF 程序中完成数据包的过滤,找出 tcpdump 语法过滤的包,然后把这个包给到 netcap 应用程序,netcap 应用程序再把这个包发去给 tcpdump 显示,或者直接输出 pcap 文件。如下图所示:
1. 如何按 tcpdump 语法过滤
tcpdump 的过滤语法是基于 cBPF的,使用开源库:https://github.com/cloudflare/cbpfc 这里可以把 tcpdump 的过滤语法转化成一个 C 函数,这个 C 函数可以嵌入到 netcap 的 eBPF 的程序中。转成 C 函数的基本原理如下:先利用 libpcap 库把 tcpdump 过滤语法转成 cBPF 指令码,然后基于此指令码转化成 C 语言的函数。如下图所示:
2. 如何把数据包内容用 tcpdump 显示出来
netcap 程序启动后,也会启动一个 tcpdump 的程序,tcpdump 的标准输入接收 pcap 格式的输入流,然后以不同的参数(例如 -e 是显示 mac 地址)从其标准输出打印出解析后的格式。如下图所示:
3. 如何找到数据包的内容
在内核中,是用 skb 来描述数据包的,找到 skb 中所指定的不同 header 的位置,就可以找到整个数据包,skb 的结构大体如下所示:
4. 发送方向数据包不完整,如何过滤数据包
在发送数据包的时候,例如 __ip_finish_output 函数,有时未填充完整的 eth头、ip 头、tcp 头,那么是怎么得到完整的包呢?
netcap 会尽力根据 skb 的 sock 结构来推导,还原数据包,此时抓出来的包有些非关键信息会与实际情况不一致(比如 ip 头的 id 字段)。skb 通过sock来推导数据包内容的逻辑大体如下图所示:
netcap 可以统计数据包经过多个点的时间,然后汇总输出,从而分析性能,举个例子,使用下面的命令:
netcap skb -f tracepoint:net:netif_receive_skb,ip_local_deliver@1,ip_local_deliver_finish@3,icmp_rcv@1 -e "host 10.227.0.72 and icmp" -i eth0 --gather --gather-output-color cyan
用户可以自定义自己的过滤函数和输出函数,这里举例如下,
netcap skb -f icmp_rcv@1 -e "host 10.227.0.72" -i eth0 --user-filter skb_user_filter.c --user-action skb_user_action.c --user-output-color green
其中扩展过滤文件 skb_user_filter.c 如下:
static inline int xcap_user_filter(void *ctx, void *pkt, u16 trace_index)
{
return 1;
}
这个扩展函数的返回值如果是 0,表示在 tcpdump 语法的过滤后,再进行一次用户自定义过滤,比如可以方便的写几行脚本,然后按照 skb->mark 来过滤。
struct xcap_user_extend {
int a;
uint32_t b;
int64_t c;
uint8_t x1;
uint8_t x2;
uint16_t x3;
};
static inline int xcap_user_action(void *ctx, void *pkt, u32 pkt_len, struct xcap_user_extend *user, u16 trace_index)
{
user->a = 0x12345678;
user->b = 1000;
user->c = 2002;
user->x1 = 'M';
user->x2 = 0x11;
user->x3 = 0xabcd;
return 1;
}
-
对 DPDK 的进一步支持,由于 usdt 的上游库存在问题,故无法支持应用程序的 usdt,有兴趣的读者可以修改支持。 -
在自定义输出的时候,数据包较多的情况下,会出现打印错乱,原因是 tcpdump 的输出信息和用户自定义的输出信息共同使用了标准输出,未来也将针对该问题做后续优化。
字节跳动STE团队诚邀您的加入!团队长期招聘,北京、上海、深圳、杭州、US、UK均设岗位,以下为近期的招聘职位信息,有意向者可直接扫描海报二维码投递简历,期待与你早日相遇,在字节共赴星辰大海!若有问题可咨询小助手微信:sys_tech,岗位多多,快来砸简历吧!
字节跳动STE团队(System Technologies&Engineering,系统技术与工程),一直致力于操作系统内核与虚拟化、系统基础软件与基础库的构建和性能优化、超大规模数据中心的系统稳定性和可靠性建设、新硬件与软件的协同设计等基础技术领域的研发与工程化落地,具备全面的基础软件工程能力,为字节上层业务保驾护航。同时,团队积极关注社区技术动向,拥抱开源和标准,欢迎更多同学加入我们,一起交流学习。扫描下方二维码了解职位详情,欢迎大家投递简历至huangxuechun.hr@bytedance.com、wangan.hr@bytedance.com。