每一层都是为解决上一层的某个具体缺陷才加进来的。 「作用」这句话很虚,落到每层一个可测的指标上就具体了。
1.5.3 给了层名,这一节逐层讲「管什么、能测什么」。 这一节会用到本机实测值,数字都是当场读出来的。
一、逐层一句话
每层只解决一个问题:
| 层 | 解决什么 | 一句话 |
|---|---|---|
| 1 物理层 | 比特怎么变成信号 | 电压、光、波形 |
| 2 链路层 | 一段线内怎么送 | MAC、帧、CRC |
| 3 网络层 | 跨网段怎么走 | IP、路由 |
| 4 传输层 | 交给哪个程序 | 端口、重传 |
| 5~7 高层 | 内容怎么理解 | 会话、编码、语义 |
第四行是本机多任务的基础:没有传输层,一台机器同时跑浏览器和下载器就没法区分。 端口号就是「这一层给每个程序发的门牌」。 第三行是「互联网」这个词的由来:网络层把无数个互不相干的网络连成一个「网际网」, 每一段可以自己定技术,只要都跑 IP。 这是 IP 最重要的设计选择。
二、每层一个可测的指标
把「作用」翻译成能读出来的数:
| 层 | 可测指标 | 本机实测 |
|---|---|---|
| 物理层 | 链路速率 | 144 Mbps |
| 链路层 | MTU | 1500 字节 |
| 网络层 | 本机 IP | 192.168.3.152 |
| 传输层 | 临时端口 | 54402 |
| 应用层 | 能解析的协议 | HTTP(自建服务) |
这五行从上到下正好是一条封装链: 速率决定一个比特多久发完,MTU 决定一个帧最多装多少,IP 决定送到哪台机器, 端口决定交给哪个程序,协议决定怎么解释内容。 第二行那个 1500 要注意:它不是这块网卡的能力上限,是以太网的标准值。 所有网卡都报 1500,是因为这是协议约定,不是硬件差异。 真要用 9000 的大帧(Jumbo Frame),两端和中间所有设备都得改。 第四行那个 54402 是「临时端口」:它每次连接都可能不一样,由操作系统从高位区间里挑。 这也解释了为什么服务端要固定端口——客户端找服务端得靠一个事先约好的号。
三、缺一层会怎样
反证法最能说清每层的必要性:
| 去掉哪层 | 立刻出什么问题 |
|---|---|
| 传输层 | 多个程序没法共用一条链路 |
| 网络层 | 跨网段走不通,只能同网段通信 |
| 链路层 | 连一个帧都发不出去 |
第一行在单机上看不出来:只跑一个程序的时候,没有端口也能通信。 但只要同时开两个浏览器标签,就必须有端口来区分。 所以这一层的价值,恰恰在多任务时最明显。 第二行解释了「局域网能通、上不了外网」这类故障:多半是网络层的问题(网关、路由、 IP 配置),而不是线断了。 这份反证表还有一个用法: 排障时从下往上排除—— 先确认链路通(能不能 ping 通网关),再确认网络层(能不能出去),最后确认传输层与应用层。 顺序错了会浪费大量时间。
四、动手 Demo:每一层各管一件事,各有一个能测的指标
从本机读五个数,一个层一个。 读不到的就明说读不到,不编。
import socket, psutil, _netsim as N
up = [x for x in N.up_nics() if x[3]]
name, mac, ips, speed = up[0]
print('物理层 链路速率 %s Mbps' % (speed or '读不到'))
print('链路层 MTU %d 字节' % psutil.net_if_stats()[name].mtu)
ip = [a.address for a in ips if a.family == socket.AF_INET][0]
print('网络层 本机 IP %s' % ip)
s = socket.socket()
s.bind(('0.0.0.0', 0))
print('传输层 临时端口 %d' % s.getsockname()[1])
s.close()
print('应用层 解析协议 %s' % N.__name__)
实跑输出:
--------------------------------------------------------------------
每一层各管一件事,各有一个能测的指标
--------------------------------------------------------------------
**「各分层的作用」这句话很虚,落到可测的量上就具体了。**下面每一层给一个本机能读到的数。
层 可测的指标 本机实测值
-----------------------------------------------------
物理层 链路速率 144 Mbps
数据链路层 MTU 1500 字节
网络层 本机 IP 192.168.3.152
传输层 临时端口 54402
应用层 能解析的协议 HTTP(本 Demo 自建)
**五个指标一个一个往下走,正好是一条封装链**:
**速率决定一个比特多久能发完,MTU 决定一个帧最多装多少。**
**IP 决定送到哪台机器,端口决定交给哪个程序,协议决定怎么解释内容。**
**注意「MTU 1500」这个数在本机所有网卡上都一样**——**它不是网卡的能力上限,是以太网的标准值。**
**真要用更大的帧(Jumbo Frame),两端与中间所有设备都得改。**
**缺一层会怎样**:**没有传输层,多个程序没法共用一条链路;没有网络层,跨网段就没法走。**
**每一层都是为了解决上一层的某个具体缺陷才加进来的。**
五个数一次全读出来,而且都能和「层」对上号: 144 Mbps 是协商速率,1500 是 MTU,192.168.3.152 是 IPv4 地址,54402 是临时端口。 MTU 在本机所有网卡上都报 1500:这不是巧合,是以太网的标准值。 所以这一格其实测不出「网卡差异」,只能测出「协议约定」。 临时端口每次跑都不一样:这是操作系统从高位区间随机挑的, 所以这个数只能说明「这一层在工作」,不能当固定值记。
30 秒实验
- 连跑三次,看临时端口变不变。
- 把 MTU 打出来对比无线网卡与有线网卡(如果你两个都在线)。
- 试着读出「默认网关」——psutil 没有这个接口,读不到就承认读不到,别硬编一个数。
常见误区
- 以为每层都有独立的「硬件」。 层是逻辑划分,同一块网卡同时干物理层和链路层的活。
- 以为 MTU 1500 是网卡能力上限。 它是以太网协议的标准值,所有网卡都报这个数, 改它要整条路径一起改。
- 以为排障可以随便从哪层开始。 从下往上排除效率最高:先链路、再网络、再传输、最后应用。
自测三问(点开对答案)
1. 传输层解决的是什么问题? —— **「交给哪个程序」**:端口号给每个程序发门牌,让多个程序能共用一条链路。 单程序时看不出价值,多任务时必不可少。 2. 为什么说网络层是「互联网」这个词的由来? —— **它把无数个互不相干的网络连成一个网际网**,每一段可以自己定技术,只要都跑 IP。 3. MTU 在每块网卡上都报 1500,说明了什么? —— **说明它是协议约定,不是硬件能力上限。**改它(Jumbo Frame)要两端和中间所有设备一起改。下一节进入 1.6:一次完整的七层通信——用「打开一个网页」把七层从头到尾走一遍。
- ☐ (本节完,下一节 1.6.1 7层通信)