Linux 网络发包流程
![](/theme/default/default/images/main/eye-open.png)
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
![](/theme/default/default/images/main/icon-link.png)
![](/theme/default/default/images/main/icon-jing.png)
摘要
本文由咸鱼撰写,续前篇《Linux 网络收包流程》后,详细介绍了 Linux 系统中网络发送数据包的具体流程。
简要回顾收包流程
简述了数据包从网卡接收到应用程序读取的过程,包括DMA传输至内存、硬中断处理、软中断处理、到达三层、四层协议栈,最后由应用层应用程序读取。
发包流程
详细说明了发包流程,包括网卡启动、socket建立、内核与网卡硬件使用的 RingBuffer 分配及初始化,以及数据从 igb_tx_buffer 数组到网卡硬件的 e1000_adv_tx_desc 数组的传输过程。
拷贝到内核
介绍了数据从应用程序通过 socket 系统调用拷贝到内核的过程,包括使用 send/sendto 函数、sock_sendmsg 函数及 TCP 协议的 tcp_sendmsg 函数,以及数据的拷贝和触发发送操作。
网络协议栈处理
传输层处理包括拥塞控制、滑动窗口、封装 TCP 头;网络层处理涉及路由查找、IP 头设置、netfilter 过滤、skb 切分;数据链路层处理包括邻居子系统和网络设备子系统的协同工作。
到达网卡发送队列
描述了数据包添加到网卡发送队列的过程,包括选择队列、调用驱动程序入口函数、触发发送操作以及在某些情况下触发软中断的情形。
数据发送
阐述了驱动程序如何处理 skb 描述信息并通过 DMA 将数据发送到网络的详细步骤。
收尾工作
解释了数据发送完成后,网卡设备如何通过中断来执行清理工作,包括释放内存资源。
总结
总结了整个数据包发送流程,从应用程序通过 socket 拷贝数据到内核,到网络协议栈处理,再到数据链路层的处理,最后到网卡发送数据,以及硬中断触发的收尾工作。
文章结束鼓励读者支持作者,以一键三连的形式表示喜爱。
想要了解更多内容?
![](/theme/default/default/images/main/icon-link.png)
![](/theme/default/default/images/main/icon-jing.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)