OSI 是「先定模型、再写实现」的产物——所以它完整,但没赢。 七层与四层不是压缩关系,是两套切法:三个层被并掉了,但活还在。
1.5.1 与 1.5.2 讲的是「分层的做法与说法」,这一节给出 ISO 的正式答案。 注意「参考模型」四个字:它不规定实现,只提供参照。
一、七层是怎么来的
OSI 的出身决定了它的命运:
| 时间 | 发生了什么 |
|---|---|
| 1970s 末 | ISO 开始制定 OSI,先画模型 |
| 1984 | OSI 七层模型正式发布 |
| 同期 | TCP/IP 已经在 ARPANET 上跑了多年 |
第三行是关键:OSI 是先有模型、后有实现;TCP/IP 是先有实现、后有文档。 等 OSI 的产品做出来,TCP/IP 已经装满了全世界的机器。 所以 OSI 输的不是理论,是时机与工程量: 一份「设计得很完整、但没人实现」的模型,比不上一份「能用、已部署」的规范。 这件事在技术史上反复出现—— 这也解释了为什么今天讲网络还要讲 OSI:不是因为它赢了,是因为它好用。 OSI 作为「参照系」的价值是真的:它的层名是中立的,可以用来描述任何一套协议栈, 包括 TCP/IP。 这就是「参考模型」与「协议规范」的分工。
二、七层与四层对照
两套模型并排看,就知道哪几层被并了:
| OSI | TCP/IP | 典型协议 |
|---|---|---|
| 7 应用层 | 应用层 | HTTP、DNS |
| 6 表示层 | 并入应用层 | 编码、压缩、加密 |
| 5 会话层 | 并入应用层 | 建/维持/结束对话 |
| 4 传输层 | 传输层 | TCP、UDP |
| 3 网络层 | 网络层 | IP、ICMP |
| 2 数据链路层 | 网络接口层 | 以太网、PPP |
| 1 物理层 | 网络接口层 | 双绞线、光纤 |
七层里有三个被并掉了:
表示、会话并入应用,物理并入数据链路——所以四层不是「砍掉三层」,是「合并同类项」。
第二、三行被并的原因很实际:编码转换和对话管理,各家应用的做法差别太大,
硬统一不如各自为政。
代价是:HTTP 要自己写 charset,Cookie 要自己管会话,每个应用都得把这两件事重做一遍。
最后两行常被误读成「物理层不重要」:TCP/IP 的「网络接口层」并不管物理细节,
它把「用什么样的线、什么样的信号」完全交给底层标准(802.3、802.11)。
所以严格说,TCP/IP 只有三层是自己定义的。
三、这张表怎么用
排障时要反着用这张表:
| 你听到的说法 | 在 TCP/IP 里落到哪 |
|---|---|
| 「表示层问题」 | 找不到对应层,只能查应用的编码声明 |
| 「会话层问题」 | 找不到对应层,只能查 Cookie/Token |
| 「物理层问题」 | 落到网卡与线路,看 CRC 错与协商速率 |
前两行是这张表最实用的地方:别人用 OSI 的词描述问题,你得翻译成 TCP/IP 的实体。 翻译不出来,就等于没定位。 第三行要注意「物理层问题」在 TCP/IP 里的表现:它不会告诉你「物理层错了」, 只会表现为「网卡速率协商成了 100M」「大量 CRC 错」「链路反复 up/down」。 这就是分层的好处也是坏处:下层坏了,上层只能看到症状。
四、动手 Demo:七层与四层,层名对得上吗
把两套模型的层名并排列出来,标出哪些被并掉了。 重点是看清「并」而不是「删」。
rows = [('7 应用层', '应用层', 'HTTP、DNS'),
('6 表示层', '并入应用层', '编码、压缩、加密'),
('5 会话层', '并入应用层', '建立/维持/结束对话'),
('4 传输层', '传输层', 'TCP、UDP'),
('3 网络层', '网络层', 'IP、ICMP'),
('2 数据链路层', '网络接口层', '以太网、PPP'),
('1 物理层', '网络接口层', '双绞线、光纤')]
for a, b, c in rows:
print('%-14s %-14s %s' % (a, b, c))
merged = [r for r in rows if '并入' in r[1]]
print('被并掉的层:%d 个' % len(merged))
实跑输出:
--------------------------------------------------------------------
七层与四层,层名对得上吗
--------------------------------------------------------------------
**OSI 是七层,TCP/IP 是四层**,**但两套模型不是「压缩」关系,是「两套切法」。**
OSI TCP/IP 典型协议
-------------------------------------------------------------
7 应用层 应用层 HTTP、DNS
6 表示层 **并入应用层** **编码、压缩、加密**
5 会话层 **并入应用层** **建立/维持/结束对话**
4 传输层 传输层 TCP、UDP
3 网络层 网络层 IP、ICMP
2 数据链路层 **网络接口层** 以太网、PPP
1 物理层 **网络接口层** 双绞线、光纤
**七层里有三层被并掉了**(表示、会话并入应用;物理并入链路),**剩下四个名字一一对上。**
**并掉的那两层不是「不需要」,是「不单独做一层」**:
**编码转换和对话管理都交给应用自己干**——**所以 HTTP 要自己写 `charset`,Cookie 要自己管会话。**
**这份表在排障时要反着用**:**说「表示层问题」在 TCP/IP 里找不到对应层**,
**只能落到「应用协议自己的编码声明」上。**
被并掉的层是 2 个(表示、会话), 但物理层也被并进「网络接口层」了——加起来是三层被合并,剩四个名字一一对上。 这个数容易数错,原因是「并入应用层」写了两次、「网络接口层」那两行没有「并入」字样。 所以读表时不能只按关键词数。 注意「网络接口层」这个名字:它不叫「物理层 + 链路层」,而是一个笼统的名字, 因为 TCP/IP 对这两层不作规定——有线、无线、光纤、PPP 都能跑,只要能把 IP 包装进去发出去。
30 秒实验
- 把
rows改成 5 行,把 TCP/IP 那边写成「应用/传输/网络/网络接口」四层,看能不能一一映射。 - 查一下 OSI 的第 5、6、7 层在 HTTP 里分别由哪些字段承担(提示:
Content-Type、Cookie、 请求方法)。 - 想一下:如果没有 OSI 这套层名,你会怎么描述「编码错了」这个问题?
常见误区
- 以为 OSI 是「过时的标准」。 它没赢,但作为参照系仍在使用,而且它的层名是中立的, 能描述任何协议栈。
- 以为四层是七层砍掉三层。 是合并:表示、会话并入应用,物理并入网络接口。 活还在,只是不单独占一层。
- 以为 TCP/IP 自己定义了物理层。 它对底下两层不作规定, 只要能装下 IP 包就行——这也是它能跑在一切介质上的原因。
自测三问(点开对答案)
1. OSI 为什么没有赢? —— **先定模型、再写实现,等产品做出来 TCP/IP 已经装满了全世界的机器。**输的不是理论, 是时机与工程量。 2. 七层里有哪几层被并进了四层模型? —— **表示层与会话层并入应用层,物理层并入网络接口层。**剩下应用、传输、网络、 网络接口四个名字一一对上。 3. 为什么 TCP/IP 的底层叫「网络接口层」而不是「物理层 + 链路层」? —— **因为它对这两层不作规定**,只要求能把 IP 包装进去发出去。所以有线、无线、光纤、PPP 都能跑。下一节把七层逐层讲一遍:每层各管一件事,各有一个能测的指标。
- ☐ (本节完,下一节 1.5.4 OSI参考模型中各个分层的作用)