Linux内核网络报文处理流程
linux网络协议栈是由若干个层组成的,网络数据的处理流程主要是指在协议栈的各个层之间的传递。
网络数据在内核中的处理过程主要是在网卡和协议栈之间进行:从网卡接收数据,交给协议栈处理;或者协议栈将上层需要发送的数据通过网络发出去。
下图总结了各层间在网络输入输出时的层间调用关系。由图中可以看出,数据的流向主要有两种:
1、应用层输出数据时,数据按照自上而下的顺序,依次通过插口层、协议层和接口层;
2、当有数据到达的时候,自下而上依次通过接口层、协议层和插口层的方式,在内核层传递。
应用层的Socket的初始化、绑定(bind)、销毁通过调用内核层的socket函数进行资源的申请、销毁。
发送数据的时候,将数据由插口层传递给协议层,协议层在UDP层添加UDP的首部、TCP层添加TCP的首部、IP层添加IP的首部,接口层的网卡则添加以太网相关的信息后,通过网卡的发送程序发送到网络上。
接收数据的过程是一个相反的过程,当有数据到来的时候,网卡的中断处理程序将数据从以太网网卡的FIFO对列中接收到内核,传递给协议层,协议层在IP层剥离IP的首部、UDP层剥离UDP的首部、TCP层剥离TCP的首部后传递给插口层,插口层查询socket的标示后,将数据送给用户层匹配的socket。
Linux内核网络协议栈架构
下图为Linux内核层的网络协议栈的架构视图。最上面是用户空间层,最底部是物理设备,例如以太网网卡等,提供网络数据的连接、收发。中间是内核层,即网络协议栈子系统。流经网络栈内部的是socket缓冲区(由结构sk_buff接连),它负责在源和汇点之间传递报文数据。
系统调用接口:它为用户空间的应用程序提供了一种访问内核网络子系统的接口;
协议诊断接口:是一个协议无关层,它提供了一种通用方法来使用底层传输层协议;
网络协议:实际协议,在Linux中包括内嵌的协议TCP、UDP,IP等等;
设备诊断接口:网络设备无关层,提供了与各个设备驱动程序通信的通用接口;
设备驱动:设备驱动程序本身,响应设备的通信;
参考文献:Linux网络编程