网络分层模型
网络分层模型
为什么要分层
设想一个场景:你和同事在 2 月份开始写一个电商项目。一个月后,公司发现项目里"订单系统"和"商品系统"耦合太紧,改一个地方另一个就崩。CTO 让你们重新设计,你把订单系统拆成 4 个模块:接口层、业务逻辑层、数据访问层、数据库。每个模块只和它上下相邻的模块通信,互不知道内部细节。
这就是分层的目的:把一个复杂问题拆成几层,每层只关心自己的事,通过"接口"和相邻层对话。网络是地球上最复杂的分布式系统,不分层根本写不出来。
ISO 早期搞了一个 7 层参考模型(OSI),后来互联网工程界搞了一个 4 层实际模型(TCP/IP)。两个模型并行存在几十年,OSI 学术味儿浓,TCP/IP 工程味儿浓。教学上一般先讲 OSI 七层让你建立结构感,再讲 TCP/IP 四层让你理解互联网实际怎么跑。
OSI 七层模型
OSI 是国际标准化组织(ISO)在 1984 年发布的参考模型。从下到上七层:
| 层 | 名字 | 解决什么问题 | 典型协议/技术 |
|---|---|---|---|
| 1 | 物理层 | 信号如何在 0/1 和电/光之间转换 | 双绞线、光纤、Wi-Fi、RJ45 |
| 2 | 数据链路层 | 相邻两台设备之间怎么可靠传数据 | 以太网、MAC 地址、ARP、交换机 |
| 3 | 网络层 | 跨多个网络怎么找到目的地址 | IP 协议、ICMP、路由器、IPsec |
| 4 | 传输层 | 端到端怎么传、怎么控制可靠/速度 | TCP、UDP、QUIC |
| 5 | 会话层 | 通信双方怎么维持会话状态 | NetBIOS、RPC |
| 6 | 表示层 | 数据怎么表示、怎么加密 | SSL/TLS、JPEG、ASCII |
| 7 | 应用层 | 应用程序怎么用网络 | HTTP、DNS、SMTP、FTP |
这七层有个规律:层数越低越接近硬件,越高越接近用户。物理层是真实的铜线光纤,应用层是浏览器和服务器直接打的交道。
每一层只做自己这一层的事,对其他层"透明"。这种设计有个巨大的好处:你可以替换某一层的实现而不影响其他层。比如你把物理层从双绞线换成光纤,第 3 层以上的 IP、TCP、HTTP 完全感知不到。同理,IPv4 升级到 IPv6 不会影响你的浏览器。
TCP/IP 四层模型
OSI 是个理想模型,但互联网真正落地用的是 TCP/IP 四层模型。原因是 1983 年 ARPANET 全面切到 TCP/IP 协议时,OSI 还在纸面上。等 OSI 出标准,互联网已经跑起来了。
四层模型从下到上:
| 层 | 名字 | 对应 OSI | 协议 |
|---|---|---|---|
| 1 | 网络接口层 | 物理层 + 数据链路层 | 以太网、Wi-Fi |
| 2 | 网际层 | 网络层 | IP、ICMP、ARP |
| 3 | 传输层 | 传输层 | TCP、UDP |
| 4 | 应用层 | 会话层 + 表示层 + 应用层 | HTTP、DNS、TLS |
把 OSI 的 5、6、7 三层合到应用层是务实的选择:现实里没人单独实现"会话层"或"表示层"——TLS 加密嵌在应用里,HTTP 自己管会话状态。
具体例子:你浏览器打开 https://www.example.com,数据流在各层的封装是这样的:
应用层: GET / HTTP/1.1 + Host: www.example.com [HTTP 消息]
传输层: [TCP 头][HTTP 消息] [TCP 段]
网际层: [IP 头][TCP 头][HTTP 消息] [IP 数据报]
网络接口层: [MAC 头][IP 头][TCP 头][HTTP 消息][MAC 尾] [以太网帧]到了对端反过来剥掉:先剥 MAC 头得到 IP 头,再剥 IP 头得到 TCP 头,再剥 TCP 头得到 HTTP 消息,最终把 HTTP 消息交给 Web 服务器进程。
为什么要分这么多层
反对意见:七层太多了,一个 HTTP 请求从上到下封装四次再从下到上解封四次,开销很大。没错,但分层的收益远大于开销:
第一,独立演进。 HTTP 从 1.0 演到 1.1、2.0、3.0,TCP 没动。TCP 从诞生到现在(40 多年)核心算法没大改,IP 从 v4 演到 v6。如果 HTTP 和 TCP 绑死,每次 HTTP 升级都得连带改 TCP 协议,互联网早乱套了。
第二,故障定位简单。 网络出问题时,工程师能快速判断是哪一层挂了。ping 不通是网络层问题(IP 路由不到),tcp 三次握手失败是传输层问题(防火墙拦了 SYN),网页 404 是应用层问题(URL 写错)。分层让排查有章可循。
第三,多厂商协作。 网络设备厂商 A 做物理层网卡,B 做 IP 路由器,C 做 TCP 协议栈。只要大家都遵守 IEEE / IETF 标准,不同厂商的设备能互通。分层就是标准化的边界。
第四,简化教学。 学生一次只学一层,不用一上来就理解全栈。物理层是电子工程关心的事,传输层是操作系统内核关心的事,应用层是程序员关心的事。各管各的,互不干扰。
一个分层出错的真实例子
2018 年某大型互联网公司内网故障:所有用户访问自家 APP 都返回 502。年轻工程师排查三小时没找到原因。
最后是有经验的老工程师介入,在应用服务器上抓包,发现 TCP 握手是成功的,HTTP 请求是发出去的,但服务器返回的 HTTP 响应在传输层就被截断了。响应头的第一个字节是 SYN(重传)而不是 HTTP 状态行。
原因:他们以为那台是"应用服务器",但实际是"反向代理 + 四层负载均衡",后端真实的应用服务器在另一个机房。TCP 三次握手跟代理完成,HTTP 请求由代理转发到后端。代理升级时新版本有 bug,导致 HTTP 响应被错误地当成 TCP 重传包发回客户端。
排错的关键就是先确认"我抓包看到的对端,到底是不是真正的对端"。分层视角一上来就让你能问"我现在是在跟哪一层说话"。
思考题
- OSI 七层模型和 TCP/IP 四层模型的核心差异是什么?为什么 ISO 失败的协议最终在工业界赢了?(提示:先来后到、复杂度、政府/学术界/工业界三方博弈)
- 如果让你设计一个全新协议栈用于月球基地通信(地月 38 万公里,RTT 1.3 秒,会话可能中断几十秒),你会保持现有分层吗?为什么?(提示:TCP 重传在 1.3s RTT 下是否高效、会话中断对哪层影响最大)
- 数据从应用层到物理层被封装了 4 次。每一层都加了"头部"(或尾部)。这些头部里最关键的字段是什么?如果让你只保留 1 个字段,你会保留哪层、哪个字段?(提示:源 IP、目的 IP、源 MAC、目的 MAC、源端口、目的端口、HTTP Host)
延伸阅读
- 《深入浅出计算机网络》(高军)第 1 章
- RFC 1122: Requirements for Internet Hosts
- 动手实验:用
curl -v https://www.example.com观察 TCP/TLS 握手过程 - 动手实验:在 Wireshark 抓一个 HTTP 请求,从帧 1 开始逐层剥开,看每层头部加了哪些字节