基础-键入网址到网页显示
用户在浏览器中输入www.google.com到网页显示期间,都发生了哪些事?
1. 整体流程
1.1 简化版本
- 解析URL,生成发送给web服务器的请求信息;
- 确定Web服务器
- 确定请求的文件名
- 生成HTTP请求信息
- DNS解析
- 浏览器将域名换为IP地址
- 查询顺序:浏览器缓存-系统本地缓存-递归DNS服务器-根域名服务器-权威DNS服务器
- 建立TCP链接
- 通过三次握手与服务器建立TCP链接
- 客户端发送SYN包
- 服务器回复SYN-ACK
- 客户端确认ACK
- 发送HTTP请求
- 浏览器构造HTTP请求,通过TCP连接发送到服务器
- 服务器处理请求
- 服务器根据请求执行操作,生成HTTP响应头
- 浏览器渲染页面
1.2 详细版本
- URL解析
- 浏览器解析URL,确定协议,域名,路径等信息;
- 如果没有指定路径则访问默认文件;
- 生成HTTP请求报文;
- DNS域名解析
- 浏览器检查本地缓存-操作系统缓存-hosts文件-本地DNS服务器递归查询
- 本地DNS递归查询:根DNS-顶级域DNS-权威域DNS
- 最终获得目标服务器的IP地址
- 协议栈与TCP连接
- 通过socket委托协议栈工作
- TCP三次握手建立连接:SYN - SYN+ACK - ACK
- 根据MSS拆分HTTP数据,添加TCP头部(源端口,目的端口,序列号,确认号)
- IP封装
- IP模块添加头部(源IP,目标IP,协议号06表示TCP)
- MAC封装与ARP查询
- 数据链路层添加MAC头部
- 源MAC地址:本机网卡地址
- 目标MAC地址:通过ARP协议查询下一跳(网关或目标主机)的MAC地址;
- ARP缓存MAC地址
- 数据链路层添加MAC头部
- 物理层传输(网卡)
- 在包开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列;
- 将数字信号转换为电信号,通过网线发送出去;
- 交换机和路由器
- 交换机:根据MAC地址表转发到相应端口,若无记录则广播
- 路由器:
- 检查目标IP,匹配路由表决定下一跳
- 替换源/目标MAC地址;
- 通过ARP查询下一跳MAC地址;
- 经过多次到达目标服务器;
- 服务器处理并响应
- 服务器逐层解包:校验MAC - 匹配IP - TCP端口 - HTTP进程
- 生成HTTP响应,反向封装TCP,IP,MAC头
- 通过相同路径返回客户端;
- 浏览器渲染
- 客户端接收响应后解包,交给浏览器渲染;
- 完成四次挥手断开TCP连接;
2. URL
URL包含哪些内容:
1 | |
http: + // + web服务器 + 数据源的路径名
- 当没有路径名时,代表访问根目录下事先设置的默认文件;
3. DNS
DNS服务器,用来保存web服务器域名与IP的对应关系,从而可以通过域名解析出服务器IP;
域名的层级关系:
- 根DNS服务器(.)
- 顶级域DNS服务器(.com)
- 权威DNS服务器(server.com)
3.1 域名解析流程
域名解析查询顺序为:浏览器本地缓存-操作系统缓存-hosts文件-本地DNS服务器(递归查询)
递归查询流程:
- 客户端发送一个DNS请求,询问ww.server.com的IP,并发给本地DNS服务器;(怎么发送给本地DNS服务器???)
- 本地域名服务器收到客户端请求后,先在本地缓存里的表格中找,如果找到则直接返回IP地址;
- 如果在本地缓存没有找到,则本地DNS服务器询问根域名服务器;
- 根DNS服务器收到本地DNS请求后,返回.com顶级域名服务器地址;
- 本地DNS收到顶级域名服务器地址后,接着向顶级域名服务器发起请求,询问IP地址;
- 顶级域名服务器返回www.server.com区域的权威DNS服务器地址;
- 本地DNS收到权威DNS服务器地址后,接着向权威域名服务器发起请求;
- 权威域名服务器查询后,将对应的IP地址返回给本地DNS;
- 本地DNS再将IP地址返回给客户端,客户端与目标建立连接;
4. 协议栈
通过DNS获取到IP后,把HTTP的传输工作交给操作系统中的协议栈;应用程序(浏览器)通过调用socket库,委托协议栈工作;
- 协议栈上半部分:负责收发数据的TCP和UDP协议,这两个传输层协议会接受应用层的委托执行收发数据的操作;
- 协议栈下半部分:使用IP协议控制网络包的收发操作;IP中还包括ICMP协议和ARP协议;
- ICMP协议:用于告知网络包传输过程中产生的错误以及控制信息;
- ARP协议:用于根据IP地址查询相应的以太网MAC地址;
5. TCP
HTTP基于TCP协议传输;TCP协议用于确定端口号;
5.1 TCP阶段流程
- 三次握手建立连接
- SYN - SYN+ACK - ACK
- 三次握手的目的时保证双方都有发送和接受数据的能力,以及避免历史连接;
- TCP分割数据
- 如果HTTP请求消息长度超过MSS的长度,TCP需要把HTTP数据拆分成一块块的数据发送;
- MTU:一个网络包的最大长度,以太网中一般为1500字节;IP头部+TCP头部+数据;
- MSS:除去IP头部和TCP头部之后,一个网络包能容纳的TCP数据的最大长度;
- 在每个拆分的数据加上TCP头信息,生成TCP报文,交给IP模块发送数据;
6. IP
IP协议中有源地址IP和目标地址IP;
- 源地址IP:客户端输出的IP地址;
- 目标地址IP:通过DNS域名解析得到的web服务器IP;
IP阶段的主要任务是确定源地址IP,生成IP报文;
当一台设备配备多个网卡时,系统需要决定使用哪个网卡的IP地址作为数据包的源IP地址,这个过程的核心是路由表查询;
6.1 路由表作用
路由表是操作系统中存储的规则表,用于决定数据包应该通过哪个网卡发送以及下一跳的地址(gateway),通过查询路由表,系统确定出口网卡以及源IP地址:
- 出口网卡:使用哪个网卡发送数据包;
- 源IP地址:自动选择该网卡对应的IP地址;
6.2 源IP地址的选择流程
- 提取目标地址
- 逐条匹配路由表,按照路由表优先级(子网掩码越长,优先级越高)依次匹配:
- 将目标IP与每条路由的子网掩码做按位与运算,得到网络地址;
- 检查结果是否与路由条目的Destination字段匹配;
- 确定出口网卡和源IP
- 若匹配成功,则使用该路由对应的网卡发送数据包;
- 该网卡的IP地址自动成为数据包的源IP地址;
7. MAC
生成IP头部之后,接下来网络包在IP头部的前面加上MAC头部;
MAC头部是以太网使用的头部,包含接收方和发送方的MAC地址;
7.1 如何确定发送方和接收方MAC地址?
发送方:MAC地址是在网卡生产时写入到ROM里的,只需要将这个值读取出来写入到MAC头部中即可;
接收方:通过ARP协议获取
- ARP协议会在以太网中以广播的形式,对以太网中所有设备询问目标IP地址对应的MAC地址;
- 上述是在同一个子网下,如果不在同一个子网下,如何确定目标IP地址的MAC地址呢???
8. 网卡
将数字信号转换为电信号,从而在网线上传输;
控制网卡的是网卡驱动程序,网卡驱动程序获取到网络包后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列;
- 起始帧分界符:用来表示包起始位置的标记;
- 帧校验序列(FCS):用来检查包传输过程中是否有损坏;
9. 交换机与路由器
9.1 交换机
- 电信号到达网线接口,交换机里的模块进行接收,接着交换机里的模块将电信号转换为数字信号;
- 通过包末尾的FCS校验错误,如果没问题则放到缓冲区;
- 将包放入缓冲区后,查询这个包的接收方MAC地址是否已经在MAC地址表中有记录;
- 交换机的MAC地址表包含两个信息:
- 设备的MAC地址;
- 该设备连接在交换机的哪个端口上;
- 交换机的MAC地址表包含两个信息:
- 交换机根据MAC地址表来判断应该把包转发到哪里,即交换机根据MAC地址表查找MAC地址,如果MAC地址匹配,则将信号发送到对应的端口。
- 如果在MAC地址表中没有找到指定的MAC地址,则将包转发到除了源端口之外的所有端口上;
9.2 交换机和路由器区别
- 路由器是基于IP设计的,路由器的各个端口都有MAC地址和IP地址;
- 交换机是基于以太网设计的,交换机的端口不具有MAC地址;
9.3 路由器基本流程
- 电信号到达网线接口部分,路由器中的模块将电信号转换为数字信号,通过包末尾的FCS进行错误校验;
- 如果没有问题则检查MAC头部中的接受发MAC地址,判断包是不是发给自己的,如果是就放到缓存区中,如果不是就丢弃;
- 完成包的接受后,将包的MAC头部丢弃,根据IP头部中的内容进行包的转发操作;
- 查询路由表判断转发的目标
- 如果在路由表中找到相匹配的路由,则将匹配项作为转发目标;
- 如果没有找到相匹配的路由,则选择默认路由作为转发目标;
- 查询路由表判断转发的目标
- 根据路由表的网关列判断对方的地址
- 如果网关是一个IP地址,则这个地址就是我们要转发到的目标地址,即还未到达终点,需要继续路由转发;
- 如果网关为空,则IP头部中的接受方IP地址就是要转发到的目标地址,即找到了IP包头里的目标地址,即已经到达了终点;
- 知道对方IP之后通过ARP协议根据IP地址查询MAC地址,并将查询到的结果作为接收方的MAC地址;
- 接着将包转换成电信号通过端口发送出去,发送出去的包会通过交换机到达下一个路由器;
10. 服务器和客户端
- 数据到达服务器后,查看MAC头部信息是否和服务器自己的MAC地址符合,如果符合就将包收起来,并去掉MAC头部;
- 查看数据包中的IP头,IP地址符合,则根据IP头中的协议项判断出上层是TCP协议,并去掉IP头部;
- 查看TCP头部,查看序列号判断是都是需要的,如果是就放入缓存中,并返回一个ACK,如果不是则丢弃;
- TCP中有端口号,HTTP的服务器正在监听这个端口号,服务器将包发送给HTTP进程;
- 服务器的HTTP进程查看请求,并将网页封装在HTTP响应报文中;
- HTTP响应报文加上TCP,IP,MAC头部后,从网卡发送出去,经过交换机,路由器将数据转发给客户端;
- 客户端收到数据后,经过上述相同的过程取出HTTP响应报文,交给浏览器渲染页面;
- 客户端向服务器发起TCP四次回收,双方断开连接;
基础-键入网址到网页显示
http://example.com/2025/05/24/NetworkCommunications/基础-网页显示/