20世纪70年代,美国国防部高级研究计划局(DARPA)的两位科学家提出了TCP/IP,并于1974年写入RFC 675规范。随着网络应用的推广,越来越多的机构、高校采用TCP/IP作为通信标准,TCP/IP已经成为Internet通信协议的事实标准。
1984年,国际标准化组织发布了ISO/IEC 7498标准,该标准定义了开放系统互联OSI(Open System Interconnect)模型。该模型将网络划分为七层,并约定了每一层实现的功能,每层名称和对应的功能参考图2-1。
图2-1 OSI七层模型
TCP/IP初期并没有提出分层概念,实际上TCP/IP本身是按照分层架构实现的。1989年RFC 1122规范发布,该规范描述了TCP/IP的分层模型。该模型包含4个层次:应用层、传输层、网络层和数据链路层。
OSI七层模型与TCP/IP四层网络模型之间的对应关系如图2-2所示。
图2-2 OSI七层模型与TCP/IP四层模型的对应关系
OSI七层模型提供了通用的网络模型,是理论上的标准。而事实标准依旧是TCP/IP网络模型,目前绝大多数系统均基于TCP/IP网络模型实现。
Linux内核实现了完整的TCP/IP协议栈,图2-3展示了Linux操作系统中内核和应用与TCP/IP四层网络模型的对应关系。Linux操作系统分为内核空间和用户空间,其中内核实现的L2、L3、L4三层,分别对应TCP/IP分层模型中的数据链路层(不包含物理层)、网络层和传输层,内核并不涉及L4以上的各层。L4以上的应用由用户空间程序提供,所以常称用户空间的应用为L7应用。
图2-3 Linux操作系统与TCP/IP四层网络模型的对应关系
接下来进入主题:Linux系统中是如何完成用户报文的收发流程的?如图2-4所示,Linux内核对网络报文的处理有三种模式。
➢ 输入: 内核接收到外部报文,并将报文送到用户空间的应用上。
➢ 转发: 内核收到外部报文,此报文不归属本机的任何应用,内核将报文转发到外部系统上。
➢ 输出: 内核接收本机应用外发的报文,通过物理设备将报文发送到外部系统上。
图2-4 Linux内核处理网络报文
不管是输入、输出还是转发,在不考虑硬件卸载(Off load)的前提下,报文必须经过内核空间,所以内核是网络通信处理的核心。图2-4展示了通过物理设备收发报文的场景,对于虚拟设备,报文直接在内核空间中进行处理,很可能不会经过物理硬件。
本章将重点讨论Linux 5.14.4内核收发报文的完整流程。内核代码非常庞大,本书仅梳理内核处理网络报文的主体脉络,让读者对网络报文的处理过程有整体认知,所以无法对代码细节进行深入讨论。读者如果有兴趣,可自行扩展,深入学习Linux内核源码。
了解Linux系统收发报文的流程对于深入理解虚拟化网络原理有很大的帮助,建议不熟悉相关功能的读者结合内核源码阅读本章。