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

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

2. DNS域名解析
浏览器解析 URL 并生成 HTTP 消息后,需要委托操作系统将消息发送给 Web 服务器,但在发送之前,需要查询服务器域名对应的IP地址。
- 检查缓存:浏览器按顺序检查缓存中是否有该域名的 IP 记录:
-
- 浏览器缓存
- 操作系统缓存
- 路由器缓存
- 查询DNS服务器:如果缓存中没有,浏览器会向配置的DNS服务器发起查询
-
- 以递归方式查询:从根域名服务器(
.) -> 顶级域名服务器(.com) -> 权威域名服务器(google.com)一层层查下去,最终获得www.google.com对应的 IP 地址
- 以递归方式查询:从根域名服务器(
至此,浏览器获取到了目标服务器的IP地址

3. 建立TCP连接(传输层)
浏览器需要和服务器建立可靠的连接,通过 TCP 三次握手 完成
- 第一次握手 (SYN): 客户端(SYN-SENT) -> 服务端(CLOSED): 客户端发送一个SYN报文段,表示请求建立连接
- 第二次握手 (SYN + ACK): 服务端(SYN-REVD) -> 客户端(SYN-SENT): 服务端在接收到客户端的请求后,如果同意连接,服务端会向客户端发送一个SYN+ACK报文段,表示同意建立连接
- 第三次握手 (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 握手,建立安全加密连接:
- ClientHello:浏览器向服务器发送支持的加密算法列表和一个随机数。
- ServerHello:服务器选择加密算法,发送自己的数字证书和一个随机数。
- 验证与预主密钥:浏览器验证证书的合法性(是否过期,是否由可信机构颁发,域名是否匹配)。然后生成一个“预主密钥”,用证书中的公钥加密后发送给服务器。
- 生成会话密钥:服务器用私钥解密后,双方利用三个随机数生成相同的会话密钥,后续所有的 HTTP 数据都将使用这个会话密钥进行加密传输。
- 最后确认:浏览器最后会向服务器发送一个使用会话密钥加密过的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.1或HTTP/2)。 - 请求头:包含大量信息,如:
-
Host: www.google.comUser-Agent(浏览器身份标识)Accept(能接收的响应数据类型,如text/html)Cookie(包含会话信息等)
- 请求体:通常在
POST方法时存在,包含提交的表单数据等。
7. 服务器处理HTTP请求
服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。
服务器在接收到数据包后,
- 先检查数据包的MAC头部,查看是否与自己的MAC地址符合
- 如果MAC地址符合,在检查数据包的IP头中的IP地址是否符合,并根据IP头得知上层是TCP协议
- 检查TCP头部,查看序列号是否是需要的,如果是就接收并返回ACK,否则丢弃,同时TCP头部还有端口号,HTTP的服务器正在监听这个端口号
- 服务器将HTTP数据发给HTTP进程,最后将请求的网页封装在HTTP响应报文并返回

8. 浏览器处理HTTP报文
服务器接收到请求后会响应一个HTTP报文,浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示
9. 关闭 TCP 连接
数据传送完毕后,需要断开 TCP 连接释放资源,即 TCP 四次挥手:
- FIN:浏览器发送 FIN 包,表示数据发送完毕,请求关闭连接。
- ACK:服务器回复 ACK 包,表示同意关闭。
- FIN:服务器也发送 FIN 包,表示自己的数据也发送完毕。
- ACK:浏览器回复 ACK 包,确认关闭。等待一段时间后,双方连接正式关闭。

被折叠的 条评论
为什么被折叠?



