【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并唤醒等待的进程,形成反馈循环。

➡️

继续阅读