4、应用层
最后,应用层程序调用 Socket 接口,将内核的 Socket 接纳缓冲区的数据拷贝到应用层的缓冲区 。到这里,一个网络包的接纳过程就完毕了 。
发送网络数据包我们理解了网络包的接纳流程后,就很容易了解网络包的发送流程了 。网络包的发送方向,正好跟接纳方向相反 。
首先,应用程序调用 Socket 发送网络包的接口 。这是一个系统调用,会从用户态堕入到内核态的套接字层中 。
套接字层会申请一个内核态的 sk_buff 内存,将用户待发送的数据拷贝到 sk_buff 内存,并将其参加到Socket发送缓冲区等候网络协议栈的处置 。
由于网络数据包从应用程序传到内核时是原始数据,协议栈要在原始数据中参加通讯商定才干保证数据抵达效劳端能被正确辨认 。网络协议栈从 Socket 发送缓冲区中,取出数据包,然后依照 TCP/IP 栈的分层(传输层、网络层、网络接口层),从上到下逐层停止处置,各层将协议的头信息不时插入到数据包中 。
协议栈对发送数据包的处置流程如下:
1、传输层
在传输层,会为器添加TCP头,同时拷贝一个新的 sk_buff 副本,这是由于 sk_buff 在抵达网卡发送完成的时分,会被释放掉,而TCP 协议是支持重传的,为确保网络包牢靠传输,在收到对方的 ACK 之前,这个 sk_buff 不能被删除 。【入门Linux系统收发网络数据包的秘密!】2、网络层
在网络层,主要会做这些工作:选取路由(确认下一跳的 IP)、填充 IP 头、netfilter 过滤、对超越 MTU 大小的数据包停止分片 。处置完这些工作后会交给网络接口层处置 。3、网络接口层
网络接口层会停止物理地址寻址,以找到下一跳的 mac 地址,填充帧头和帧尾,将其放到发送队列中 。然后触发软中缀通知网卡驱动程序:队列中有新的网络包需求发送 。驱动程序收到通知会经过 DMA,从发送包队列中读出网络帧,并经过DMA将数据写入网卡的FIFO发送队列 。4、网卡设备
网卡设备从FIFO发送队列中取出数据包,将其发送到网络;当发送完成的时分,网卡设备会触发一个硬中缀来释放内存,主要是释放 sk_buff内存和清算 RingBuffer 内存 。最后,当收到这个 TCP 报文的 ACK 应对时,传输层就会释放原始的 sk_buff 。至此,一个网络包的发送流程就完毕了 。
来源: 码农猿星球
推荐阅读
- NAT 如何在 Linux 中进行网络地址转换
- 王者刚入门的时候,应该选择什么英雄练手?
- 全面讲解智能汽车系统诊断管理模块设计
- 黑暗光年飞升系统玩法攻略,地仙折扣服如何提升飞升等级?
- 神仙道3攻略大全,入门技巧解析
- 华为鸿蒙系统|孔令辉:乒乓王子实力超强,职业生涯堪称辉煌原因究竟是什么
- 为什么不用Go开发操作系统?
- 教师|6月起,教师招聘“旺季”来了,了解一下这3个准入门槛!
- 六个独特而惊人的 Linux 实用工具
- GPT-4版Windows炸场!整个系统就是一个对话机器人,微软开建AI全宇宙
