【计算机网络】从输入网址到页面显示的过程是怎样的?深入解析HTTP请求到响应详细流程

1. URL解析

判断URL格式是否正确,如果没有添加http://前缀,会默认使用HTTP协议,之后对 URL 进行解析,从而生成发送给 Web 服务器的请求信息

生成HTTP请求(应用层)

对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息了

2. DNS域名解析

浏览器解析 URL 并生成 HTTP 消息后,需要委托操作系统将消息发送给 Web 服务器,但在发送之前,需要查询服务器域名对应的IP地址

  • 检查缓存:浏览器按顺序检查缓存中是否有该域名的 IP 记录:
    1. 浏览器缓存
    2. 操作系统缓存
    3. 路由器缓存
  • 查询DNS服务器:如果缓存中没有,浏览器会向配置的DNS服务器发起查询
    • 递归方式查询:从根域名服务器(.) -> 顶级域名服务器(.com) -> 权威域名服务器(google.com)一层层查下去,最终获得 www.google.com 对应的 IP 地址

至此,浏览器获取到了目标服务器的IP地址

3. 建立TCP连接(传输层)

浏览器需要和服务器建立可靠的连接,通过 TCP 三次握手 完成

  1. 第一次握手 (SYN): 客户端(SYN-SENT) -> 服务端(CLOSED): 客户端发送一个SYN报文段,表示请求建立连接
  2. 第二次握手 (SYN + ACK): 服务端(SYN-REVD) -> 客户端(SYN-SENT): 服务端在接收到客户端的请求后,如果同意连接,服务端会向客户端发送一个SYN+ACK报文段,表示同意建立连接
  3. 第三次握手 (ACK): 客户端(ESTABLISHED) -> Server(ESTABLISHED): 客户端接收到服务端的响应,最后发送一个ACK响应,表示连接建立完成

至此,TCP 连接建立成功,双方可以开始可靠地传输数据

TCP分割数据

如果HTTP请求消息较长,在建立TCP连接之后,TCP就需要把HTTP请求分割成多份,之后给每一份数据加上TCP头部,交给IP模块发送数据

  • MTU:一个网络包的最大长度,以太网中一般为 1500 字节。
  • MSS:除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度。

TCP报文生成

TCP连接建立后,会生成TCP头部,并给每个分割的数据加上TCP头部,形成TCP数据段

注意

如果是 HTTPS 协议TCP 连接之后,还需要进行 TLS 握手,建立安全加密连接:

  1. ClientHello:浏览器向服务器发送支持的加密算法列表和一个随机数。
  2. ServerHello:服务器选择加密算法,发送自己的数字证书和一个随机数。
  3. 验证与预主密钥:浏览器验证证书的合法性(是否过期,是否由可信机构颁发,域名是否匹配)。然后生成一个“预主密钥”,用证书中的公钥加密后发送给服务器。
  4. 生成会话密钥:服务器用私钥解密后,双方利用三个随机数生成相同的会话密钥,后续所有的 HTTP 数据都将使用这个会话密钥进行加密传输。
  5. 最后确认:浏览器最后会向服务器发送一个使用会话密钥加密过的Finished请求,服务器接收并解密后,同样向浏览器发送一个使用会话密钥加密过的Finished请求,浏览器解密确认后,握手完成

4. 寻址和路由(网路层)

运输层将TCP段交给网络层,网络层的核心任务是在不同的网络之间进行寻址和路由选择,将数据包从源主机送到目标主机

4.1. 封装IP头部
  • IP将TCP段作为数据,在TCP段前加上IP头部
  • 关键字段:
    • 源地址IP
    • 目的地址IP
4.2. 选择路由路径

IP协议根据目的IP地址,通过路由器的路由表,规划数据包到达目的地的最佳路径

此时,IP数据包如下

5. 封装以太网帧(网络接口层)

网络层将IP数据包交给网络接口层,网络接口层的核心任务是通过IP地址查询目的主机的MAC地址,并封装成以太网帧

5.1. 确认双方MAC
  • 发送方的 MAC 地址获取就比较简单了,MAC 地址是在网卡生产时写入到 ROM 里的,只要将这个值读取出来写入到 MAC 头部就可以了
  • 接收方则需要通过ARP协议获取接受方的MAC地址

最后生成MAC头部,并加到IP数据包前,同时在后面加上帧尾,此时以太网帧如下:

6. 发送HTTP请求

连接建立后,浏览器会构造一个 HTTP 请求报文,并通过连接发送给服务器,请求获取网页内容。

报文包括:

  • 请求行:包含请求方法(如 GET, POST)、请求路径(/)、HTTP 版本(HTTP/1.1HTTP/2)。
  • 请求头:包含大量信息,如:
    • Host: www.google.com
    • User-Agent(浏览器身份标识)
    • Accept(能接收的响应数据类型,如 text/html
    • Cookie(包含会话信息等)
  • 请求体:通常在 POST 方法时存在,包含提交的表单数据等。

7. 服务器处理HTTP请求

服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。

服务器在接收到数据包后,

  1. 先检查数据包的MAC头部,查看是否与自己的MAC地址符合
  2. 如果MAC地址符合,在检查数据包的IP头中的IP地址是否符合,并根据IP头得知上层是TCP协议
  3. 检查TCP头部,查看序列号是否是需要的,如果是就接收并返回ACK,否则丢弃,同时TCP头部还有端口号,HTTP的服务器正在监听这个端口号
  4. 服务器将HTTP数据发给HTTP进程,最后将请求的网页封装在HTTP响应报文并返回

8. 浏览器处理HTTP报文

服务器接收到请求后会响应一个HTTP报文,浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示

9. 关闭 TCP 连接

数据传送完毕后,需要断开 TCP 连接释放资源,即 TCP 四次挥手

  1. FIN浏览器发送 FIN 包,表示数据发送完毕,请求关闭连接。
  2. ACK服务器回复 ACK 包,表示同意关闭。
  3. FIN服务器也发送 FIN 包,表示自己的数据也发送完毕。
  4. ACK浏览器回复 ACK 包,确认关闭。等待一段时间后,双方连接正式关闭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值