从输入URL到网页显示的过程

总体流程:

  1. 用户在浏览器中输入指定URL地址。
  2. 浏览器通过DNS协议,获取域名对应的IP地址。
  3. 浏览器根据IP地址和端口号,向目标服务器发起一个TCP连接请求。
  4. 浏览器在TCP连接上,向服务器发送一个HTTP请求报文,请求服务器返回指定URL的资源。
  5. 服务器接收到HTTP请求后,处理请求,并返回HTTP响应报文给浏览器。
  6. 浏览器收到HTTP响应报文后,解析响应体中的HTML代码,渲染网页结构和样式,同时根据HTML中的其他资源的URL(如CSS、JavaScript、图片等),继续发起HTTP请求获取这些资源,直到网页完全加载显示。
  7. 浏览器再不需要和服务器通信时,可以主动关闭TCP连接,或者等待服务器的关闭请求。

一、URL

URL(Uniform Resource Locator)是统一资源定位符,是互联网上资源的地址。URL由以下几个部分组成:

  1. 协议(Protocol):指定访问资源所使用的协议,如HTTPHTTPSFTP等。
  2. 域名(Domain):域名是访问网址的通用名,这里也有可能是网址的IP地址,域名可以理解为IP地址的可读版本。
  3. 端口号(Port):指定服务器上提供服务的端口号,HTTP协议默认端口是80,HTTPS协议默认端口是443,如果使用默认端口,可以省略不写。
  4. 资源路径(Path):指定服务器上资源的具体位置。从第一个/开始,表示从服务器上根目录开始进行索引到的文件路径,上图中要访问的文件就是服务器目录下的/path/to/myfile.html
  5. 参数(Parameters):URL中可以包含一些参数,这些参数通常以?开头,多个参数之间用&分隔,每个参数由键值对组成,键和值之间用=连接,如?key1=value1&key2=value2
  6. 锚点(Anchor):URL中可以包含一个锚点,锚点以#开头,表示页面中的一个特定位置,如#section1,当浏览器加载页面后,会自动滚动到该位置。

二、DNS解析

通过浏览器解析URL并生成HTTP消息后,需要委托操作系统将消息发送给Web服务器。操作系统需要知道Web服务器的IP地址才能将消息发送到正确的目的地。

DNS(Domain Name System)就是用来将Web服务器域名转换为IP地址的系统。

DNS中的域名用句号进行分隔,越靠右的位置表示其层级越高,如www.example.com中,com是顶级域名,example是二级域名,www是三级域名。

DNS解析的过程如下:

  1. 客户端首先发出一个DNS请求,询问www.example.com的IP地址,并发给本地DNS服务器(也就是客户端的TCP/IP设置中填写的DNS服务器地址)。
  2. 本地域名服务器收到客户端请求后,如果缓存表中能找到www.example.com的IP地址,就直接返回给客户端;如果找不到,本地DNS就向根域名服务器发出请求,根域名服务器是最高层次的,它不直接用于域名解析,但是能告诉本地DNS哪个顶级域名服务器负责解析com域名。
  3. 根DNS收到来自本地DNS的请求后,发现后置是.com,就返回负责解析.com域名的DNS服务器地址给本地DNS。
  4. 本地DNS收到根DNS的回复后,向负责解析.com域名的DNS服务器发出请求,询问www.example.com的IP地址。
  5. 顶级域名服务器收到本地DNS的请求后,发现后置是example.com,就返回负责解析example.com域名的DNS服务器地址给本地DNS。
  6. 本地DNS收到顶级DNS的回复后,向负责解析example.com域名的DNS服务器发出请求,询问www.example.com的IP地址。
  7. 二级域名服务器收到本地DNS的请求后,发现后置是www.example.com,就返回www.example.com的IP地址给本地DNS。
  8. 本地DNS收到二级DNS的回复后,将www.example.com的IP地址返回给客户端。
  9. 客户端收到本地DNS的回复后,就知道了www.example.com的IP地址,可以与目标建立连接。

三、协议栈

通过DNS获取到IP地址后,就可以把HTTP的传输工作交给操作系统的协议栈。

应用程序(浏览器)通过调用Socket库来委托协议栈工作。

协议栈上半部分有两块,分别是负责收发数据的TCP和UDP协议,下半部分是用IP协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由IP协议完成的。

IP中还包括ICMP协议和ARP协议:

  • ICMP用于告知网络包传送过程中产生的错误以及各种控制信息。
  • ARP用于根据IP地址查询相应的以太网的MAC地址。

IP下面的网卡驱动程序负责控制网卡硬件,最下面的网卡则负责实际的收发操作,也就是对网线中的信号执行发送和接收操作。

四、TCP

HTTP是基于TCP协议的,TCP协议是面向连接的协议,提供可靠的、面向字节流的通信服务。TCP协议通过三次握手建立连接,四次挥手断开连接。

TCP报文头部:

  • 源端口号和目的端口号:分别表示发送方和接收方的端口号。
  • 序列号和确认号:用于保证数据的可靠传输,序列号表示发送的数据的顺序,确认号表示接收方已经收到的数据的序列号。
  • 确认号:目的是确认发出去对方是否收到。
  • 状态位:
    • SYN:表示建立连接的请求。
    • ACK:表示确认收到数据。
    • RST:表示重置连接。
    • FIN:表示结束连接。
  • 窗口大小:表示接收方的缓冲区大小,用于流量控制。
  • 校验和:用于检验数据在传输过程中是否发生了错误。
  • 紧急指针:表示紧急数据的偏移量,用于处理紧急数据。
  • 选项:用于扩展TCP协议的功能,如时间戳、窗口扩大等。
  • 数据:TCP报文的负载部分,包含了HTTP请求或响应的内容。

TCP网络包报文:

五、IP

TCP在执行连接、收发、断开等各阶段操作时,都需要委托IP模块将数据封装成网络包发送给通信对象。

IP报文头部:

  • 源地址IP:即客户端输出的IP地址。
  • 目的地址IP:即通过DNS域名解析得到的服务器的IP地址。
  • 版本号:表示IP协议的版本,目前常用的是IPv4和IPv6。
  • 协议号:表示上层协议的类型,如TCP协议的协议号是6,UDP协议的协议号是17。

IP网络包报文:

六、MAC

生成了IP头部之后,接下来还需在IP头部加上MAC头部。

MAC包头格式:

  • 发送方MAC地址:即客户端的MAC地址。
  • 接收方MAC地址:即服务器的MAC地址。
  • 协议类型:
    • 0800:IP协议
    • 0806:ARP协议

MAC网络包报文:

七、整体流程


参考资料: