本节摘要:分层是计算机网络最核心的工程思想——把复杂系统按职责切成层,层间只通过固定接口交互。本节讲清 OSI 七层与 TCP/IP 四层的对应、每层的职责一句话画像、封装与解封装的完整过程,并讨论分层在真实工程里的代价与取舍。
上一节我们认识了货物,这节看车间布局。数据包的环球旅行要穿过五道工序,每道工序各管一段:物理层管信号、链路层管相邻两台设备、网络层管跨网段寻路、传输层管进程到进程、应用层管业务语义。分层不是学术洁癖,而是让这五个问题互不纠缠的隔离手段。
想象如果网络不分层会发生什么:换一种新的无线介质,HTTP 的代码也得改;每个应用自己实现重传和路由,全球几百万个应用各写一套,bug 无穷无尽。分层的本质是关注点分离 + 接口契约:
一个真实例证:Wi-Fi 和以太网的物理介质完全不同——一个是无线电波,一个是铜线上的电压——但你的浏览器完全无感。因为介质差异被压在物理层和链路层内部,往上呈递的都是"IP 报文"这个统一格式。网卡驱动换了三代,Chrome 一行没改。
OSI 是国际标准组织的理论模型,分层细致但落地慢;TCP/IP 是互联网"先跑起来再说"的工程实践,最终成为事实标准。对照如下:
| OSI 七层 | TCP/IP 四层 | 职责一句话 | 本章旅程的叫法 |
|---|---|---|---|
| 应用层 | 应用层 | 定义业务消息格式:网页、邮件、域名解析 | 第五站 |
| 表示层 | (并入应用层) | 编码、压缩、加密——TLS 实际干这活 | 安全防线 |
| 会话层 | (并入应用层) | 会话管理,现代由应用自己管 | 安全防线 |
| 传输层 | 传输层 | 进程到进程:端口、可靠性、流量控制 | 第四站 |
| 网络层 | 网络层 | 主机到主机:IP 寻址与路由 | 第三站 |
| 数据链路层 | 链路层 | 相邻节点:成帧、MAC 寻址、差错检测 | 第二站 |
| 物理层 | 物理层 | 比特流变信号上介质 | 第一站 |
记忆法不用背七层名词,记四个问题即可:信号怎么表示(物理)、邻居怎么说话(链路)、远方怎么找到(网络)、程序怎么对接(传输)。业务语义(应用)在这四问之上自由发挥。
发送方自上而下加信封,接收方自下而上拆信封。用一个发送 100 字节 HTTP 消息的过程走一遍:
发送方向下(封装),每层添加自己的首部: 应用层: "GET /index.html HTTP/1.1 Host: example.com" ← 100 字节消息 ↓ 交给传输层 传输层: [TCP头20B | 数据100B ] ← 段 Segment ↓ 交给网络层 网络层: [IP头20B | TCP头 | 数据 ] ← 报文 Packet,总 140B ↓ 交给链路层 链路层: [帧头14B | IP报文 | 帧尾FCS 4B ] ← 帧 Frame,总 158B ↓ 交给物理层 物理层: 01010110... 比特流变成电信号/光信号发出 接收方向上(解封装):网卡收帧 → 校验 FCS → 拆帧头得 IP 报文 → 查 IP 是否发给本机 → 拆 IP 头得 TCP 段 → 按端口号分发给对应进程 → 进程读到 HTTP 消息。中间任何一跳路由器只拆到 IP 层为止。
注意"中间系统只拆到网络层"这个细节:路由器看 IP 信封转发,绝不碰 TCP 头;交换机更浅,只看以太网信封。每台设备只读到它完成任务所必需的最外层信封,这正是分层带来的权限隔离——交换机不需要懂端口,路由器不需要懂重传。
用 TCP 自带工具观察分层是否真的存在:
# 查看本机协议栈逐层的统计数据(Linux 命令,Windows 可用 netstat -s) $ netstat -s | head -20 Ip: 31244501 total packets received 0 forwarded 1583 incoming packets discarded 2971 incoming packets delivered 3401 requests sent out 12 dropped because of missing route Tcp: 2861 active connection openings 12 failed connection attempts 44 connection resets received 3317 segments received 3512 segments send out 9 segments retransmitted ← 有重传,说明"尽最大努力"管道确实丢过货 解读:内核把 IP 层和 TCP 层的账本分开记——统计本身就是分层的直接证据。 failed connection attempts 与 resets 是第 5 章排错时的重要线索。
分层不是越多越好。每层封装消耗首部开销(上面例子里 158 字节中有 58 字节是信封,占了三成以上);每层过一道队列增加时延;层间边界还容易滋生"该归谁管"的扯皮——TCP 队头阻塞就是传输层与 HTTP 多路复用职责边界上的经典摩擦,HTTP/3 干脆绕开 TCP 改用 UDP 自建(第 6 章细讲)。
现代协议设计经常"跨界作案":QUIC 在应用层重做可靠传输,SDN 把路由决策从设备里抽出来。理解分层的价值,也要理解它何时成为枷锁——这是从"学会网络"到"评价网络设计"的分水岭。
💡 关键直觉:把协议栈当作"合同分包体系"而非"神圣七层"。层次的存在是为了隔离变化与复用实现;当某条边界妨碍性能时,工程师会毫不犹豫地重组边界。
下一节补上旅程的仪表盘——带宽、延迟、吞吐,出发前的最后一课。