Skip to content

一次网页请求:网络协议的完整流程 ​

输入 https://example.org/course 后,浏览器要解决四个不同问题:名字对应哪个服务,字节怎样可靠到达,对方身份与内容是否可信,以及收到的数据代表什么。DNS、IP/传输协议、TLS、HTTP 分别参与这些问题。实际连接可能复用,不能假定每次点击都从头握手。

1. 域名解析与路由 ​

浏览器和操作系统先查缓存,未命中时通常向递归 DNS 解析器请求 A/AAAA 等记录。解析器可能使用自己的缓存,也可能向 DNS 层级查询。记录的 TTL 控制缓存有效期,不保证所有客户端同时看到更新。DNS 返回地址后,操作系统根据路由表选择下一跳;局域网中 IPv4 常用 ARP 获取下一跳 MAC,IPv6 使用邻居发现。

IP 负责尽力传递数据报。沿途路由器根据目标地址前缀转发,每一跳的链路帧可以变化,端到端 IP 地址在没有 NAT 等转换时保持。IP 不保证按序、不丢失或不重复。端口则帮助主机把传输层数据交给相应 socket。

2. TCP:把不可靠数据报变为有序字节流 ​

常见 TCP 建连交换 SYN、SYN+ACK、ACK,双方协商初始序号等参数。连接的每个方向都有序号空间,ACK 表示接收方连续收到的数据进度;SYN 和 FIN 也占序号。TCP 的对象是字节流,应用一次 write 不对应接收方一次 read,需要由 HTTP 或应用协议划分消息边界。

sequenceDiagram
  participant B as 浏览器
  participant D as DNS 解析器
  participant S as 服务端
  B->>D: 查询地址(缓存未命中时)
  D-->>B: IP 地址
  B->>S: TCP SYN
  S-->>B: SYN + ACK
  B->>S: ACK
  B->>S: TLS ClientHello
  S-->>B: ServerHello 与加密握手信息
  B->>S: 完成握手并发送 HTTP 请求
  S-->>B: HTTP 响应
查看流程图文本
sequenceDiagram
  participant B as 浏览器
  participant D as DNS 解析器
  participant S as 服务端
  B->>D: 查询地址(缓存未命中时)
  D-->>B: IP 地址
  B->>S: TCP SYN
  S-->>B: SYN + ACK
  B->>S: ACK
  B->>S: TLS ClientHello
  S-->>B: ServerHello 与加密握手信息
  B->>S: 完成握手并发送 HTTP 请求
  S-->>B: HTTP 响应

这是新建 TCP+TLS 连接的简化流程,不覆盖所有恢复、早期数据和协议协商情况。关闭连接时两个方向可以分别结束,半关闭并不表示另一方向不能再读。

3. 流量控制与拥塞控制 ​

流量控制保护接收者:接收窗口 rwnd 指定从累计 ACK 所指序号开始,接收方愿意接收的字节范围,反映接收缓冲区的可用容量。已经发送但尚未确认的字节也会占用发送方可用的窗口额度,不能把 rwnd 直接当成现在还能新发的字节数。拥塞控制保护网络:拥塞窗口 cwnd 限制在途数据,根据丢包、时延或其他信号调整。总的未确认数据上限粗略受 min(rwnd,cwnd) 约束;计算还能新发多少时,还需考虑当前在途数据。

例如链路带宽 100 Mbit/s,往返时延 40 ms,带宽时延积约为 4 Mbit,即 0.5 MB。在途窗口远小于该量时,即使链路够快也可能填不满。吞吐还受接收处理速度、丢包和拥塞算法影响;这不是一个单纯由带宽决定的问题。

超时重传与重复确认等机制恢复丢失数据。接收方用序号重组并去重;应用因此获得有序字节,但连接断开仍可能让应用不知道最后一次业务请求是否被处理。这个不确定性在 RPC 中继续出现。

4. TLS:身份、密钥与完整性 ​

TLS 1.3 握手协商加密参数与密钥材料,并通常通过证书验证服务器身份。浏览器检查证书链、有效期和域名匹配等条件。之后使用对称加密保护记录的机密性与完整性。证书证明的是与域名相关的身份绑定,不证明网站内容一定正确或业务可信。

TLS 不隐藏所有元数据;目的 IP、流量时序等仍可能可见。连接恢复可以减少握手成本;0-RTT 早期数据存在重放风险,不能不加区分地用于不可重复执行的业务操作。

5. HTTP:请求、响应和缓存 ​

HTTP 描述方法、资源标识、头字段、状态码和正文。GET 通常用于获取表示,POST 常用于提交处理;语义由协议和 API 一起明确。状态码 200 说明这次 HTTP 处理成功,不自动意味着某个跨服务事务的所有外部副作用都已完成。

缓存既有新鲜度,也有验证。Cache-Control: max-age=... 决定可直接复用多久;过期后可通过 ETag 与 If-None-Match 验证,服务器可能返回 304。CDN 缓存应明确缓存键,涉及用户身份的响应不能只按路径混用,否则会把一个人的内容交给另一个人。

HTTP/2 在同一 TCP 连接上多路复用流;TCP 丢失一个字节片段可能阻塞该连接上后续字节的交付,影响多个 HTTP 流。HTTP/3 使用 QUIC,在传输层提供独立流,缓解跨流的这种队头阻塞,但同一流仍需按序交付,拥塞和共享链路仍会影响整体性能。QUIC 建立在 UDP 之上,自身实现可靠传输、拥塞控制并集成 TLS。

一次排查应按层定位 ​

域名查不到,先看 DNS;连接建立不了,查地址、端口和路由;证书错误,查 TLS 身份;返回 500,查应用;响应慢,区分解析、建连、首字节与下载。不要把所有现象都称为“网络不好”。

自测:TCP 保证可靠传输,为什么支付接口仍需要幂等键?

服务端可能已处理请求,而客户端在得到业务回复前连接断开。新的连接上的重试是新的应用消息;TCP 无法识别两次业务请求是否代表同一操作。幂等键解决应用层副作用重复问题。

来源:TCP RFC 9293、TLS 1.3 RFC 8446、HTTP 语义 RFC 9110、HTTP 缓存 RFC 9111、QUIC RFC 9000。