1. OSI 模型简介
在网络计算的早期,并没有共同的规则来约束机器之间的通信。每个厂商都有自己的专有方案。问题在于,一个厂商的方案与另一个厂商的方案并不兼容。
OSI 模型通过将通信划分为七个层次来解决这个问题。
一个开放的、经全体厂商发布并接受的模型,使得能够搭建彼此兼容的网络。
2. OSI 模型描述了什么,又不描述什么
OSI 是 Open Systems Interconnection 的缩写,中文为“开放系统互连”。它是由 ISO(国际标准化组织)发布的一个参考模型:该参考模型于 1984 年以 ISO 7498 的编号问世,现行版本可追溯至 1994 年,编号为 ISO/IEC 7498-1,由 CEI(国际电工委员会)联合签署。这份文件不提供任何软件,也不提供任何线缆:它把让两台机器通信所要完成的工作,划分为七个不同的功能,从 1(最靠近物理介质)到 7(最靠近用户程序)依次编号。
其运作原理可用两句话概括。每一层都向其上方的层提供一项精确的服务,并依托其下方那一层的服务。每一层在逻辑上与对面机器上同一层级的层对话,方法是在收到的数据前加上一个头部,有时还补上一个块尾,例如以太网帧的校验和,发往这个对等层。
- 层:一组网络功能的集合,之所以归为一组,是因为它们处理同一类型的问题。
- 协议:两个同级的层为相互理解而遵循的一整套规则(消息格式、交换次序、允许的取值)。
- 头部:由某一层加在数据前面、发往对等层的控制字节。
- PDU(Protocol Data Unit,协议数据单元):某一层所处理对象的通用名称。每一层都给它一个常用名称:第 1 层是比特,第 2 层是帧,第 3 层是包,第 4 层是段(TCP)或数据报(UDP);再往上,只笼统称为数据,第 7 层称为消息。
- 封装:将上层数据包裹进一个新单元的动作,方向是从第 7 层向第 1 层下行。
一开始就要说明一点:OSI 模型是一个描述框架,并不是让 Internet 运转的软件协议栈。一套完整的 OSI 协议栈曾经存在,但在实践中未被采用。真正在网络上流通的是 TCP/IP 家族的协议,而它们并不总能整齐地归入某个 OSI 分格。该模型之所以仍被讲授和使用,是因为它提供了一套共同的词汇和一种有序的诊断方法。
3. 底层各层:从信号到端到端的对话
第 1 至 4 层负责传送数据。它们并不解读所传送内容的含义:它们的工作是让一串字节从一个点到达另一个点,做到无检测到的错误,并在所选协议保证时保持正确的顺序。
第 1 层——物理层(Physical)
物理层传送比特,也就是被转换为真实信号的 0 和 1:铜线上的电压、光纤中的光脉冲、无线电波。它的数据单元是比特。它还定义连接器及其针脚排布、信号的编码、介质的最大长度和传输速率。这里有双绞线电缆、RJ45 连接器、可插拔光模块、中继器和集线器(hubs)——集线器会把信号原样复制到其所有其他端口,不做任何决策。1000BASE-T(双绞线上的以太网)标准,或 IEEE 802.11 标准的无线电部分,描述的就是这一层级。
此层级常见的错误:明明是硬件故障,却去找配置问题。操作系统报告某条链路为活动状态,只能证明检测到了信号,并不能证明介质完好。一根被压扁的电缆、一个脏污的光模块,或一次失败的速率协商,会让错误计数器不断攀升,服务时好时坏。对表现异常的网络,首要的排查始终是检查介质。
第 2 层——数据链路层(Data Link)
链路层在接入同一本地网络的两台设备之间传送帧(frames)。它的数据单元是帧。它引入了一种寻址方式:MAC 地址(Media Access Control),以 48 位编码、用十六进制表示,写在网络接口中。它按传统被划分为两个子层,MAC 负责接入介质,LLC(Logical Link Control)负责与上层的衔接。有代表性的协议是以太网(IEEE 802.3)、Wi-Fi(IEEE 802.11)和 PPP(Point-to-Point Protocol)。有代表性的设备是交换机(switch),它会学习哪个 MAC 地址位于哪个端口之后,并只把帧发往该端口;至于广播帧,以及目的地址尚未学习到的帧,则会被原样复制到所有其他端口。帧尾包含一个 FCS(Frame Check Sequence),即校验和:若不匹配,该帧会被丢弃,而不是被修复。加入帧中的 802.1Q 标签,使得多个虚拟网络(VLAN)能够共存于同一条电缆上。
此层级常见的错误:以为目的 MAC 地址就是远端服务器的地址。当目的地位于本地网络之外时,目的 MAC 地址是出口路由器的地址,即默认网关。MAC 地址在每一跳路由器处被重写,而 IP 地址则端到端保持不变,地址转换的情况除外。IP 地址与 MAC 地址之间的对应关系,在 IPv4 中由 ARP 协议(Address Resolution Protocol)建立,在 IPv6 中由 NDP(Neighbor Discovery Protocol)建立。
# état des interfaces et de leurs adresses MAC
ip link show
# table des correspondances IP vers MAC apprises sur le réseau local
ip neigh show
第 3 层——网络层(Network)
网络层把包从一个网络传送到另一个网络:这是路由的层级。它的数据单元是包。有代表性的协议是 IP(Internet Protocol),有第 4 版和第 6 版。此处一台机器由一个 IP 地址加上一个子网掩码来标识,掩码指明地址的哪一部分表示网络、哪一部分表示机器。每台机器查询一张路由表来决定把包发往何处,并对一切非本地的目标使用其默认网关。TTL 字段(Time To Live)在每经过一个路由器时递减,从而避免一个包无休止地打转。ICMP(Internet Control Message Protocol)用于报告包所遇到的错误;它也是 ping 命令通过其回显消息所使用的协议。有代表性的设备是路由器和防火墙;路由协议 OSPF(Open Shortest Path First)和 BGP(Border Gateway Protocol)用于自动构建路由表。
此层级常见的错误:从一次 ping 得出过于宽泛的结论。有响应,只能证明存在一条通往该机器的路径、且它响应 ICMP;它并不能说明应用服务的情况。反过来,没有响应也不能证明发生了故障,因为 ICMP 常被有意过滤。第二个常见错误:子网掩码设置错误。此时机器会以为目的地就在自己的网络上,于是尝试进行 ARP 解析而不经过网关,结果永远得不到响应。
# adresses et masques configurés sur les interfaces
ip address show
# table de routage, dont la route par défaut
ip route show
第 4 层——传输层(Transport)
传输层保障两个程序之间、而不再是两台机器之间的端到端对话。它的数据单元在 TCP 中称为段,在 UDP 中称为数据报。它引入了端口的概念,即一个介于 0 到 65535 之间的编号,用来标识机器上的目标进程:正是它让同一台服务器能够同时托管多个服务。TCP(Transmission Control Protocol)通过三次握手(SYN、SYN-ACK、ACK)建立连接,对字节编号,确认已收到的内容,重传缺失的部分,把数据重新排序,并调节速率。UDP(User Datagram Protocol)不建立连接,不重传任何内容,只用一个简短的头部:它尤其被 DNS、实时语音和视频所使用,也是 QUIC 协议的承载。
此层级常见的错误:从一个开放端口就断定服务正常运行。一个接受连接的端口,表明有一个进程在监听、且网络路径未被阻断;但应用仍可能返回一个错误,或什么都不返回。另一个常见的混淆:把惯用的端口号当成一种强制规定。一个服务可以监听任何空闲端口,惯用编号只是一种约定。最后,UDP 并不是一种“质量较差”的协议:对于实时流,重传一个到达过晚的包毫无意义,此时不重传反而成了优势。
# ports en écoute, en TCP et en UDP, affichés en numérique (option -n : aucune résolution des noms de services)
ss -tuln
4. 高层各层:数据的呈现与应用层对话
第 5 层——会话层(Session)
会话层负责开启、维持、同步并关闭两个应用之间的对话。它决定由谁发言,设立恢复点以便在传输中断后重新启动而无需从头再来,并在交换结束时释放资源。它的数据单元只是笼统地称为数据。很少有协议能整齐地归入此层;通常提到的是远程过程调用 RPC(Remote Procedure Call)和 NetBIOS 会话服务。没有哪种网络设备专门工作在这一层级。
此层级常见的错误:把 OSI 意义上的会话,与某个网站的“用户会话”(那种基于 cookie 或令牌的会话)相混淆。后一种机制完全由应用管理,属于第 7 层。另一个陷阱:非要在 TCP/IP 协议栈里指定一个第 5 层协议。实际上,会话功能在其中要么由 TCP 承担,要么直接由应用承担。
第 6 层——表示层(Presentation)
表示层负责数据的形式,使发送方所写的内容能被接收方以相同方式解读,即便两台机器并不以相同方式表示数据。它涵盖字符编码(ASCII、UTF-8)、诸如 JPEG 的文件格式、诸如 ASN.1(Abstract Syntax Notation One)的序列化规则、压缩和加密。它的数据单元同样笼统地称为数据。
此层级常见的错误:以为加密只属于、且仅属于这一层。加密存在于多个层级:WPA(Wi-Fi Protected Access)在第 2 层保护无线电链路,IPsec(Internet Protocol Security)在第 3 层保护包,TLS(Transport Layer Security)在传输层之上保护数据流。TLS 在 OSI 模型中的确切归类因作者而异,在第 5、6、7 层之间存有争议,因为 TLS 是为 TCP/IP 协议栈而非 OSI 设计的。知道 TLS 保护什么,比给它安一个编号更有用。
第 7 层——应用层(Application)
应用层为程序提供其访问网络的接口,并承载有用数据。它的数据单元是消息。有代表性的协议是用于 Web 的 HTTP(HyperText Transfer Protocol)、用于将名称翻译为 IP 地址的 DNS(Domain Name System)、用于发送电子邮件的 SMTP(Simple Mail Transfer Protocol)、用于收取邮件的 IMAP(Internet Message Access Protocol)、用于远程管理的 SSH(Secure Shell),以及用于文件传输的 FTP(File Transfer Protocol)。
此层级常见的错误:把第 7 层与软件本身相混淆。浏览器不是第 7 层:第 7 层是该浏览器所讲的协议,本例中即 HTTP。这一区分有直接的实际后果。所谓“第 7 层”防火墙会读取应用协议的内容,例如所请求的主机名或所使用的 HTTP 方法,而第 4 层的过滤只能看到地址和端口号。
5. 一次 HTTP 请求穿越七层的旅程
以一台工作站向远端服务器请求一个网页为例。在请求发出之前,已经完成了一次完整的通信:DNS 解析,它把站点名称翻译为 IP 地址,同样要穿越七层,通常在 UDP 之上进行。地址一旦得知,传输层就建立 TCP 连接,随后请求出发。
去程:封装
- 第 7 层:浏览器编写一个 HTTP 请求,带有方法、路径和各个头部,其中包括指明所请求站点的 Host 头部。
- 第 6 层:字符按约定的字符集进行编码,在 HTTPS 中,内容由 TLS 加密。
- 第 5 层:该对话被挂接到当前连接上,连接充当此次交换的上下文。
- 第 4 层:TCP 把数据切分为若干段,并在每段前面放上一个头部,其中包含源端口(由系统在临时端口中自由选取)、目的端口、一个序列号和若干标志位。
- 第 3 层:IP 加上源地址、目的地址和一个 TTL。系统查询路由表:由于目的地非本地,包被导向默认网关。
- 第 2 层:以太网把本地接口的 MAC 地址作为源、把网关的 MAC 地址作为目的(通过 ARP 获得)加上,并以校验和 FCS 结束该帧。
- 第 1 层:帧被转换为信号,并在介质上发出。
沿途,每台设备只上溯到它所需要的层级。交换机读取第 2 层头部,查询其 MAC 地址表,把帧转发到正确的端口,不触及其余部分。路由器上溯到第 3 层:它递减 TTL,依据其路由表选择出口接口,然后销毁旧帧并制作一个新帧,配上适配下一段链路的新 MAC 地址。至于 IP 地址,则保持不变,除非施加了地址转换。这个循环在每一跳重复,直至到达服务器所在的网络。
到达与返回:解封装
在服务器上,过程反向进行,从第 1 层上溯到第 7 层。信号重新变回一串比特。接口核对校验和与目的 MAC 地址,随后去掉以太网头部。第 3 层核实目的 IP 地址确为自身,随后去掉 IP 头部。TCP 把各段重新排序,确认已收到的内容,索要缺失的部分,并把重建好的数据流交给监听所请求端口的进程。TLS 解密,随后 Web 服务器终于读到浏览器当初所写的 HTTP 请求。
响应遵循完全相同的机制,方向相反:服务器产生一个包含状态码和所请求内容的 HTTP 消息,该消息从第 7 层向第 1 层封装,源端口和目的端口对调,随后在工作站上解封装。一次流量抓包会把这一结果显示为层层嵌套的头部,从最外层的以太网,到最内层的 HTTP。
# afficher le détail d’un échange HTTP, en-têtes compris
curl -v https://example.com
# observer les paquets échangés sur le port 443
sudo tcpdump -n -i any port 443
6. OSI 与 TCP/IP:两个模型,两种用途
TCP/IP 模型(尤其由 RFC 1122 所描述)把同样的工作划分为四层,而非七层:网络接入层、Internet 层、传输层、应用层。它是基于已经运转的协议构建的,而 OSI 则是作为一个先行的理论框架而设计的。两者之间的大致对应如下。
- 网络接入层(TCP/IP)对应 OSI 的第 1、2 层:物理介质与帧。
- Internet 层对应第 3 层:IP 寻址与路由。
- 传输层对应第 4 层:TCP 和 UDP、端口。
- 应用层把第 5、6、7 层合在一起:会话、数据格式与应用协议。
在实践中,这两个模型并不相互竞争,而是服务于不同的用途。TCP/IP 描述真正运转的东西:正是它的协议被实现在操作系统和设备之中。OSI 则提供共享的词汇,以及在日常业务交流和厂商文档中使用的编号:一台“三层交换机”、一台“四层或七层负载均衡器”、一次“二层事故”,都指向明确的现实,对方能立刻理解。网络认证的参考体系同样依托 OSI 的编号。
不过这种对应有其局限,坦率地指出这些局限,比硬套分类更为诚实。TCP/IP 并不区分会话、表示和应用。像 TLS 或 QUIC 这样被广泛使用的协议,并没有一个取得共识的 OSI 分格。有些著作还讲授一种五层的混合模型,其中 OSI 的第 5 至 7 层被合并为单一的应用层。花大量时间去裁定某个协议的编号收益甚微;知道它解决什么问题则收益更大。
7. 小结与诊断方法
- 第 1 层——物理:比特——电缆、光纤、光模块、中继器。
- 第 2 层——数据链路:帧——以太网、Wi-Fi、MAC 地址、交换机。
- 第 3 层——网络:包——IP、ICMP、路由器、路由表。
- 第 4 层——传输:段(TCP)或数据报(UDP)——端口、连接。
- 第 5 层——会话:数据——对话的开启、维持与关闭。
- 第 6 层——表示:数据——编码、格式、压缩、加密。
- 第 7 层——应用:消息——HTTP、DNS、SMTP、SSH、FTP。
该模型在运维中的主要价值,是提供一个排查的顺序。面对一个无法访问的服务,做法是逐层向上排查,而不是随意乱试:每一层只有在其下方各层已经正常时才能工作。
- 检查介质和链路状态:电缆、端口、接口是否活动、错误计数器。
- 检查本地邻居:机器能否看到它的网关、IP 到 MAC 的对应是否已学习到、VLAN 是否正确。
- 检查寻址与路由:地址、掩码、默认路由、某台远端设备是否响应。
- 检查传输:是否有进程在预期端口上监听、连接能否建立、是否有过滤将其阻断。
- 检查应用:协议是否响应、状态码是什么、错误消息是什么、服务器端日志如何。
8. 注意事项与后续路径
- 各层之间的界限是一种描述工具,而非物理规则:多个日常使用的协议都跨越了这些界限。
- 某一层有响应,绝不保证上层各层能正常工作;反之则成立,某个上层能工作,就证明其下方所有层都在工作。
- MAC 地址在每一跳路由器处改变,IP 地址则端到端保持稳定,地址转换的情况除外。
- 安全功能出现在多个层级:第 4 层的端口过滤、第 7 层的协议检查、第 2、3 层或传输层之上的加密。指明所涉及的层级,可以避免事故分析时的误解。
这份材料合乎逻辑的后续,是深入底层各层——正是它们引发最多的事故:第 3 层的 IP 寻址与子网划分,第 2 层的交换与 VLAN,然后借助一次流量抓包来观察一个真实的 TCP 连接,以便在字节中重新找到这里所描述的各个头部。
本文的原始文本未被网络存档保存:页面抓取在正文之前就中断了。仅其引言留存,在此作为开篇沿用。其余部分于 2026 年 9 月 9 日重新撰写,随后逐点校阅并订正。
