TCP/IP 不是两个协议,是一族协议的总称。名字取自其中最重要的两个,实际成员有上百个。
上一节说 HTTP 卡在协议本身。 要谈协议就得先有骨架,这一节给出骨架:TCP/IP 协议族包含哪些成员、怎么分家。
一、名字的来历与范围
20 世纪 70 年代,ARPANET 要解决「不同网络互相连」的问题,产出了一套规范, 核心是 IP(寻址与转发)和 TCP(可靠传输)。后来这套规范被统称为 TCP/IP 协议族。 族里成员的分工: | 层 | 代表协议 | 管什么 | |---|---|---| | 应用层 | HTTP、DNS、SMTP、FTP | 内容格式与业务语义 | | 传输层 | TCP、UDP | 端到端送达与可靠性 | | 网络层 | IP、ICMP、ARP | 寻址与逐跳转发 | | 链路层 | 以太网、Wi-Fi、PPP | 相邻设备之间的比特 | 每层只跟对端的同一层说话。HTTP 不知道底下是 Wi-Fi 还是网线,IP 不知道上面装的是网页还是邮件。
二、为什么要分层
不分层也能通——写一个程序从头管到尾就行。但那样每加一种网络、每换一种应用,都要整个重写。 分层换来的能力是替换:链路层从以太网换成 Wi-Fi,上面的 IP 和 HTTP 不用改; 应用层从 HTTP 换成 MQTT,底下的 TCP/IP 也不用改。 代价是每层都要加自己的头。 一次 HTTP 请求在线上 122 字节,其中应用真正想说的只有 64 字节,包装占了 47.5%(见 D005)。 层数越多,包装越重——这是分层的固定税。
三、本课的坐标
这本书后面十章,基本沿着「从上往下再往上」的顺序走:先看 HTTP 本身(二三五六章), 再看它脚下的 TCP/IP(一四章),再看加壳的 HTTPS(七章),最后看攻击面(十一章)。 36 课 是把 TCP/IP 这层彻底拆开讲的一本; 本课只需要知道它在那儿、管什么,不必重学。
四、动手 Demo:逐层加头:一次请求在线上到底多大
把一个最小 HTTP/1.1 请求逐层加头,算到以太网帧,看包装占了多少。数字全部由代码算。
layers = [
(u'HTTP 请求行', len(u'GET /index.html HTTP/1.1\r\n')),
(u'Host 首部', len(u'Host: 127.0.0.1\r\n')),
(u'Connection 首部', len(u'Connection: close\r\n')),
(u'空行(分隔)', 2),
(u'TCP 头', 20),
(u'IP 头', 20),
(u'以太网头(含尾部 FCS)', 14 + 4),
]
total = sum(n for _, n in layers)
实跑输出:
--------------------------------------------------------------------
一层一层包:一次请求在线上到底多大
--------------------------------------------------------------------
HTTP 请求行 26 字节
Host 首部 17 字节
Connection 首部 19 字节
空行(分隔) 2 字节
TCP 头 20 字节
IP 头 20 字节
以太网头(含尾部 FCS) 18 字节
合计上线 122 字节
其中应用真正想说的 64 字节
协议包装占 58 字节(47.5%)
请求越短,包装占比越高。所以 HTTP 才要把首部压掉——HTTP/2 用 HPACK 把重复的首部压到几字节。
合计 122 字节,应用层内容 64 字节,包装 58 字节。包装比内容还多——这在短请求里是常态。 以太网那 18 字节是 14 字节头加 4 字节帧校验(FCS)。 这 4 字节在抓包工具里常常看不到,因为网卡校验完就剥掉了。 请求越长,包装占比越低;请求越短,越吃亏。 所以 HTTP/2 的 HPACK 和 HTTP/3 的 QPACK 都在死磕首部压缩。
30 秒实验
- 把
Host的值改成www.example.com,重跑,看总字节变成多少。 - 把请求改成带
Accept、Accept-Encoding、User-Agent三行,算包装占比降到多少。 - 算一算:如果换成 HTTP/2 的二进制帧,这几行首部大概能压到几字节。
常见误区
- 「TCP/IP 就是 TCP 加 IP」——它是一族协议的总称,还包括 UDP、ICMP、ARP、DNS 等等。
- 「分四层是国际标准规定的」——OSI 是七层,TCP/IP 四层是实现出来的,不是先有标准再有实现。
- 「层数越多越可靠」——层数多换来的是可替换性,代价是每层都加头。
自测三问(点开对答案)
1. TCP/IP 协议族里,HTTP 和 IP 各在哪一层? —— HTTP 在应用层,IP 在网络层。中间隔着传输层(TCP/UDP)。 2. 分层换来的最核心的能力是什么? —— 可替换:换掉一层不影响其他层。 3. 一次短请求里包装占 47.5%,这个数说明什么? —— 短请求的协议开销极高,压首部比压正文更划算。族里的成员认清了。下一节看层与层之间那道线是怎么划的。
- ☐ (本节完,下一节 1.3.2 TCP/IP的分层管理)
相关笔记
- 36 课 · 图解TCP/IP(第5版)(协议族与分层的完整讲法)
- 12 课 · 计算机网络(OSI 七层与 TCP/IP 四层的对应)
- 📘 图解HTTP · 索引