【Linux 网络子系统深度拆解】发包路径全解:从 send() 到网线
💡
原文中文,约22300字,阅读约需53分钟。
📝
内容提要
本文探讨了Linux内核中数据从用户态调用send()到网线上发送的路径。发包过程包括TCP分段、拥塞控制和Qdisc调度等多个阶段。关键函数tcp_sendmsg()负责将用户数据复制到skb中,并通过拥塞窗口和TSQ限制控制发送时机,最终数据通过dev_queue_xmit()发送到网卡,完成TX过程。
🎯
关键要点
- 用户态调用send()后,数据在内核中的发包路径比收包路径更复杂,涉及多个决策约束。
- 发包路径分为六个阶段,包括Socket层、TCP层、IP层、Netfilter、Qdisc和驱动层。
- tcp_sendmsg()是TCP发包的入口,负责将用户数据复制到skb中,并控制发送时机。
- TCP层通过tcp_write_xmit()进行拥塞控制和分段,确保数据在网络中有效传输。
- ip_queue_xmit()负责在IP层查找路由并构建IP头,确保数据包正确发送。
- dev_queue_xmit()是发包路径的核心,负责选择TX队列并处理Qdisc调度。
- GSO/TSO机制允许延迟分段,减少每个包的开销,提高网络传输效率。
- 驱动层通过dev_hard_start_xmit()处理DMA映射和门铃通知,确保数据包发送到网卡。
- TX完成后,网卡触发中断,驱动释放skb并唤醒等待的进程,形成反馈循环。
❓
延伸问答
Linux内核中数据发包的主要路径是什么?
数据发包路径主要包括Socket层、TCP层、IP层、Netfilter、Qdisc和驱动层六个阶段。
tcp_sendmsg()函数的作用是什么?
tcp_sendmsg()函数是TCP发包的入口,负责将用户数据复制到skb中,并控制发送时机。
什么是GSO和TSO,它们如何提高网络传输效率?
GSO和TSO允许延迟分段,减少每个包的开销,提高网络传输效率,特别是在硬件支持的情况下。
dev_queue_xmit()在发包路径中扮演什么角色?
dev_queue_xmit()是发包路径的核心,负责选择TX队列并处理Qdisc调度。
TCP层如何进行拥塞控制和分段?
TCP层通过tcp_write_xmit()进行拥塞控制和分段,确保数据在网络中有效传输。
TX完成后,网卡如何处理数据包?
TX完成后,网卡触发中断,驱动释放skb并唤醒等待的进程,形成反馈循环。
➡️