分布式专题——26.5 一台新机器进行Web页面请求的历程
1 场景与网络拓扑说明
-
用户场景:同学X入职成都新公司NewCompany,公司配发新笔记本电脑,他将电脑接入公司网络,准备访问百度网页;
-
ISP(互联网服务提供商):NewCompany的ISP由四川电信提供,百度公司的ISP由北京电信提供;
-
网络设备与地址:
- 公司网络内有交换机、路由器等设备
- 笔记本电脑的MAC地址(用于局域网内设备识别)为:11:22:33:44:55:66
- 网关路由器:
- 对内网关地址(公司局域网内的网关标识):192.168.5.1
- 对内MAC地址(局域网内路由器的标识):22:33:44:55:66:11
- 对外Internet地址(连接公网的地址):120.68.34.89,对外的MAC地址因主要用于局域网寻址,此处无关紧要
- 百度的Web服务器地址:IP地址14.215.177.38,域名
www.baidu.com
- 路由器还承担DHCP服务器的职责(用于自动给公司网络内设备分配IP等网络配置信息)
- 假设条件:百度所有数据内容都放在其公司内部服务器上,未使用CDN(内容分发网络)等机制
-
Web页面请求的整体逻辑基础:当新PC接入公司网络并要访问百度网页时,需要经过一系列网络协议和设备的交互,包括从局域网内的通信,到通过ISP接入公网,再到与百度服务器所在网络建立连接、获取网页内容等过程,涉及MAC地址寻址、IP地址路由、DNS(域名系统)解析(将域名
www.baidu.com
转换为IP地址14.215.177.38)等关键网络技术环。
2 交换机
- 工作层级:工作在数据链路层,负责接收链路层入帧并转发到链路层另一出口,自身对子网中的主机和路由器透明;
- 交换表:内部存在交换表,每个表项至少包含一个MAC地址和通向该MAC地址的交换机接口;
- 帧处理逻辑:
- 从接口X接收到链路层入帧,获取目的MAC地址后在交换表查找;
- 若无目的地址表项,广播该帧;
- 若表项中目的MAC地址与接口X关联,丢弃该帧;
- 若表项中目的MAC地址与接口Y(Y≠X)关联,将帧放到接口Y前面的输出缓存完成转发;
- 即插即用与自学习:交换机是即插即用设备,具备自学习能力。交换表初始为空,会存储每个接口接收到的入帧的MAC地址和接口的对应关系;
- 特殊“交换机”说明:像“汇聚交换机”“核心交换机”,本质上是工作在网络层的路由器,而非链路层的交换机。
3 路由器
- 工作层级:工作在网络层;
- 数据包处理:在输入端口接收到数据包后,解析并根据IP地址,在内部路由表中查找,再经内部交换结构往输出端口输送,使数据包到达正确IP地址;
- 路由寻址算法:
- 分为集中式和分散式两种;
- 集中式最出名的是图论中的Dijkstra算法,该算法需知道整个网络情况;
- 实际工作中两种算法结合使用,比如一个ISP内部使用基于Dijkstra算法的OSPF协议;多个ISP之间采用的BGP协议,算法思想接近分散式路由选择算法;
- 实际应用示例:以网络拓扑图为例,四川电信和北京电信内部的路由器可能用OSPF协议进行路由规划,四川电信和北京电信之间的路径可能用BGP协议规划,路由表也可手工配置。
4 DHCP 获取 IP 地址
-
动态主机配置协议(DHCP),用于为新接入的主机分配IP地址等网络配置信息,让主机能在网络中正常通信;
-
DHCP请求阶段(X同学笔记本发起请求)
-
笔记本操作系统生成DHCP请求报文,放入UDP报文段,UDP报文段置于IP数据报中。IP数据报的目的IP为广播地址255.255.255.255,源IP为0.0.0.0(因笔记本还无IP地址);
-
IP数据报被放入以太网帧,目的MAC地址为FF:FF:FF:FF:FF:FF(广播MAC地址,使帧广播到交换机连接的所有设备),源MAC地址为笔记本的MAC地址11:22:33:44:55:66;
-
包含DHCP请求的以太网帧由笔记本发送到以太网交换机,交换机从连接笔记本的端口接收后,向所有端口广播(因初始无对应MAC地址的转发记录);
-
路由器在MAC地址为22:33:44:55:66:11的接口接收到广播以太网帧,从中抽取IP数据报。由于IP数据报目的是广播地址,其载荷(UDP报文段)被分解到UDP层,进而抽取DHCP请求报文,此时DHCP服务器得到该请求;
-
-
DHCP响应阶段(DHCP服务器回应)
-
DHCP服务器生成DHCP ACK报文,包含分配给笔记本的IP地址(假设为192.168.5.10)、DNS服务器IP地址(120.69.56.46)、默认网关路由器IP地址(192.168.5.1)和子网掩码(255.255.255.0);
-
DHCP ACK报文放入UDP报文段,UDP报文段置于IP数据报,IP数据报再放入以太网帧,目的MAC地址为笔记本的MAC地址11:22:33:44:55:66,源MAC地址为路由器接口的MAC地址22:33:44:55:66:11;
-
包含DHCP ACK的以太网帧由路由器发送到交换机,交换机因之前自学习过笔记本MAC地址与端口的对应关系,直接从通向笔记本的输出端口转发该帧;
-
-
笔记本接收与配置
-
笔记本接收到包含DHCP ACK的以太网帧,依次抽取IP数据报、UDP报文段,最终获取DHCP ACK报文;
-
DHCP客户端记录分配的IP地址、DNS服务器IP地址;
-
在IP转发表中安装默认网关地址,后续笔记本将向该默认网关发送目的地址为其子网(192.168.5.X)以外的所有数据报。
-
5 DNS、ARP、NAT
5.1 DNS
- Domain Name System(域名系统),专门将主机名转换为对应的IP地址,DNS协议运行在UDP之上,使用53号端口;
- DNS查询流程(以查询
www.baidu.com
的IP为例):- X同学在Web浏览器输入
www.baidu.com
后,笔记本需要知道该域名的IP地址,于是生成DNS查询报文,将www.baidu.com
字符串放入其中; - DNS查询报文被置于UDP报文段,UDP报文段放入IP数据报,IP数据报的目的IP是DHCP ACK返回的DNS服务器地址120.69.56.46,源IP是笔记本通过DHCP获取的192.168.5.10。
- X同学在Web浏览器输入
5.2 ARP
- Address Resolution Protocol(地址解析协议),用于在同一个子网内将网络层地址(如IP地址)和链路层地址(MAC地址)相互转换。每台主机或路由器内存中有ARP表,包含IP地址到MAC地址的映射关系;RARP(反向地址解析协议)则以相反方式工作,通过物理地址解析出对应的IP地址;
- ARP查询流程(获取网关路由器MAC地址):
- 笔记本虽知道默认网关的IP地址192.168.5.1,但不知道其MAC地址,所以生成ARP查询报文,目的IP为192.168.5.1,将该报文放入具有广播目的MAC地址(FF:FF:FF:FF:FF:FF)的以太网帧,发送给交换机,交换机将帧交付给所有连接设备(包括网关路由器);
- 网关路由器在连接公司网络的接口收到ARP查询帧,发现ARP报文中目标IP(192.168.5.1)与自身接口IP匹配,于是准备ARP回答,在ARP回答中,将自己的MAC地址22:33:44:55:66:11与IP地址192.168.5.1关联,目的MAC地址设为笔记本的MAC地址11:22:33:44:55:66,发送该帧给交换机,再由交换机交付给笔记本;
- 笔记本接收ARP回答帧,从中抽取网关路由器的MAC地址22:33:44:55:66:11,之后就能用该MAC地址将包含DNS查询的以太网帧寻址到网关路由器。
5.3 NAT
- Network Address Translation(网络地址转换),用于将私有IP地址(如192.168.5.10,属于局域网内使用的、不能在Internet上直接路由的IP地址,私有IP地址范围包括10.0.0.0~10.255.255.255、172.16.0.0~172.31.255.255、192.168.0.0~192.168.255.255)转换为公有IP地址,使局域网内设备能通过公网IP与Internet通信;
- NAT转换流程:
- 包含DNS查询的IP数据报源IP是笔记本的私有IP(192.168.5.10),网关路由器收到后进行NAT转换:为该数据报生成新的源端口号(假设为5002),将源IP替换为路由器广域网一侧接口的公有IP地址120.68.34.89,源端口也更换为新端口5002,并在路由器的NAT转换表中记录;
- DNS服务器不知道请求数据报被NAT改装,发回的响应报文目的IP是NAT路由器的IP地址,目的端口是5002;
- 响应报文到达NAT路由器后,路由器根据NAT转换表,检索出对应的笔记本私有IP(192.168.5.10)和发送DNS报文时的端口号,重写该数据报的目的IP地址与目的端口号,再转发给笔记本;
- 后续经网关路由器在Internet和局域网内交换的报文,默认都进行了NAT。
6 域内路由到DNS
-
网关路由器与四川电信R1路由器的转发
-
网关路由器的操作:
- 网关路由器接收包含DNS查询的以太网帧,从中抽取IP数据报;
- 查找IP数据报的目的地址(DNS服务器地址120.69.56.46),根据自身转发表,决定将该数据报发送到四川电信网络中的R1路由器;
- 将IP数据报放置在链路层帧中,按照找到的链路进行发送;
-
四川电信R1路由器的操作:
- 接收链路层帧,抽取IP数据报,检查其目的地址(120.69.56.46);
- 根据自身转发表确定转发接口,通过该接口朝着DNS服务器转发数据报;
-
-
DNS服务器的解析与响应
-
DNS服务器解析:
- 包含DNS查询的IP数据报到达本地电信DNS服务器;
- DNS服务器在其DNS数据库中查找域名
www.baidu.com
,找到对应的DNS源记录,其中包含www.baidu.com
的IP地址14.215.177.38;
-
生成DNS回答报文并转发:
- DNS服务器形成包含主机名到IP地址映射(
www.baidu.com
对应14.215.177.38)的DNS回答报文; - 将DNS回答报文放入UDP报文段,该数据报通过四川电信网络反向转发到公司的路由器,再经以太网交换机发送到X同学的笔记本PC;
- DNS服务器形成包含主机名到IP地址映射(
-
-
笔记本PC获取IP地址:X同学的笔记本PC从接收到的DNS报文中,抽取出百度服务器
www.baidu.com
的IP地址,至此,笔记本PC准备好访问百度服务器。
7 TCP与HTTP
-
TCP三次握手建立连接
-
发起TCP SYN报文:
- X同学的笔记本PC有了
www.baidu.com
的IP地址(14.215.177.38)后,生成用于向百度发送HTTP GET报文的TCP套接字; - 笔记本中的TCP需与百度的TCP执行三次握手,首先生成目的端口为80(HTTP默认端口)的TCP SYN报文段,将其放置在目的IP为14.215.177.38的IP数据报中,该IP数据报又被放在目的MAC地址为22:33:44:55:66:11(网关路由器)的以太网帧中,发送给交换机;
- X同学的笔记本PC有了
-
路由转发TCP SYN报文:包含TCP SYN的数据包在公司网络、四川电信网络、北京电信网络和百度网络中的路由器,依据各自转发表,朝着
www.baidu.com
转发,类似6 域内路由到DNS
中的转发逻辑; -
百度服务器响应TCP SYNACK报文:
- 包含TCP SYN的数据包到达百度服务器后,从数据报中抽取出TCP SYN报文,并分解到与端口80关联的欢迎套接字;
- 百度HTTP服务器为与笔记本PC的TCP连接生成连接套接字,产生TCP SYNACK报文段;
-
笔记本PC接收SYNACK报文,完成三次握手:
- 包含TCP SYNACK报文段的数据包通过百度、北京电信、四川电信和公司网络转发,到达笔记本PC的以太网卡;
- 数据包在操作系统中分解到步骤18生成的TCP套接字,从而进入连接状态,三次握手完成,TCP连接建立;
-
-
HTTP请求与响应
-
生成HTTP GET报文并发送:
- 借助笔记本PC上的套接字socket,浏览器生成包含要获取URL的HTTP GET报文;
- HTTP GET报文写入套接字,成为TCP报文段的载荷,该TCP报文段被放置进数据包,交付到
www.baidu.com
(基于已建立的TCP连接);
-
百度服务器处理请求并返回响应:百度的HTTP服务器从TCP套接字读取HTTP GET报文,生成HTTP响应报文,将请求的Web页内容放入HTTP响应体中,发送进TCP套接字;
-
笔记本PC接收并显示Web页:
- 包含HTTP回答报文的数据包通过百度网络、北京电信、四川电信和公司网络转发,到达笔记本PC;
- 浏览器程序从套接字读取HTTP响应,从HTTP响应体中抽取Web网页的html,最终显示Web网页。
-