开放系统互联(OSI)模型定义了7个逻辑网络层。最下面是物理层,即硬件环境。最上面是应用层,其中运行着用户空间软件进程。下面来说说这7层。
(1)物理层:提供电信号和一些底层的细节。
(2)数据链路层:处理端点间的数据传输。最常见的数据链路层标准是以太网。Linux以太网网络设备驱动程序就位于这一层。
(3)网络层:负责数据包转发和主机编址。本书讨论Linux内核网络子系统实现的最常见网络层协议:IPv4和IPv6。Linux还实现了其他不那么常见的网络层协议,如DECnet,但本书将不对其作出讨论。
(4)协议层/传输层:完成结点间的数据发送。TCP和UDP是最著名的传输层协议。
(5)会话层:处理端点间的会话。
(6)表示层:处理数据传送和格式设置。
(7)应用层:向最终用户应用程序提供网络服务。
图1-1显示了OSI模型定义的7个逻辑网络层。
图字如下,按照原文从上至下顺序:
Application 译为 应用层
Presentation 译为 表示层
Session 译为 会话层
Transport 译为 传输层
Network 译为 网络层
Data Link 译为 数据链路层
Physical 译为 物理层
图1-1 OSI 7层模型
图1-2显示了Linux内核网络栈所涉及的3层。其中,L2、L3和L4这三层分别对应于OSI 7层模型中的数据链路层、网络层和传输层。从本质上说,Linux内核栈的任务就是将接收到的数据包从L2(网络设备驱动程序)传递给L3(网络层,通常为IPv4或IPv6)。接下来,如果数据包目的地为当前设备,Linux内核网络栈就将其传递给L4(传输层,应用TCP或UDP协议侦听套接字);如果数据包需要转发,就将其交还给L2进行传输。对于本地生成的出站数据包,将从L4依次传递给L3和L2,再由网络设备驱动程序进行传输。这个过程分很多阶段,期间可能会发生如下行为。
根据协议规则(如IPsec规则或NAT规则),可能需要对数据包进行修改。
数据包可能被丢弃。
数据包可能导致设备发送错误消息。
可能会对数据包进行分段。
可能需要重组数据包。
需要计算数据包的校验和。
图1-2 Linux内核网络栈的分层结构
内核并不涉及L4之上的各层。这些层(会话层、表示层和应用层)的任务由用户空间应用程序来实现。此外,Linux内核也不涉及物理层(L1)。
如果你觉得这些内容难以消化,不用担心,本书后面将详尽深入地阐述它们。