📚 第二章 TCP/IP基础知识
📄 一句话概括

「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 秒实验

  1. 查一下 sctp 与 ospf 的协议号,看本机登记了没有。
  2. 算一下:8 位协议号最多能装多少种上层协议?实际登记了多少种?
  3. 想一下:为什么 ICMP 不能算「传输层」?它有没有端口号?

常见误区

  1. 以为 TCP/IP 只有两个协议。 它是一族,IP 头里的「协议」字段就是分发开关。
  2. 以为 IP 自己的协议号是空的。 IP 的协议号是 0,因为它不是装在 IP 上面的。
  3. 以为「本机没登记」等于「协议不存在」。 那只是本机没装实现,权威列表在 IANA 的注册表里。
自测三问(点开对答案) 1. TCP/IP 协议族里,哪一层的成员最多? —— **应用层**:只要跑在 TCP 或 UDP 上,想定义什么协议都行,不需要批准。 真正有限制力的只有底下两层。 2. IP 的协议号是多少?为什么是 0? —— **0**。因为它不是「装在 IP 上面」的协议,它就是 IP 自身。 3. 为什么说「IP 是窄腰」? —— **上面可以有无数种应用协议,下面可以有无数种介质,中间只有 IP 一个。** 想跨网络通信就必须用 IP。

下一节讲 TCP/IP 标准化的精髓——为什么「跑得起来」比「设计得漂亮」更重要。

相关笔记