一次 Web 请求背后的网络协议全过程
「从输入 URL 到页面显示,中间发生了什么?」 这是互联网领域的一道经典面试题,考察候选人对计算机网络的整体认知深度。本文以一次完整的 Web 页面请求为例,将 DHCP、ARP、DNS、TCP、HTTP 等核心协议串联起来,自底向上逐步拆解数据在网络中传输的完整过程,帮助读者建立系统化的网络知识体系。
注意:为降低复杂度,本文使用的是明文 HTTP 协议,不涉及 HTTPS / TLS 握手过程。在实际生产环境中,绝大多数网站已启用 HTTPS,在 TCP 三次握手完成后还会进行 TLS 握手以建立加密信道,后续文章会单独介绍。
场景中包含 3 个网络(IP 地址均使用 RFC 文档保留段,仅作示意):
- Web 服务器网络:其中运行着目标 Web 服务器,地址为
203.0.113.10; - ISP 网络:互联网服务提供商(如运营商)的网络,其中运行着 DNS 服务器,地址为
198.51.100.1; - 本地网络:用户所在的局域网(如家庭、办公室、校园网等)。
现在从一台笔记本接入本地网络开始:
DHCP 分配 IP 的完整流程为 DISCOVER → OFFER → REQUEST → ACK 四步:
笔记本为了获取 IP 地址,生成一个 DHCP DISCOVER 报文(广播发现局域网内的 DHCP 服务器),该报文使用 UDP、IP 协议:
- 源端口:68
- 源 IP 地址:0.0.0.0
- 目的端口:67
- 目的 IP 地址:255.255.255.255
将包含 DHCP DISCOVER 报文的 IP 数据包放置到以太网帧中:
- 目的 MAC 地址:FF:FF:FF:FF:FF:FF
- 该以太网帧从笔记本发送到交换机,交换机将其广播到所有出端口,到达路由器;
- 路由器接收到该以太网帧,层层剥取:以太网帧 → IP 数据报 → UDP → DHCP,获取到 DHCP DISCOVER 报文,并回复 DHCP OFFER 报文,提供可用的 IP 配置(含 IP、DNS、网关、子网掩码),该报文封装后发回笔记本;
- 笔记本收到 DHCP OFFER 后,广播发送 DHCP REQUEST 报文,正式请求使用该 IP 配置(同一局域网内可能有多个 DHCP 服务器,广播是为了通知其他服务器放弃分配);
路由器收到 DHCP REQUEST 后,回复 DHCP ACK 报文,确认分配,其中包含:
- IP:192.168.1.101
- DNS:198.51.100.1
- 网关(gateway):192.168.1.1
- 子网掩码:192.168.1.0/24
该报文依次封装:DHCP ACK → UDP → IP 数据报 → 以太网帧,经交换机到达笔记本。
- 笔记本层层剥取协议,获得 IP、DNS、网关、子网掩码等信息。
至此,笔记本完成了网络组件的初始化。
然后在笔记本的浏览器中输入 www.example.com 并按回车:
笔记本不知道目标 Web 服务器的 IP,生成 DNS 查询报文,使用 UDP:
- 问题段:
www.example.com - 端口:53
- 目的 IP:198.51.100.1(DNS 服务器)
- 源 IP:192.168.1.101
- 问题段:
- 笔记本将 DNS 报文依次封装:DNS → UDP → IP → 以太网帧。然而,笔记本并不知道路由器的 MAC 地址(虽然第 5 步获取到了路由器的 IP),需要先用 ARP 协议获取网关路由器的 MAC 地址;
笔记本生成 ARP 查询报文:
- 目的 IP:192.168.1.1
- 目的 MAC 地址:FF:FF:FF:FF:FF:FF(广播)
然后向交换机发送该以太网帧,交换机转发给网关路由器;
网关路由器接收到后,生成 ARP 回答:
- MAC 地址:00:22:6B:45:1F:1B
- IP 地址:192.168.1.1
- 目的 MAC 地址:00:16:D3:23:68:8A
- 笔记本接收到 ARP 回答报文,获取到网关路由器的 MAC 地址;
笔记本现在可以发送 DNS 查询报文了:
- 目的 IP 地址:198.51.100.1(DNS 服务器)
- 目的 MAC 地址:00:22:6B:45:1F:1B(网关路由器)
- 网关路由器接收到该帧,抽取 DNS 查询,根据转发表将该数据包转发到 ISP 网络中的路由器;
- ISP 网络中的路由器接收到该帧,根据转发表将其转发到 DNS 服务器;
DNS 服务器接收到该帧,提取查询信息,生成 DNS 回答报文:
- IP 地址:203.0.113.10(目标 Web 服务器地址,来源于权威 DNS 服务器)
然后数据报一路返回,到达笔记本;
- 笔记本从 DNS 报文中抽取到目标 Web 服务器的 IP 地址。
至此,笔记本获取到目标 Web 服务器的 IP 地址,准备建立连接。
笔记本生成 TCP 套接字,用于向
www.example.com发送 HTTP GET 报文。先生成 TCP SYN 报文:- 目的 IP 地址:203.0.113.10(目标 Web 服务器地址)
- 目的 MAC 地址:00:22:6B:45:1F:1B(网关路由器)
- TCP SYN 报文沿着本地网络、ISP 网络、Web 服务器网络依次转发(由 BGP 协议决定路径);
- TCP SYN 报文到达 Web 服务器的监听套接字,服务器生成连接套接字,产生 TCP SYNACK 报文;
- TCP SYNACK 报文依次通过 Web 服务器网络、ISP 网络、本地网络,最终到达笔记本;
- 笔记本回复 TCP ACK 报文,三次握手完成,TCP 连接正式建立;
- 笔记本发送 HTTP GET 报文;
- 服务器读取 GET 报文,生成 HTTP 响应报文,并将请求的 Web 页内容放入 HTTP 响应体中;
- HTTP 响应报文的数据通过 Web 服务器网络、ISP 网络、本地网络,最终到达笔记本,浏览器从套接字中读取 HTTP 响应,从响应体中抽取 HTML,渲染并显示 Web 网页。
至此,网页显示完成。