📘 第一章 了解Web及网络基础
📄 一句话概括

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

  1. 把 Host 的值改成 www.example.com,重跑,看总字节变成多少。
  2. 把请求改成带 Accept、Accept-Encoding、User-Agent 三行,算包装占比降到多少。
  3. 算一算:如果换成 HTTP/2 的二进制帧,这几行首部大概能压到几字节。

常见误区

  1. 「TCP/IP 就是 TCP 加 IP」——它是一族协议的总称,还包括 UDP、ICMP、ARP、DNS 等等。
  2. 「分四层是国际标准规定的」——OSI 是七层,TCP/IP 四层是实现出来的,不是先有标准再有实现。
  3. 「层数越多越可靠」——层数多换来的是可替换性,代价是每层都加头。
自测三问(点开对答案) 1. TCP/IP 协议族里,HTTP 和 IP 各在哪一层? —— HTTP 在应用层,IP 在网络层。中间隔着传输层(TCP/UDP)。 2. 分层换来的最核心的能力是什么? —— 可替换:换掉一层不影响其他层。 3. 一次短请求里包装占 47.5%,这个数说明什么? —— 短请求的协议开销极高,压首部比压正文更划算。

族里的成员认清了。下一节看层与层之间那道线是怎么划的。

相关笔记