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

一次网页访问里,DNS 管名字、TCP 管送达、HTTP 管格式、IP 管寻址。 四个协议各管一段,谁也不替代谁。

📝 本节和前面几节的关系

前面几节分别看了 IP、TCP、DNS。这一节把四个协议摆到一条时间轴上,这是第一章的收口。

一、一条时间轴上的四个角色

顺序是固定的:先问名字(DNS)→ 再建连接(TCP)→ 再发请求(HTTP)。 IP 不在这条轴上,它贯穿始终:每一个 DNS 包、每一个 TCP 包,都装在 IP 包里。 四者分工口诀:DNS 找门牌、IP 走路、TCP 保证不丢、HTTP 说人话。

二、数一数往返

Demo 里把一条完整链路拆成五步,往返次数加起来是 4 个:DNS 一次、TCP 握手一次、 HTTP 请求响应对一次、挥手一次。 跨城按 40 毫秒算,什么都不干就要 160 毫秒。这还没算服务端自己的处理时间。 所以优化网页速度的优先顺序通常是: 减少往返(复用连接、缓存、CDN)> 减少字节(压缩、图片优化)> 优化服务端计算。 往返是乘数,字节和计算只是加数。

三、每个协议只管自己那一段

协议 负责 不负责
DNS 名字 → 地址 连接、内容、加密
IP 逐跳转发到目的地址 顺序、重传、可靠性
TCP 可靠字节流、流量与拥塞控制 内容格式、身份
HTTP 请求响应的语义与格式 底下怎么送、送丢了怎么办
这张表要背下来。后面遇到任何「为什么这里不生效」,先问一句:这件事归哪一层管?
归错了层,怎么改都没用。
比如「页面加载慢」——如果 DNS 慢,改图片没用;如果往返多,压缩正文收效有限;
如果服务端慢,加带宽纯属浪费。

四、动手 Demo:把一条链路拆成五步,数往返

不测网络,只把步骤列出来、把往返数加起来, 再按跨城 40 毫秒折成毫秒——这是一个可以直接拿去估算的模型。

steps = [
    (u'① 问 DNS', u'UDP 53', 1),
    (u'② DNS 回答', u'UDP 53', 0),
    (u'③ 建 TCP 连接', u'TCP 三次握手', 1),
    (u'④ 发请求等响应', u'HTTP/1.1', 1),
    (u'⑤ 关连接', u'TCP 四次挥手', 1),
]
trips = sum(r for _, _, r in steps)
print(trips, trips * 40, u'毫秒')

实跑输出:

--------------------------------------------------------------------
一次请求里,四个协议各自负责哪一段
--------------------------------------------------------------------
  ① 浏览器问 DNS:example.com 在哪   UDP 53,往返 1
  ② DNS 回答:93.184.216.34          UDP 53,往返 0
  ③ 和这个地址建 TCP 连接            TCP 三次握手,往返 1
  ④ 发 HTTP 请求、等响应             HTTP/1.1,往返 1
  ⑤ 关连接(或留着复用)             TCP 四次挥手,往返 1
  合计往返次数               4 个
  跨城按 40 毫秒/往返       160 毫秒

  DNS 管名字到地址           不管连接,也不管内容
  TCP 管可靠传输             不管传的是什么
  HTTP 管内容格式            不管底下怎么送
  这张表就是第一章的骨架:先把「谁管哪一段」分清,后面十一章才不会混在一起。

合计往返次数 4 个、跨城按 40 毫秒/往返 160 毫秒——这条链路什么都没做, 光是走完协议就要一百六十毫秒。 注意 ② 的往返是 0:答案回来那一段已经算在 ① 的往返里了。数往返最容易数重,口径要先说清。 如果把 ⑤(挥手)去掉、把 ①(DNS)缓存掉、把 ③(握手)复用掉, 就只剩 ④ 的 40 毫秒——这就是 HTTP/2 + 连接复用 + DNS 缓存的效果。

30 秒实验

  1. 把跨城 40 毫秒改成同机房 1 毫秒,重算,看总耗时变成多少。
  2. 加上「DNS 缓存命中」和「连接复用」两个条件,重新数往返。
  3. 想一想:HTTP/3 把 TCP 换成 QUIC 之后,①③④ 各变成几次往返。

常见误区

  1. 「HTTP 自己会重传」——它不会,重传是 TCP 的事。
  2. 「DNS 每次都要查」——缓存命中时是零往返。
  3. 「少传字节就能变快」——往返数是乘数,字节是加数,先砍乘数。
自测三问(点开对答案) 1. 一次全新的页面访问,最少几个往返? —— DNS 一个、TCP 握手一个、请求响应一个,共三个。挥手算上就是四个。 2. 为什么说「往返是乘数」? —— 每个请求都要付往返的代价,请求越多乘得越狠;字节和计算只在单次里加。 3. 「页面慢」该先查哪一层? —— 先分段计时:解析、连接、首字节、传输。哪段占比高就查哪一层。

链路走通了。最后两节把「地址」这个东西本身拆开:URI 到底由什么组成。

相关笔记