![93e8fa27929358567f93e8cd4d2dc391.png](https://img-blog.csdnimg.cn/img_convert/93e8fa27929358567f93e8cd4d2dc391.png)
本文将从上层介绍Linux上的TCP/IP栈是如何工作的,特别是socket系统调用和内核数据结构的交互、内核和实际网络的交互。写这篇文章的部分原因是解释监听队列溢出(listen queue overflow)是如何工作的,因为它与我工作中一直在研究的一个问题相关。
建好的连接怎么工作
先从建好的连接开始介绍,稍后将解释新建连接是如何工作的。
内核管理的每一个TCP文件描述符都是一个struct, 它记录TCP相关的信息(如序列号、当前窗口大小等等),以及一个接收缓冲区(receive buffer,或者叫receive queue)和一个写缓冲区(write buffer,或者叫write queue),后面我会交替使用术语buffer和queue。如果你对更多细节感兴趣,可以在Linux内核的net/sock.h中看到socket结构的实现。
当一个新的数据包进入网络接口(NIC)时,通过被NIC中断或通过轮询NIC的方式通知内核获取数据。通常内核是由中断驱动还是处于轮询模式取决于网络通信量;当NIC非常繁忙时,内核轮询效率更高,但如果NIC不繁忙,则可以使用中断来节省CPU周期和电源。Linux称这种技术为NAPI,字面意思是“新的api”。
当内核从NIC获取数据包时,它会对数据包进行解码,并根据源IP、源端口、目标IP和目标端口找出与该数据包相关联的TCP连接。此信息用于查找与该连接