台州seo网站推广费用,网站改版规则,aspcms 生成网站地图,销售管理软件在TCP/IP网络分层模型里#xff0c;整个协议栈被分成了物理层、链路层、网络层#xff0c;传输层和应用层。物理层对应的是网卡和网线#xff0c;应用层对应的是我们常见的Nginx#xff0c;FTP等等各种应用。Linux实现的是链路层、网络层和传输层这三层。 在Linux内核实现中… 在TCP/IP网络分层模型里整个协议栈被分成了物理层、链路层、网络层传输层和应用层。物理层对应的是网卡和网线应用层对应的是我们常见的NginxFTP等等各种应用。Linux实现的是链路层、网络层和传输层这三层。 在Linux内核实现中链路层协议靠网卡驱动来实现内核协议栈来实现网络层和传输层。内核对更上层的应用层提供socket接口来供用户进程访问。我们用Linux的视角来看到的TCP/IP网络分层模型应该是下面这个样子的。 在了解网络收包过程之前先了解一下网络收包过程的一些概念 1、硬中断软中断当设备上有数据到达的时候会给CPU的相关引脚上触发一个电压变化就是硬中断引脚以通知CPU来处理数据。对于网络模块来说由于处理过程比较复杂和耗时如果在中断函数中完成所有的处理将会导致中断处理函数优先级过高将过度占据CPU将导致CPU无法响应其它设备例如鼠标和键盘的消息。因此Linux中断处理函数是分上半部和下半部的。上半部是只进行最简单的工作快速处理然后释放CPU接着CPU就可以允许其它中断进来。剩下将绝大部分的工作都放到下半部中可以慢慢从容处理。2.4以后的内核版本采用的下半部实现方式是软中断由ksoftirqd内核线程全权处理。和硬中断不同的是硬中断是通过给CPU物理引脚施加电压变化而软中断是通过给内存中的一个变量的二进制值以通知软中断处理程序。 2、ring bufferring buffer称作环形缓冲区也称作环形队列circular queue是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构适合缓存数据流。如下为环形缓冲区ring buffer 的概念示意图。 任务间的通信是ring buffer的典型应用场景。如进程A发数据进程B取数据去处理两个进程通常不可能无缝衔接即进程B取数据的时机和进程A发数据的时机不能完全衔接上所以需要一个缓存来做缓冲。具体应用有串口数据收发、log缓存、网卡处理网络数据包、音频/视频流处理等。在网络数据收发处理中ring buffer位于网卡和内核协议栈之间在物理上就是主机内存里的一块区域另外ring buffer虽然名字叫buffer但其本身不存储数据实际上是个队列队列里存放的是描述符描述符描述的是存放数据包的内存地址这个指定的地址就是socket buffer下面讲。 ring buffer有两个主要作用 a、可以平滑生产者数据来源和消费者处理数据的速度。 b、通过 NAPI 的机制就是硬中断加软中断当网卡数据DMA到ring buffer的指定位置后网卡会向CPU发出硬中断这个硬中断处理函数没干别的就只发出软中断请求然后在软中断处理函数中调用poll函数将ring buffer指定的数据取到内核协议栈里在此过程中硬中断是关闭的数据取完了再打开硬中断合并以减少 IRQ 次数。 ring buffer一篇文章讲透它 - 知乎 (zhihu.com)此文有ringbuffer的详细描述这里只说个基本概念。 3、socket bufferRing Buffer 队列内存放的是一个个 Packet 描述符其有两种状态ready和used。初始时描述符是空的指向一个空的socket buffer处在ready状态。当有数据时DMA负责从 NIC 取数据并在Ring Buffer 上按顺序找到下一个ready的描述符将数据存入该 描述符指向的socket buffer中并标记槽为 used。在此过程中根据数据类型的不同数据会被加上各种包头信息封装成socket buffer指定的数据结构。当应用程序调用 read 系统调用时程序会切换到内核区并且会把 socket 接收缓冲区中的数据拷贝到用户区拷贝后的数据会从 socket 缓冲区中移除。socket buffer可以看做是用户空间和内核空间的接口同时也是网卡和内核之间的接口。Socket Buffer的设计优点是避免了重复拷贝数据在发送和接收的分别都只有两次分别是应用层和内核空间之间的拷贝、网卡的硬件缓冲区和内核空间之间的拷贝。 有了以上的基本概念后下面给出一个收包的基本流程 1.当收到报文时网卡把数据包写入它自身的内存。 2. 网卡通过CRC校验检查数据包是否有效之后调用DMA把数据包发送到主机的内存缓冲区这是驱动程序提前向内核申请好的一块内存区域就是ring buffer指向的socket buffer空间。 3.数据包的实际大小、checksum和其他信息会保存在独立的Ring Buffer(Rx.ring)中Ring Buffer接收之后NIC 会向主机发出中断告知内核有新的数据到达。收到中断驱动会把数据包包装成指定的数据结构sk_buff并发送到上一层。 4.链路层会检查数据包是否有效并且解析出上层的协议网络协议。 5.IP 层同样会检查数据包是否有效。检查IP checksum。 6.TCP层检查数据包是否有效。检查 TCP checksum。 7.如果是TCP报文内核会根据TCP控制块中的端口号信息找到对应的 socket数据会被增加到socke的接收缓冲区socket接收缓冲区的大小就是 TCP 接收窗口。Udp报文同理不同的是TCP的发送和接收都有socket bufferudp只有接收端有。 8.当应用程序调用 read 系统调用时程序会切换到内核区并且会把 socket 接收缓冲区中的数据拷贝到用户区拷贝后的数据会从 socket 缓冲区中移除。 如下两图 以上参考自简述 Linux I/O 原理及零拷贝下 — 网络 I/O_Linux_Qunar技术沙龙_InfoQ写作社区 发包过程基本就是相反流程具体可以查看以上链接。