从输入URL到页面呈现中间发生了什么?

当我们在浏览器的地址栏中输入URL到页面渲染,中间具体发生了什么?

  1. 地址栏输入URL
  2. DNS解析
  3. 建立HTTP连接(3次握手)
  4. 浏览器渲染页面
  5. 断开连接

地址栏输入URL并解析

URL(Uniform Resource Locator)通常由协议 + 域名 + 端口 + 路径 + 查询参数组成。

比如https://www.baidu.com/search?name=123&age=24

其中https是协议,www.baidu.com是域名,/search是路径,?name=123&age=24是查询参数

解析URL

当我们输入好URL后,浏览器会解析出协议、域名、端口等信息,并发起一个HTTP请求。

  1. 浏览器发起请求前,会根据请求头中的expriseCache-Control判断是否命中强缓存,如果命中则从缓存获取资源,不会发送请求。如果没有命中则进行下一步
  2. 没有命中强缓存,浏览器会发送请求,根据请求头中携带的if-modified-sinceif-none-match判断是否命中协商缓存,命中则从缓存中获取资源,否则进行下一步
  3. 如果前2步都没有命中,则直接从服务端获取资源

浏览器缓存

强缓存

浏览器缓存查找结果,并根据该结果的缓存规则来决定是否使用该缓存的过程

强缓存又分为expriseCache-Control,其中前者为HTTP1.0的产物,后者为HTTP1.1的产物

Exprise
  • 版本:HTTP/1.0
  • 来源:请求头中Exprise(exprise)字段
  • 语法:Expires: Wed, 22 Nov 2019 08:41:00 GMT
  • 缺点:由于某种因素导致服务器的时间和浏览器时间不一致,然后缓存失效
Cache-Control
  • 版本:HTTP/1.1
  • 来源:请求头中Cache-Control(cache-control)字段
  • 语法:cache-control: max-age=604800, public
Cache-Control的值
意思
public所有内容都被缓存(客户端和代理服务器都能缓存)
private所有内容只有客户端可以缓存,Cache-Control的默认值
no-cache客户端缓存内容,但是是否使用该缓存需要进行协商缓存验证
no-store所有内容都不缓存,即每次都发起HTTP请求向服务器获取资源
max-age最大缓存时间(秒),缓存内容将在max-age秒后失效

注意:exprise和cache-control同时存在时,cache-control的优先级更高

协商缓存

当强缓存失效,浏览器携带缓存标识想服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。

last-modified和if-modified-since
  1. 浏览器第一次请求该资源时,服务器会在响应头中添加last-modified字段,代表着该资源在服务器的最后修改时间
  2. 浏览器第二次请求时会携带if-modified-since字段,值为服务器第一次返回的last-modified的值
  3. 服务器收到请求会对比该资源在服务器的的时间,如果相同代表缓存生效,返回304;否则返回最新资源
e-tag和if-none-match
  1. 浏览器第一次请求该资源时,服务器会在响应头中添加e-tag字段,代表该资源的唯一标识
  2. 浏览器第二次请求时会携带if-none-match,值为服务器第一次返回e-tag的值
  3. 服务器收到请求会对比该资源的唯一标识,相同代表资源为更新,缓存生效,返回304,;否则返回最新资源

注意:e-tag和last-modified同时存在时,e-tag的优先级更高

注意,虽然这里简单介绍了浏览器缓存,但这并不是说明DNS解析在协商缓存之前,因为协商缓存是要发送HTTP请求的,而此时却还没有建立HTTP连接。

因为当你输入一个URL后,浏览器觉得这个URL曾经可能访问过,所以会先发送一个获取网页的请求。但是请求在发送前会查找缓存,存在缓存的话就会拦截请求并返回缓存,否则就往下进入网络请求过程

DNS解析

众所周知,在发起HTTP请求前会进行域名解析,为的就是解析出网站的IP地址。为什么要获取网站的IP地址呢?因为域名只是为了方便大家记忆,真实情况下还是通过IP地址进行传输的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ij2vYunZ-1662473527700)(C:\Users\86188\Desktop\笔记\图片\DNS.png)]

递归查询

我们的浏览器、操作系统、路由器都会缓存一些URL对应的IP地址,统称为DNS高速缓存。目的就是为了加快DNS解析速度,每次查询不用直接到根域名服务器中去查询。

查询顺序如下:

  • 浏览器缓存
  • 系统缓存(HOST)
  • 路由器缓存
  • ISP缓存

迭代查询

局部的DNS服务器并不会自己向其他服务器进行查询,而是将能够解析该域名的服务器的IP地址返回给客户端,让客户端再去查询。客户端会不断的向这些服务器进行查询,直到查询到结果。

建立HTTP连接(3次握手)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Glut5Qvs-1662473527701)(C:\Users\86188\Desktop\笔记\图片\TCP.png)]

  • 第一次握手,客户端发送SYN=1,并生成一个随机数X发送到服务器,表示要建立连接
  • 第二次握手,服务器收到请求知道客户端要建立连接,向客户端发送SYN=1,ACK=X+1,和生成的随机数Y
  • 第三次握手,客户端搜到服务器发送过来的包,检查SYN=1,并且ACK的值为第一次发送的X+1,如果正确表面服务器已经接受了请求,于是再发送ACK=Y+1,和随机数Z,服务器收到后确定ACK为自己发送的Y+1,表明连接建立成功

为什么需要三次握手

因为三次握手才能确保客户端和服务器双方的接收和发送能力。第一次握手可以确认客户端的发送能力,第二次握手可以确认服务器的接收能力,和发送能力,第三次握手可以确认客户端的接收能力。少了任何一步都可能存在丢包的现象

三次握手中可以携带数据吗

第三次握手时可以携带数据,因为第三次握手对于客户端来说已经建立连接了,并且已经知道服务器接收和发送能力正常了,所以可以发送数据

浏览器渲染页面

渲染过程:

  • 解析下载的HTML生成DOM树,解析下载的CSS生成CSS树
  • DOM树和CSS树合并为渲染树
  • 渲染树根据规则为每个节点生成图形和确定位置
  • 绘制节点
  • GPU渲染页面

断开连接(4次挥手)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b7hLzAuD-1662473527701)(C:\Users\86188\Desktop\笔记\图片\TCP_CLOSE.png)]

挥手过程:

  1. 第一次挥手,客户端发送FIN报文,表示要断开连接。此时客户端处于FIN-WAIT-1状态
  2. 第二次挥手,服务端收到FIN报文后,会向客户端发送确认ACK,表示已经收到客户端的报文了。此时服务端处于CALOSE-WAIT状态
  3. 第三次挥手,服务端也想断开连接和,发送FIN报文。此时服务端处于LAST_ACK状态
  4. 第四次挥手,客户端收到服务端的报文知道可以断开连接了,于是发送ACK报文,过了一段时间确保服务端能收到发送的报文后进入CLOSED状态。服务端收到客户端的ACK报文后也就关闭连接了,处于CLOSED状态

为什么挥手需要4次

因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。

为什么客户端发送完ACK之后不能直接关闭,需要等一会?

客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。如果不等待,客户端直接跑路,当服务端还有很多数据包要给客户端发,且还在路上的时候,若客户端的端口此时刚好被新的应用占用,那么就接收到了无用数据包,造成数据包混乱。

参考资料:https://juejin.cn/post/6935232082482298911

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 好的,我了解了。关于您的问题,整个过程可以分为以下几个步骤: 1. 输入URL:当您在浏览器地址栏中输入URL时,浏览器会将该URL发送到域名系统(DNS),通过域名系统将URL转化为IP地址。 2. 发送HTTP请求:浏览器根据URL发起HTTP请求,请求访问Web服务器的特定资源。 3. 服务器响应:当Web服务器接收到请求时,它将处理请求并返回所请求的资源。 4. 浏览器渲染:浏览器收到服务器响应后,它将解析HTML源代码,并根据CSS样式表和JavaScript代码来渲染页面。 5. 页面展示:最终,浏览器将HTML、CSS和JavaScript代码解析完毕后,它会在屏幕上展示出页面内容。 以上就是从输入URL页面展示的整个过程,希望能够帮到您。 ### 回答2: 当我们在浏览器的地址栏中输入URL时,整个过程可以分为以下几个步骤: 1. DNS解析:浏览器首先会根据URL中的域名(例如www.example.com)进行DNS解析,将域名解析为对应的IP地址。这一步骤是为了找到存放网页的服务器。 2. 建立TCP连接:浏览器通过IP地址与服务器建立TCP连接。TCP协议提供可靠的连接,确保数据的完整性。 3. 发起HTTP请求:一旦建立了TCP连接,浏览器会向服务器发起HTTP请求,请求包括请求方法、请求头、请求体等信息。请求方法可以是GET、POST等,服务器根据请求的不同做出相应的响应。 4. 服务器处理请求并响应:服务器接收到浏览器的请求后,会根据请求的内容进行相应的处理。处理包括读取数据库、执行后端代码等操作。之后,服务器会生成响应对象,包含响应状态码、响应头、响应体等信息。 5. 接收服务器响应:浏览器接收到服务器的响应后,根据响应头中的Content-Type确定响应的数据类型。如为HTML类型,则浏览器会将响应的HTML代码解析成DOM树。 6. 解析页面并渲染:浏览器根据DOM树构建渲染树,并依据CSS样式对各元素进行布局和样式计算,最终生成页面的渲染结果。同时,浏览器也会执行页面中的JavaScript代码。 7. 页面展示:最后,浏览器将渲染好的页面内容显示在用户的视窗中,用户可以看到页面的展示效果。 总结起来,从输入URL页面展示,经历了DNS解析、建立TCP连接、发起HTTP请求、服务器处理请求并响应、接收服务器响应、解析页面并渲染等多个步骤。最终,浏览器将渲染好的页面内容显示给用户。 ### 回答3: 从输入URL页面展示,大致经历如下步骤: 1. 域名解析:当我们在浏览器中输入URL后,首先会进行域名解析。浏览器会向DNS服务器发送域名请求,获取该域名对应的IP地址。 2. 建立连接:浏览器通过获取到的IP地址与Web服务器建立TCP连接。这个过程使用的是三次握手协议,确保连接的可靠性。 3. 发送请求:建立连接后,浏览器会发送HTTP请求给Web服务器,请求的内容包括请求的类型(GET/POST等)、地址、头部信息、可能还包括cookie等相关信息。 4. 服务器处理请求:Web服务器收到请求后,会根据请求内容进行处理。处理过程可能包括调取数据库、运行后台程序等动作。 5. 服务器响应:Web服务器根据请求的内容,返回一个HTTP响应给浏览器。响应的内容包括状态码、响应头部、实际的网页内容等。 6. 下载页面资源:浏览器接收到服务器返回的响应后,会开始下载网页的资源,如HTML、CSS、JavaScript、图片等。浏览器会根据响应头部中的Content-Type确定如何解析资源。 7. 页面渲染:当所有的资源下载完成后,浏览器会根据HTML结构、CSS样式,解析并渲染出网页。浏览器会从上到下解析HTML文档,解析过程包括构建DOM树、计算CSS样式、布局页面等。 8. JavaScript执行:在渲染过程中,浏览器会遇到JavaScript代码。浏览器会逐行解析执行JavaScript代码,并根据代码修改DOM树和样式,可能还会触发网络请求等。 9. 页面展示:当页面渲染和JavaScript执行完成后,页面便可以完整地展示给用户了。用户可以看到页面内容,与页面进行交互。 以上仅是一个大致的过程,实际上还有很多细节和额外的步骤,比如缓存机制、重定向、Cookie处理等等。不同的浏览器、服务器也可能会有些许差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值