在TCP/IP网络分层模型里,整个协议栈被分成物理层、链路层、网络层,传输层和应用层。Linux实现的是链路层、网络层和传输层这三层。

层次 协议栈中的作用 Linux 实现的范围 详细说明
应用层 负责应用程序特定协议 (HTTP, FTP, SSH, DNS)。 全部 通过 Socket 接口(API)向应用程序提供服务。
应用程序(如 Web 服务器、浏览器、SSH 客户端)本身就是应用层实现。
传输层 负责端到端的数据传输 (TCP, UDP)。 全部 核心实现,管理连接状态、流量控制、拥塞控制(TCP)以及校验和(UDP)。
网络层 负责数据包路由和寻址 (IP, ICMP)。 全部 核心实现,负责 IP 地址管理、路由表维护、数据包转发等。
链路层 负责物理链路上的帧传输 (Ethernet, Wi-Fi)。 部分(软件驱动) 链路层的软件部分(如网卡驱动、帧的封装/解封装、MAC 地址管理)由 Linux 内核实现。
链路层的硬件部分(如 CRC 校验、介质访问控制)则由网卡硬件完成。
物理层 负责比特流的传输 (网线、光纤、无线电)。 完全由网卡硬件、电缆或无线硬件负责,Linux 内核不涉及电信号或光信号的生成。

在 Linux 内核实现中,链路层协议网卡驱动来实现,内核协议栈来实现网络层和传输层。内核对更上层的应用层提供 socket 接口来供用户进程访问。

image.png

image.png

内核网络收包过程:

  1. 数据包到达网卡设备。
  2. 网卡收到数据包后,Linux中第一个工作的模块就是网卡驱动,网卡驱动DMA方式把网卡上收到的帧写到内存中。再向CPU发出硬中断以通知CPU有数据到了。
  3. 中断上半部来说(基本等同硬中断),当CPU收到中断请求后,会去调用网络驱动注册的中断处理函数,最后发送一个软中断信号通知下半部做进一步处理。
  4. 下半部(基本等于软中断)被软中断信号唤醒后,ksoftirqd 检测到有软中断请求到达,调用 poll 开始轮询收包,收到后交由各级协议栈处理,直到把数据送到应用程序。
  5. 驱动软件从RingBuffer中读取,填充内核skbuff结构(第2次拷贝:内核网卡缓冲区RingBuffer->内核专用数据结构skbuff)
  6. 数据报文达到内核协议栈,进行高层处理。