「TCP/IP」这个名字取的是最核心的两个协议,但它代表的是一族协议。 IP 头里那个 8 位的「协议」字段,就是这一族的分发开关。
2.1 讲完了历史,2.2 讲标准。 这一节先把「TCP/IP 到底指什么」说清楚,后面几节才讲 RFC 与流程。
一、一族协议,不是一个协议
本机能查到的成员:
| 协议名 | 协议号 | 属于哪一层 |
|---|---|---|
| ip | 0 | 网络层(自身) |
| icmp | 1 | 网络层的助手 |
| tcp | 6 | 传输层 |
| udp | 17 | 传输层 |
| ipv6 | 41 | 网络层 |
| esp | 50 | 安全(IPsec) |
| ah | 51 | 安全(IPsec) |
第一行那个 0 不是错误:IP 自己的协议号是 0,因为它不是「装在 IP 上面」的,它就是 IP。 这一点很少被提到,但看协议号表时会立刻撞上。 第二行那个 ICMP 严格说不是「传输层」:它是 IP 层的助手,负责报错(目标不可达、 超时)与探测(ping、traceroute)。它装在 IP 里,协议号 1,但它处理的是「IP 自己的问题」。
二、为什么用这两个名字
命名反映的是「当年最核心的两个问题」:
| 名字里的部分 | 解决什么 | 现在还是核心吗 | |---|---| | TCP | 可靠传输 | 是,但 UDP 也起来了 | | IP | 跨网寻址 | 一直是,没变过 |
第一行值得多想一层:当年「可靠」是默认需求,所以用 TCP 命名整个协议族。 但今天视频、游戏、DNS 全在用 UDP,「TCP/IP」这个名字其实已经不太准了。 更准确的说法是「IP 协议族」——因为 IP 才是那个所有人都绕不过去的东西。 第二行说明为什么 IP 不可替代: 你可以不用 TCP(用 UDP)、不用 HTTP(用自定义协议),但只要想跨网络通信,就必须用 IP。 所以「IP 是窄腰」这个说法是对的—— 上面可以有无数种协议,下面可以有无数种介质,中间只有 IP 一个。
三、分工表
按层次归一下类:
| 层 | 成员 | 管什么 |
|---|---|---|
| 网络层 | ip、ipv6、icmp | 寻址、路由、报错 |
| 传输层 | tcp、udp、sctp | 端口、可靠性 |
| 应用层 | http、dns、smtp…… | 业务语义 |
| 安全 | esp、ah | 加密与认证 |
第四行那个「安全」不是一层,是「横切」的:ESP 与 AH 装在 IP 之上、传输层之下, 所以它们能同时保护 TCP 和 UDP。 这就是 IPsec 的「传输模式」与「隧道模式」的区别来源。 第三行那些应用层协议数量最多: 因为这个位置最自由——只要跑在 TCP 或 UDP 上,想定义什么协议都行,不需要任何人批准。 所以「TCP/IP 协议族」这个名字里,真正有限制力的只有底下两层。
四、动手 Demo:「TCP/IP」其实是一整个协议族
把本机协议表里能查到的成员列出来。 查不到的会显示「本机没登记」,那也是有用信息。
import socket
for name in ('ip', 'icmp', 'tcp', 'udp', 'ipv6',
'gre', 'esp', 'ah'):
try:
print('%-6s %d' % (name, socket.getprotobyname(name)))
except OSError:
print('%-6s 本机没登记' % name)
实跑输出:
--------------------------------------------------------------------
「TCP/IP」其实是一整个协议族
--------------------------------------------------------------------
**书上强调「TCP/IP 不是两个协议,是一族协议」。**下面把本机能查到的成员列出来。
协议名 协议号
----------------------
ip 0
icmp 1
tcp 6
udp 17
ipv6 41
gre 本机没登记
esp 50
ah 51
**这份表里只有 tcp 与 udp 是「传输层」的**,
**ip、ipv6 是「网络层」的,icmp 是「网络层的助手」,esp、ah 是 IPsec 的成员。**
**它们合起来才叫「TCP/IP 协议族」。**
**「本机没登记」那一行不是错误**:**`getprotobyname` 查的是本机协议表**,
表里没有不代表协议号不存在,**只代表本机没装对应的实现。**
**这一点在看书时最容易误解成「这个协议不存在」。**
ip 是 0、icmp 是 1、tcp 是 6、udp 是 17:前两个是网络层的,后两个是传输层的。
这个编号顺序不是按层次排的,是按「当年登记的先后」。
gre 显示「本机没登记」:getprotobyname 查的是本机协议表,
表里没有不代表协议号不存在(GRE 是 47),只代表本机没装对应的实现。
这一点在看书时最容易误解成「这个协议不存在」。
能让这张表更完整的方法是去查 IANA 的协议号注册表,
那才是权威来源——本机协议表只是系统自带的一个子集。
30 秒实验
- 查一下
sctp与ospf的协议号,看本机登记了没有。 - 算一下:8 位协议号最多能装多少种上层协议?实际登记了多少种?
- 想一下:为什么 ICMP 不能算「传输层」?它有没有端口号?
常见误区
- 以为 TCP/IP 只有两个协议。 它是一族,IP 头里的「协议」字段就是分发开关。
- 以为 IP 自己的协议号是空的。 IP 的协议号是 0,因为它不是装在 IP 上面的。
- 以为「本机没登记」等于「协议不存在」。 那只是本机没装实现,权威列表在 IANA 的注册表里。
自测三问(点开对答案)
1. TCP/IP 协议族里,哪一层的成员最多? —— **应用层**:只要跑在 TCP 或 UDP 上,想定义什么协议都行,不需要批准。 真正有限制力的只有底下两层。 2. IP 的协议号是多少?为什么是 0? —— **0**。因为它不是「装在 IP 上面」的协议,它就是 IP 自身。 3. 为什么说「IP 是窄腰」? —— **上面可以有无数种应用协议,下面可以有无数种介质,中间只有 IP 一个。** 想跨网络通信就必须用 IP。下一节讲 TCP/IP 标准化的精髓——为什么「跑得起来」比「设计得漂亮」更重要。
- ☐ (本节完,下一节 2.2.2 TCP/IP标准化精髓)