很多人以为Linux TCP/IP协议栈是个黑盒子,数据包丢进去就能自动处理。但其实它的代码逻辑非常清晰,从网络设备层一路到传输层,每一步都能在源码里找到对应位置。我花了很长时间把TCP/IP的代码路径摸透追踪linux tcp/ip代码运行 pdf,从接收一个数据包开始,一直追踪到TCP处理函数,这个过程实在让人着迷。

从哪里开始看代码才不迷茫

Linux内核网络代码都在net/目录下,但直接打开看很容易晕头转向。我建议从net/core/dev.c入手,这个文件是网络设备接口层的中枢。netif_receive_skb函数就像个大转盘,所有从硬件过来的数据包都要经过这里。掌握了这个入口,后面就好办了。

还有一个很实用的起点是include/linux/netdevice.h,里面定义了sk_buff结构体。这个结构体几乎贯穿整个TCP/IP处理流程linux系统怎么样,不理解它就看不懂后面的代码。我经常把sk_buff的字段打印出来,对照着代码一行一行看,效果特别好。

如果你和我一样喜欢用IDE看代码,建议把内核源码整棵克隆下来,然后用cscope或者eclipse建立索引。不然光是函数跳转就能让你崩溃,尤其是那些函数指针回调链。

数据包如何在协议栈里流转

追踪linux tcp/ip代码运行 pdf_linux追踪命令_linux跟踪程序运行过程

数据包从网卡驱动上来后,先经过__netif_receive_skb_core,这里会调用各种协议注册的钩子函数。IP协议在net/ipv4/af_inet.c里注册了ip_rcv,所以数据包会进到这个函数。你可以在这里打印日志,看看每个包经过的时间戳和长度变化。

ip_rcv函数做了IP头部校验和路由查找,然后调用ip_local_deliver。这个函数又把包交给tcp_v4_rcv,这是TCP协议在IPv4下的入口函数。到这里,数据包已经从二层走到了四层。每层之间的调用都很直接,没有那么多花哨的设计。

Tcp_v4_rcv函数会处理连接查找、校验和验证,然后根据连接状态决定是走tcp_v4_do_rcv还是tcp_rcv_established。如果你追踪一个正在建立的连接,会看到三次握手的过程在tcp_v4_conn_requesttcp_v4_synack_send之间来回跑。这些函数的调用关系可以用ftrace抓出来,比直接看代码更直观。

跟踪函数调用有哪些好用的工具

直接看代码只能知道“有什么”,但不知道“怎么跑”。我推荐用ftrace来跟踪函数调用序列。只要在/sys/kernel/debug/tracing/set_ftrace_filter里写上tcp_v4_rcv,就能看到它调用了哪些子函数。结合trace_printk,你还能看到内核日志里详细的执行路径。

对于更细粒度的分析redhat linux 9.0下载,可以用systemtap写个脚本,钩住sk_buffprotocol字段变化过程。比如在eth_type_trans之后,看协议字段怎么从ETH_P_IP变成IPPROTO_TCP。这能帮你理解协议栈中的状态机变换。

追踪linux tcp/ip代码运行 pdf_linux追踪命令_linux跟踪程序运行过程

如果你想要更简单的方案,直接在关键函数里加printk也是可以的。我经常在tcp_v4_rcvtcp_rcv_establishedtcp_v4_send_reset这些地方加日志,打印skb->lentcp_hdr(skb)->dest。重编内核的时间虽然长,但这种方法的确定性很高。

把PDF和代码对照着看更有效率

市面上有不少Linux TCP/IP实现的PDF资料,比如《Understanding Linux Network Internals》的节选版。但光看PDF容易走神,我建议你打开PDF看概念解释,然后马上在源码里找对应的实现。比如PDF里讲“TCP接收窗口管理”,你就去tcp_input.c里搜tcp_rcv_space_adjust,一遍看注释一遍看代码。

追踪linux tcp/ip代码运行 pdf_linux追踪命令_linux跟踪程序运行过程

有时候PDF画出来的流程图很漂亮,但实际代码跳转路径和自己的理解有出入。这时候我会用gdb调试一个最小内核模块,设断点单步执行。比如在tcp_v4_rcv下断点,然后用nc发送一个TCP包追踪linux tcp/ip代码运行 pdf,看变量怎么变化。这种方式能让你快速纠正对代码逻辑的错误假设。

另外,我习惯在PDF上做标记,把关键函数名和行号写上去。这样下次回看PDF时,可以直接跳到对应的代码段。长此以往,你会在脑子里面建立一张代码地图,看到某个概念就立刻想到它在文件里的位置。这种能力在看复杂协议实现时特别有用。

Linux TCP/IP的代码虽然庞大,但只要你找到正确的入口,用对追踪工具,再配合PDF资料对照查阅,完全可以把整个数据流的来龙去脉搞清楚。这个过程需要耐心,但每当你弄明白一个细节,那种成就感会很强烈。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复