基础-键入网址到网页显示

用户在浏览器中输入www.google.com到网页显示期间,都发生了哪些事?

1. 整体流程

1.1 简化版本

  1. 解析URL,生成发送给web服务器的请求信息;
    • 确定Web服务器
    • 确定请求的文件名
    • 生成HTTP请求信息
  2. DNS解析
    • 浏览器将域名换为IP地址
    • 查询顺序:浏览器缓存-系统本地缓存-递归DNS服务器-根域名服务器-权威DNS服务器
  3. 建立TCP链接
    • 通过三次握手与服务器建立TCP链接
    • 客户端发送SYN包
    • 服务器回复SYN-ACK
    • 客户端确认ACK
  4. 发送HTTP请求
    • 浏览器构造HTTP请求,通过TCP连接发送到服务器
  5. 服务器处理请求
    • 服务器根据请求执行操作,生成HTTP响应头
  6. 浏览器渲染页面

1.2 详细版本

  1. URL解析
    • 浏览器解析URL,确定协议,域名,路径等信息;
    • 如果没有指定路径则访问默认文件;
    • 生成HTTP请求报文;
  2. DNS域名解析
    • 浏览器检查本地缓存-操作系统缓存-hosts文件-本地DNS服务器递归查询
    • 本地DNS递归查询:根DNS-顶级域DNS-权威域DNS
    • 最终获得目标服务器的IP地址
  3. 协议栈与TCP连接
    • 通过socket委托协议栈工作
    • TCP三次握手建立连接:SYN - SYN+ACK - ACK
    • 根据MSS拆分HTTP数据,添加TCP头部(源端口,目的端口,序列号,确认号)
  4. IP封装
    • IP模块添加头部(源IP,目标IP,协议号06表示TCP)
  5. MAC封装与ARP查询
    • 数据链路层添加MAC头部
      • 源MAC地址:本机网卡地址
      • 目标MAC地址:通过ARP协议查询下一跳(网关或目标主机)的MAC地址;
    • ARP缓存MAC地址
  6. 物理层传输(网卡)
    • 在包开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列;
    • 将数字信号转换为电信号,通过网线发送出去;
  7. 交换机和路由器
    • 交换机:根据MAC地址表转发到相应端口,若无记录则广播
    • 路由器:
      • 检查目标IP,匹配路由表决定下一跳
      • 替换源/目标MAC地址;
      • 通过ARP查询下一跳MAC地址;
    • 经过多次到达目标服务器;
  8. 服务器处理并响应
    • 服务器逐层解包:校验MAC - 匹配IP - TCP端口 - HTTP进程
    • 生成HTTP响应,反向封装TCP,IP,MAC头
    • 通过相同路径返回客户端;
  9. 浏览器渲染
    • 客户端接收响应后解包,交给浏览器渲染;
    • 完成四次挥手断开TCP连接;

2. URL

URL包含哪些内容:

1
http://server.com/dir1/file1.html

http: + // + web服务器 + 数据源的路径名

  • 当没有路径名时,代表访问根目录下事先设置的默认文件;

3. DNS

DNS服务器,用来保存web服务器域名与IP的对应关系,从而可以通过域名解析出服务器IP;

域名的层级关系:

  • 根DNS服务器(.)
  • 顶级域DNS服务器(.com)
  • 权威DNS服务器(server.com)

3.1 域名解析流程

域名解析查询顺序为:浏览器本地缓存-操作系统缓存-hosts文件-本地DNS服务器(递归查询)

递归查询流程:

  1. 客户端发送一个DNS请求,询问ww.server.com的IP,并发给本地DNS服务器;(怎么发送给本地DNS服务器???)
  2. 本地域名服务器收到客户端请求后,先在本地缓存里的表格中找,如果找到则直接返回IP地址;
  3. 如果在本地缓存没有找到,则本地DNS服务器询问根域名服务器;
  4. 根DNS服务器收到本地DNS请求后,返回.com顶级域名服务器地址;
  5. 本地DNS收到顶级域名服务器地址后,接着向顶级域名服务器发起请求,询问IP地址;
  6. 顶级域名服务器返回www.server.com区域的权威DNS服务器地址;
  7. 本地DNS收到权威DNS服务器地址后,接着向权威域名服务器发起请求;
  8. 权威域名服务器查询后,将对应的IP地址返回给本地DNS;
  9. 本地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阶段流程

  1. 三次握手建立连接
    • SYN - SYN+ACK - ACK
    • 三次握手的目的时保证双方都有发送和接受数据的能力,以及避免历史连接;
  2. TCP分割数据
    • 如果HTTP请求消息长度超过MSS的长度,TCP需要把HTTP数据拆分成一块块的数据发送;
    • MTU:一个网络包的最大长度,以太网中一般为1500字节;IP头部+TCP头部+数据;
    • MSS:除去IP头部和TCP头部之后,一个网络包能容纳的TCP数据的最大长度;
  3. 在每个拆分的数据加上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地址的选择流程

  1. 提取目标地址
  2. 逐条匹配路由表,按照路由表优先级(子网掩码越长,优先级越高)依次匹配:
    • 将目标IP与每条路由的子网掩码做按位与运算,得到网络地址;
    • 检查结果是否与路由条目的Destination字段匹配;
  3. 确定出口网卡和源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 交换机

  1. 电信号到达网线接口,交换机里的模块进行接收,接着交换机里的模块将电信号转换为数字信号;
  2. 通过包末尾的FCS校验错误,如果没问题则放到缓冲区;
  3. 将包放入缓冲区后,查询这个包的接收方MAC地址是否已经在MAC地址表中有记录;
    • 交换机的MAC地址表包含两个信息:
      • 设备的MAC地址;
      • 该设备连接在交换机的哪个端口上;
  4. 交换机根据MAC地址表来判断应该把包转发到哪里,即交换机根据MAC地址表查找MAC地址,如果MAC地址匹配,则将信号发送到对应的端口。
  5. 如果在MAC地址表中没有找到指定的MAC地址,则将包转发到除了源端口之外的所有端口上;

9.2 交换机和路由器区别

  • 路由器是基于IP设计的,路由器的各个端口都有MAC地址和IP地址;
  • 交换机是基于以太网设计的,交换机的端口不具有MAC地址;

9.3 路由器基本流程

  1. 电信号到达网线接口部分,路由器中的模块将电信号转换为数字信号,通过包末尾的FCS进行错误校验;
  2. 如果没有问题则检查MAC头部中的接受发MAC地址,判断包是不是发给自己的,如果是就放到缓存区中,如果不是就丢弃;
  3. 完成包的接受后,将包的MAC头部丢弃,根据IP头部中的内容进行包的转发操作;
    • 查询路由表判断转发的目标
      • 如果在路由表中找到相匹配的路由,则将匹配项作为转发目标;
      • 如果没有找到相匹配的路由,则选择默认路由作为转发目标;
  4. 根据路由表的网关列判断对方的地址
    • 如果网关是一个IP地址,则这个地址就是我们要转发到的目标地址,即还未到达终点,需要继续路由转发;
    • 如果网关为空,则IP头部中的接受方IP地址就是要转发到的目标地址,即找到了IP包头里的目标地址,即已经到达了终点;
  5. 知道对方IP之后通过ARP协议根据IP地址查询MAC地址,并将查询到的结果作为接收方的MAC地址;
  6. 接着将包转换成电信号通过端口发送出去,发送出去的包会通过交换机到达下一个路由器;

10. 服务器和客户端

  1. 数据到达服务器后,查看MAC头部信息是否和服务器自己的MAC地址符合,如果符合就将包收起来,并去掉MAC头部;
  2. 查看数据包中的IP头,IP地址符合,则根据IP头中的协议项判断出上层是TCP协议,并去掉IP头部;
  3. 查看TCP头部,查看序列号判断是都是需要的,如果是就放入缓存中,并返回一个ACK,如果不是则丢弃;
  4. TCP中有端口号,HTTP的服务器正在监听这个端口号,服务器将包发送给HTTP进程;
  5. 服务器的HTTP进程查看请求,并将网页封装在HTTP响应报文中;
  6. HTTP响应报文加上TCP,IP,MAC头部后,从网卡发送出去,经过交换机,路由器将数据转发给客户端;
  7. 客户端收到数据后,经过上述相同的过程取出HTTP响应报文,交给浏览器渲染页面;
  8. 客户端向服务器发起TCP四次回收,双方断开连接;

基础-键入网址到网页显示
http://example.com/2025/05/24/NetworkCommunications/基础-网页显示/
作者
ZhangHangming
发布于
2025年5月24日
许可协议