一台新 PC 进行 Web 页面请求的历程
场景和网络拓扑说明
场景:同学 X 入职成都 NewCompany,公司配发全新笔记本电脑。X 将电脑接入公司网络,尝试访问百度页面www.baidu.com
(IP:14.215.177.38)。NewCompany 的 ISP 为四川电信,百度的 ISP 为北京电信。
设备信息:
笔记本 MAC 地址:11:22:33:44:55:66
公司网关路由器:对内 IP 192.168.5.1,对内 MAC 22:33:44:55:66:11,对外公网 IP 120.68.34.89(同时承担 DHCP 服务器功能)
简化假设:百度内容未使用 CDN,仅存于百度内部服务器。
核心设备工作原理补充
交换机:
工作在链路层,负责接收链路层入帧并将它们转发到链路层另一出口,交换机自身对子网中的主机和路由器是透明的。交换机内部存在着交换机表,里面的每一个表项都至少包含了①一个MAC地址;②通向该MAC地址的交换机接口。
对于从接口
LAN1
接收到的一个链路层入帧,交换机的处理逻辑如下:首先提取帧中的目的 MAC 地址,然后在自身的 MAC 地址表(交换机表)中查询该地址对应的表项:1、若表中无该目的 MAC 地址的记录(即未知目的地址),交换机将对该帧执行泛洪操作—— 除接收帧的接口 LAN1 外,向所有其他出端口(如 LAN2、LAN3 等)转发该帧,确保帧能被目标设备接收。
2、若表中存在该目的 MAC 地址的表项,且表项对应的出接口与接收帧的接口 LAN1 相同(即帧的目的设备与发送设备在同一接口侧),交换机将丢弃该帧(避免帧在同一接口回路中无效传输)。
3、若表中存在该目的 MAC 地址的表项,且表项对应的出接口为 LAN2(LAN2≠LAN1),交换机将该帧放入接口 LAN2 的输出缓存中,通过接口 LAN2 转发至目标设备。
交换机是即插即用设备,自学习的。交换机表初始为空,对于收到对于在每个接口接收到的每个入帧,该交换机在其交换机表中存储MAC地址和接口的对应关系。
在实际工作中,常会听到类似于“汇聚交换机”、“核心交换机”之类的名词,其实这些本质上都是我们下面要说到的路由器,因为这些交换机工作在网络层而非链路层。
路由器:
路由器工作在网络层,在输入端口接受到数据包后,解析后根据IP地址,在内部的路由表中寻找后,经过内部的交换结构往输出端口输送,使数据包可以到达正确的IP地址。在路由寻址算法上有集中式路由选择算法和分散式路由选择算法两种。集中式路由选择算法最出名的就是图论中的Dijkstra 算法,这种算法必须知道整个网络的情况。
准备阶段:DHCP 获取网络配置
DHCP : Dynamic Host Configuration Protocol(动态主机配置协议)是为网络设备自动分配 IP 地址、子网掩码等网络配置参数的协议
新设备接入网络后,需通过 DHCP 获取 IP 地址及相关配置:
笔记本生成DHCP 请求报文,封装在 UDP 报文段中,再放入 IP 数据报(源 IP:0.0.0.0,目的 IP:255.255.255.255,广播地址)。
IP 数据报被封装为以太网帧:源 MAC 为笔记本 MAC(11:22:33:44:55:66),目的 MAC 为广播 MAC(FF:FF:FF:FF:FF:FF),确保所有连接设备均可接收。
交换机收到该广播帧,因交换机表初始为空,将帧泛洪至所有出端口(包括连接路由器的端口)。
网关路由器通过对内接口(MAC 22:33:44:55:66:11)接收帧,提取 IP 数据报,因目的 IP 为广播地址,将 UDP 载荷(DHCP 请求)提交至 DHCP 服务器(路由器内置)。
DHCP 服务器分配 IP 地址 192.168.5.10 给笔记本,并生成DHCP ACK 报文,包含:分配的 IP、DNS 服务器 IP(120.69.56.46)、默认网关 IP(192.168.5.1)、子网掩码(255.255.255.0)。
DHCP ACK 报文经 UDP、IP 封装后,放入以太网帧(目的 MAC:11:22:33:44:55:66,源 MAC:路由器对内 MAC)。交换机因已通过步骤 2 的帧学习到笔记本 MAC 与接口的对应关系,直接将帧转发至笔记本。
笔记本接收帧并解析 DHCP ACK,记录 IP 地址、DNS 服务器 IP,并在路由表中配置默认网关(所有非本地子网的 IP 数据报应发送至该网关)。
准备阶段:DNS 解析域名与 ARP 获取网关 MAC
DNS:Domain Name System(域名系统)是应用层协议,负责将用户易记的域名(如www.baidu.com)解析为对应的 IP 地址,使设备能通过 IP 进行网络通信。
ARP:Address Resolution Protocol(地址解析协议)是数据链路层协议,用于将 IP 地址解析为局域网内对应的 MAC 地址,确保以太网帧能准确发送到目标设备。设备会维护 “ARP 表” 记录映射关系。
访问www.baidu.com
需先通过 DNS
获取其 IP 地址,且需通过 ARP
获取网关的 MAC
地址以完成链路层封装:
笔记本生成DNS 查询报文(含字符串
www.baidu.com
),封装在 UDP 报文段中,再放入 IP 数据报(源 IP:192.168.5.10,目的 IP:120.69.56.46,DNS 服务器)。因 DNS 服务器 IP(120.69.56.46)不在本地子网(192.168.5.0/24),笔记本根据路由表,需将该 IP 数据报发送至默认网关(192.168.5.1)。但笔记本暂不知网关的 MAC 地址,需通过 ARP 获取。
笔记本生成ARP 查询报文(目标 IP:192.168.5.1),封装在以太网帧(目的 MAC:FF:FF:FF:FF:FF:FF,广播;源 MAC:11:22:33:44:55:66)中发送。交换机将该帧泛洪至所有出端口,包括网关路由器。
网关路由器接收帧后,发现 ARP 查询的目标 IP 与其对内 IP 匹配,生成ARP 应答报文(IP 192.168.5.1 对应 MAC 22:33:44:55:66:11),封装在以太网帧(目的 MAC:11:22:33:44:55:66)中返回。交换机将帧转发至笔记本。
笔记本接收 ARP 应答,在 ARP 表中记录 “192.168.5.1 → 22:33:44:55:66:11”。
笔记本将 DNS 查询的 IP 数据报封装为以太网帧:源 MAC(11:22:33:44:55:66),目的 MAC(22:33:44:55:66:11,网关),通过交换机转发至网关路由器。
网络地址转换(NAT)处理私有 IP
NAT : Network Address Translation(网络地址转换)是将私有网络 IP 地址转换为公共网络 IP 地址,实现多设备共享公网访问的技术。
笔记本的 IP(192.168.5.10)为私有 IP(仅局域网使用),需通过网关的 NAT 转换为公有 IP 才能访问互联网:
网关路由器接收帧后,提取 IP 数据报,进行 NAT 转换:将源 IP(192.168.5.10)替换为自身公网 IP(120.68.34.89),保留原源端口(如未冲突),并在 NAT 表中记录映射关系(内部 IP: 端口 → 外部 IP: 端口)。
外部服务器(如 DNS 服务器)的响应报文将发送至网关公网 IP 及转换后的端口,网关通过 NAT 表反向转换(替换目的 IP: 端口为笔记本的 IP: 端口),再转发至笔记本。
DNS 查询的路由与应答
网关路由器根据路由表(最长前缀匹配),确定 DNS 服务器 IP(120.69.56.46)的下一跳为四川电信的 R1 路由器,将 IP 数据报封装为对应链路的帧(如广域网链路帧)并转发。
四川电信内部路由器(如 R1)通过 OSPF 协议维护的路由表,逐级转发数据报至 DNS 服务器。
DNS 服务器接收查询,查找
www.baidu.com
对应的 IP(14.215.177.38),生成DNS 应答报文,经原路径反向转发(四川电信→公司网关→交换机→笔记本)。笔记本解析 DNS 应答,获取
www.baidu.com
的 IP 地址(14.215.177.38)。
访问 Web 页面:TCP 连接与 HTTP 交互
笔记本创建 TCP 套接字,向
www.baidu.com
(14.215.177.38)的 80 端口(HTTP 默认端口)发起连接,首先发送TCP SYN 报文段:封装为 IP 数据报(源 IP:192.168.5.10,目的 IP:14.215.177.38);
封装为以太网帧(源 MAC:11:22:33:44:55:66,目的 MAC:22:33:44:55:66:11),通过网关转发。
SYN 报文经公司网络、四川电信、北京电信(BGP 协议规划跨 ISP 路径)、百度网络的路由器逐级转发,最终到达百度服务器。
百度服务器的 TCP 欢迎套接字(端口 80)接收 SYN,生成TCP SYNACK 报文段,返回给笔记本。
笔记本接收 SYNACK,完成 TCP 三次握手的第二次握手,随后发送TCP ACK 报文段,完成连接建立。
笔记本浏览器生成HTTP GET 报文(请求
www.baidu.com
的首页),写入 TCP 套接字(作为 TCP 报文段的载荷),经 IP、以太网封装后发送至百度服务器。百度服务器的 HTTP 进程从 TCP 套接字读取 GET 报文,生成HTTP 响应报文(含网页 HTML 内容),写入 TCP 套接字。
HTTP 响应经原路径返回至笔记本,浏览器解析响应体中的 HTML,最终显示百度页面。