在浏览器输入URL之后, 会发生什么?

在浏览器输入URL之后的流程大体分为六步:

  1. DNS解析
  2. 发起TCP连接(三次握手)
  3. 发送HTTP请求
  4. 服务器处理请求并返回HTTP报文
  5. 浏览器解析渲染页面
  6. 关闭连接请求(四次挥手)

这里用一张可视化图表来演示流程

输入URL之后

1. DNS解析

DNS解析就是寻找在哪台主机上有你需要的资源的过程, 也就是寻找输入域名的ip地址。

浏览器会首先检查本地的缓存和本地host文件, 有没有该域名的ip地址, 如果有,就直接使用; 如果没有, 本地的DNS客户端就会向本地的DNS服务器(比如中国电信\中国移动) 发送请求, 询问他们输入域名对应的ip地址是多少, 同样地,本地DNS服务器会先查看他自己的缓存记录, 如果有就直接返回, 如果没有, 就继续向根域名服务器查询\顶级域名服务器\权威域名服务器。

2. 发起TCP连接(三次握手)

三次握手的机制是为了建立起一个安全可靠的连接, 客户端和服务端都要保证自己能够发送数据和接受数据。

与四次握手不同, 三次握手是首先由客户端发起的, 客户端首先给服务端发送一个syn报文, 当服务端收到之后,他就知道客户端想要建立一个新的连接, 于是服务端会给客户端发送一个ack位置1, 以及syn位置1的消息确认包, 当客户端收到确认包之后, 客户端就知道了我既能发送数据又能接收数据。

但这个时候服务端只知道自己能接受数据, 还不能确认自己发送的数据, 客户端能不能接收得到, 所以客户端还需要给服务端发送一个ack位置1的报文, 也就是第三次握手。

完成以上操作后, 三次握手就正式结束了, 双方建立起了一个安全可靠的连接。

3. 发送HTTP请求

在成功建立TCP连接后,客户端(通常是浏览器)会发送一个HTTP请求到服务器。

这个HTTP请求包含了很多信息,比如请求的方法(GET、POST等)、请求的资源路径(URL)、HTTP版本(如HTTP/1.1)、请求头部(Headers)等。

请求头部可以包含很多元数据,比如客户端的类型、支持的压缩方式、缓存策略、Cookie等。这些信息有助于服务器理解和处理请求。

4. 服务器处理请求并返回HTTP报文

服务器接收到HTTP请求后,会根据请求的内容进行相应的处理。这可能包括查询数据库、执行程序逻辑、读取文件等。

处理完成后,服务器会生成一个HTTP响应报文,并将其发送回客户端。这个响应报文同样包含很多信息,比如HTTP状态码(如200表示成功、404表示未找到资源)、响应头部(Headers)、响应体(Body)等。

响应头部可以包含内容类型、内容长度、缓存策略等信息。响应体则包含了实际的数据,比如HTML文档、图片、JSON数据等。

5. 浏览器解析渲染页面

浏览器接收到服务器的HTTP响应后,会开始解析响应报文。如果响应体是HTML文档,浏览器会按照HTML文档的结构来渲染页面。

渲染过程中,浏览器可能会遇到需要加载的外部资源,比如CSS样式表、JavaScript脚本、图片等。这时,浏览器会再次发起HTTP请求来获取这些资源,并依次解析和渲染。

渲染完成后,用户就可以在浏览器中看到完整的网页了。

步骤简要说明
1.解析HTML解析完会得到DOM树和CSSOM树
2.样式计算遍历得到的DOM树,根据样式优先级规则为树中的每个节点计算出它最终的样式,得到一颗带有样式的DOM树
3.布局(flow)依次遍历DOM树的每一个节点, 计算每个节点的几何信息, 得到布局树
4.分层分层的好处在于, 将来某一个层改变后, 仅会对该层进行后续处理,从而提升效率。而滚动条, 堆叠上下文, transform, opacity 等样式都会或多或少的影响分层结果, 也可以通过will-change属性更大程度地影响分层结果
5.绘制(paint)为每个层单独产生绘制指令集, 用于描述这一层的内容该如何 ‘画’ 出来
6.分块前面5个步骤主要是工作在渲染主线程中, 完成绘制后, 主线程会将每个图层的绘制信息提交给合成线程, 剩余工作将由合成线程完成。合成线程首先对每个图层进行分块, 将其划分为更多的小区域, 再从线程池中调动多个线程来完成分块工作
7.光栅化合成线程会将块信息交给GPU进程,以极高的速度完成光栅化。而GPU进程会调动多个线程来完成光栅化, 并且优先处理靠近视口区域的块
8.画合成线程拿到每个层,每个块的位图后,生成一个个 指引(quad) 信息, 然后将quad提交给GPU进程, 由GPU进程产生系统调用, 提交给GPU硬件,完成最终的屏幕成像。

6. 关闭连接请求(四次挥手)

四次挥手呢可以由任意的一方发起, 假设发起方是客户端

挥手说明
第一次客户端就会发送一个fin位置1的报文, 当服务端收到该报文就会知道客户端想要断开连接,
第二次但这个时候服务端不一定能够做好准备, 因为此时服务端很有可能有一些未发送完的消息, 所以此时服务端只能进行一个消息的确认, 给客户端先发送一个ack报文, 让客户端知道我这边知道你想要断开连接了, 但我还有数据没有发送完, 等我发送完之后再联系你。
第三次当服务端发送完数据就会再给客户端发送一个fin报文,表示数据发完了, 可以断开连接
第四次客户端收到之后还需要再给服务端发送一个ack报文, 也就是第四次挥手, 表示收到了, 至此正式完成断开连接。
当在浏览器输入URL后,会发生以下一系列流程: ### DNS解析 浏览器首先会检查本地的DNS缓存(包括操作系统和浏览器自身的缓存),看是否有该URL对应的IP地址。如果缓存中没有,则向本地DNS服务器发送请求。本地DNS服务器若无法解析,会向根域名服务器、顶级域名服务器、权威域名服务器逐级查询,最终获取到该URL对应的IP地址。例如,当输入`www.example.com`,经过DNS解析得到其对应的IP地址(如`192.0.2.1`)。 ### TCP连接 浏览器利用获取到的IP地址和默认的端口号(如HTTP的80端口,HTTPS的443端口),通过TCP协议与服务器建立连接。TCP连接使用三次握手来确保双方都有发送和接收数据的能力。具体过程如下: - 客户端向服务器发送一个SYN包,请求建立连接。 - 服务器收到SYN包后,向客户端发送SYN + ACK包,表示同意建立连接。 - 客户端收到SYN + ACK包后,向服务器发送ACK包,完成三次握手,连接建立。 ### HTTP请求 连接建立后,浏览器会根据URL和相关设置,构建一个HTTP请求消息。这个消息包含请求行(如`GET /index.html HTTP/1.1`)、请求头(包含用户代理、接受的内容类型等信息)和可选的请求体(如POST请求时会包含提交的数据)。然后将这个请求消息通过TCP连接发送给服务器。 ### 服务器处理请求 服务器接收到HTTP请求后,会根据请求的内容进行处理。服务器可能会解析请求的URL,查找对应的资源(如HTML文件、图片等),执行相关的脚本(如PHP、Python等),并根据处理结果生成HTTP响应消息。 ### HTTP响应 服务器处理完请求后,会向浏览器发送HTTP响应消息。响应消息包含状态行(如`HTTP/1.1 200 OK`)、响应头(包含内容类型、缓存控制等信息)和响应体(包含请求的资源内容,如HTML页面的代码)。 ### 浏览器解析渲染页面 - 浏览器首先解析HTML文件,构建DOM(文档对象模型)树。 - 同时,解析CSS文件,构建CSSOM(CSS对象模型)树。 - 将DOM树和CSSOM树合并成渲染树。 - 根据渲染树进行布局,计算每个元素的位置和大小。 - 最后进行绘制,将页面内容显示在浏览器窗口中。 ### TCP断开连接 当页面渲染完成或浏览器不再需要与服务器通信时,会通过TCP的四次挥手过程断开与服务器的连接。具体过程如下: - 客户端向服务器发送FIN包,表示请求关闭连接。 - 服务器收到FIN包后,向客户端发送ACK包,表示同意关闭连接。 - 服务器向客户端发送FIN包,表示请求关闭连接。 - 客户端收到FIN包后,向服务器发送ACK包,表示同意关闭连接,完成四次挥手,连接断开。 以下是一个简单的Python示例,模拟HTTP请求: ```python import requests # 发送HTTP GET请求 response = requests.get('https://www.example.com') # 打印响应状态码 print(response.status_code) # 打印响应内容 print(response.text) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值