鸣潮udp连通性检测异常(龙蜥正式开源 Surftrace,协议包解析效率可提升 10 倍)

Surftrace:深度追踪Linux内核的网络技术利器
Surftrace是一个由系统运维SIG推出的强大工具,它不仅是一个基于libbpf的ftrace封装器,同时也是一个开发编译平台。Surftrace为用户提供了一个简洁、高效的方式,基于libbpf快速构建工程进行开发,同时作为ftrace的封装器进行trace命令编写。
项目内包含了Surftrace工具集、pylcc和glcc(用于Python或通用C语言对libbpf编译器集合),提供了远程和本地的eBPF编译能力。Surftrace通过对内核功能的最大化抽象,尤其是对网络协议的深入追踪(如网络协议抓包等),使用户能够快速上手并显著提升定位问题的效率。
现如今,eBPF技术火热,Surftrace支持通过libbpf及CO-RE能力,对bpf的map和prog等常用函数进行了封装和抽象。在此平台上开发的libbpf程序可以在各个主流内核版本上无差别运行,大大提升了开发和部署的效率。
Surftrace最大的优势在于它整合了当前主流的trace技术,用户可以选择使用ftrace或eBPF,应用场景覆盖了内存、IO等Linux各个子系统。特别是在网络协议栈方面,Surftrace能够清晰地关联网络报文与内核协议栈,精准追踪关注的报文行进路径。
一、理解Linux内核协议栈
定位网络问题是软件开发者必备的基础技能之一。尽管可以使用诸如ping连通性和tcpdump抓包分析等手段初步定界问题,但当问题深入到内核协议栈内部时,如何将网络报文与内核协议栈清晰关联起来,精准追踪到关注的报文行进路径呢?
需要理解网络报文的分层结构。不同OS都采用一致的报文封装方式,以实现跨软件平台的通信。其中,sk_buff是Linux内核中承载网络报文的实体,它在include/linux/skbuff.h文件中定义。特别关注的是head和data两个指针成员,它们分别指向缓冲区开始和当前报文处理所在协议层的起始位置。data指针成员是报文在内核处理过程中的关键标识。
二、Surftrace对网络报文的增强处理
Surftrace基于ftrace封装,采用接近于C语言的参数语法风格,极大地简化了ftrace的部署步骤,成为一款非常便捷的内核追踪工具。但在追踪网络报文时,仅仅解析一个skb->data指针是远远不够的。存在以下挑战:
1. skb->data指针在不同网络层指向的协议头并不固定。
2. 除了获取当前结构内容外,还需要获取上一层报文内容的需求。例如在一个udp报文中,无法直接获取到udp报文内容。
3. 源数据呈现不够人性化,如ipv4报文的IP数据是一个u32数据类型,可读性差且过滤器配置困难。
针对这些挑战,Surftrace对skb传参做了相应的特殊处理,以达到易用的效果。例如通过扩充下一层报文内容获取方式、使用前缀命名规则进行数据转换等。通过这些技术,Surftrace可以方便地追踪网络报文在内核的处理过程。此外还提供了一个实例来展示如何使用Surftrace定位网络问题。
三、实战应用:定位网络问题
