linux内核系列---网络
分层网络
OSI七层模型和TCP/IP五层模型
这是理论上的,后续内容我们使用TCP/IP五层模型进行说明。
linux网络子系统
再理论联系下实际,说明linux实现的网络子系统的分层。
解释下从linux网络子系统简化到TCP/IP五层模型中去掉的两个内容。
邻居子系统:主要是为了将上层协议(如IP)转成链路层识别的MAC。过程中可能会发起ARP请求,但需要区分ARP协议和ARP请求不是一个概念。
网络设备子系统:为下层不同的驱动程序提供统一的虚拟层,提供上层调用。
这两部分属于理论转实现时的过渡缓冲,不在今天主要的知识点范围,因此先简化去掉。
讲五层模型过于抽象,因此具象化一点,后文直接以IP协议为基础,对linux下的网络子系统进行说明。
网卡对数据包的处理
因为接收数据和发送数据的关键知识点不同,下面分别讲。
网络收包过程
先说下NPAI的概念
参考:https://www.bytezonex.com/archives/5wIYFYBB.html
在 Linux 内核中,处理网络数据包主要有两种方式:轮询和中断。
轮询: 内核持续检查网络设备是否有数据包到达,缺点是会浪费大量系统资源,尤其是当网络流量低时。
中断: 当网络设备收到数据包时,向内核发送一个中断信号,内核接收到中断后会处理数据包,这种方式会占用较少系统资源,但对于网络流量高时,持续造成硬中断和上下文切换,极端情况下甚至造成cpu一直忙于处理网络数据。
为了解决轮询和中断的不足,Linux 内核引入了 NAPI 机制。NAPI将中断拆分成两部分,上半部分的硬中断和下半部分的软中断。硬中断短而快,只在软中断列表做下登记(数据到了),就释放cpu。具体数据的处理部分(耗时任务)则放到软中断中异步处理,这样