浏览器输入URL回车会发生什么

news/2024/8/26 16:58:06
这是一个非常经典的面试题,这道题没有具体的答案,它涉及很多的知识点,面试官会通过这道题了解你对哪一方面的知识比较擅长,
然后继续追问看看你的掌握程度。当然我写的这些也只是我的一些简单的理解,从前端的角度出发,我觉得首先回答必须包括几个基本的点,然后在根据你的理解深入回答。

1、浏览器的地址栏输入URL并按下回车。

2、浏览器查找当前URL是否存在缓存,并比较缓存是否过期。

3、DNS解析URL对应的IP。

4、根据IP建立TCP连接(三次握手)。

5、HTTP发起请求。

6、服务器处理请求,浏览器接收HTTP响应。

7、渲染页面,构建DOM树。

8、关闭TCP连接(四次挥手)

面试时回答以上八个步骤即可

一、URL 解析

地址解析:

首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。

HSTS

由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问页面

其他操作

浏览器还会进行一些额外的操作,比如安全检查、访问限制(之前国产浏览器限制 996.icu)。

检查缓存

二、缓存

说完URL我们说说浏览器缓存,HTTP缓存有多种规则,根据是否需要重新向服务器发起请求来分类,我将其分为强制缓存,对比缓存。

强制缓存判断HTTP首部字段:cache-control,Expires。

Expires是一个绝对时间,即服务器时间。浏览器检查当前时间,如果还没到失效时间就直接使用缓存文件。但是该方法存在一个问题:服务器时间与客户端时间可能不一致。因此该字段已经很少使用。

cache-control中的max-age保存一个相对时间。例如Cache-Control: max-age = 484200,表示浏览器收到文件后,缓存在484200s内均有效。 如果同时存在cache-control和Expires,浏览器总是优先使用cache-control。

对比缓存通过HTTP的last-modified,Etag字段进行判断。

last-modified是第一次请求资源时,服务器返回的字段,表示最后一次更新的时间。下一次浏览器请求资源时就发送if-modified-since字段。服务器用本地Last-modified时间与if-modified-since时间比较,如果不一致则认为缓存已过期并返回新资源给浏览器;如果时间一致则发送304状态码,让浏览器继续使用缓存。

Etag:资源的实体标识(哈希字符串),当资源内容更新时,Etag会改变。服务器会判断Etag是否发生变化,如果变化则返回新资源,否则返回304。

在这里插入图片描述
 三、DNS域名解析

我们知道在地址栏输入的域名并不是最后资源所在的真实位置,域名只是与IP地址的一个映射。网络服务器的IP地址那么多,我们不可能去记一串串的数字,因此域名就产生了,域名解析的过程实际是将域名还原为IP地址的过程。

首先浏览器先检查本地hosts文件是否有这个网址映射关系,如果有就调用这个IP地址映射,完成域名解析。

如果没找到则会查找本地DNS解析器缓存,如果查找到则返回。

如果还是没有找到则会查找本地DNS服务器,如果查找到则返回。

最后迭代查询,按根域服务器 ->顶级域,.cn->第二层域,hb.cn ->子域,www.hb.cn的顺序找到IP地址。

在这里插入图片描述
  四、TCP连接

在通过第一步的DNS域名解析后,获取到了服务器的IP地址,在获取到IP地址后,便会开始建立一次连接,这是由TCP协议完成的,主要通过三次握手进行连接。

第一次握手: 建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;

第二次握手: 服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手: 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。
在这里插入图片描述

五、浏览器向服务器发送HTTP请求

完整的HTTP请求包含请求起始行、请求头部、请求主体三部分。

在这里插入图片描述
   在这里插入图片描述

六、浏览器接收响应

服务器在收到浏览器发送的HTTP请求之后,会将收到的HTTP报文封装成HTTP的Request对象,并通过不同的Web服务器进行处理,处理完的结果以HTTP的Response对象返回,主要包括状态码,响应头,响应报文三个部分。

状态码主要包括以下部分

1xx:指示信息–表示请求已接收,继续处理。

2xx:成功–表示请求已被成功接收、理解、接受。

3xx:重定向–要完成请求必须进行更进一步的操作。

4xx:客户端错误–请求有语法错误或请求无法实现。

5xx:服务器端错误–服务器未能实现合法的请求。

响应头主要由Cache-Control、 Connection、Date、Pragma等组成。

响应体为服务器返回给浏览器的信息,主要由HTML,css,js,图片文件组成。

七、页面渲染

如果说响应的内容是HTML文档的话,就需要浏览器进行解析渲染呈现给用户。整个过程涉及两个方面:解析和渲染。在渲染页面之前,需要构建DOM树和CSSOM树。在这里插入图片描述
   在浏览器还没接收到完整的 HTML 文件时,它就开始渲染页面了,在遇到外部链入的脚本标签或样式标签或图片时,会再次发送 HTTP 请求重复上述的步骤。在收到 CSS 文件后会对已经渲染的页面重新渲染,加入它们应有的样式,图片文件加载完立刻显示在相应位置。在这一过程中可能会触发页面的重绘或重排。这里就涉及了两个重要概念:Reflow和Repaint。

Reflow,也称作Layout,中文叫回流,一般意味着元素的内容、结构、位置或尺寸发生了变化,需要重新计算样式和渲染树,这个过程称为Reflow。

Repaint,中文重绘,意味着元素发生的改变只是影响了元素的一些外观之类的时候(例如,背景色,边框颜色,文字颜色等),此时只需要应用新样式绘制这个元素就OK了,这个过程称为Repaint。

所以说Reflow的成本比Repaint的成本高得多的多。DOM树里的每个结点都会有reflow方法,一个结点的reflow很有可能导致子结点,甚至父点以及同级结点的reflow。

下面这些动作有很大可能会是成本比较高的:

增加、删除、修改DOM结点时,会导致Reflow或Repaint

移动DOM的位置,或是搞个动画的时候

内容发生变化

修改CSS样式的时候

Resize窗口的时候(移动端没有这个问题),或是滚动的时候

修改网页的默认字体时

基本上来说,reflow有如下的几个原因:

Initial,网页初始化的时候

Incremental,一些js在操作DOM树时

Resize,其些元件的尺寸变了

StyleChange,如果CSS的属性发生变化了

Dirty,几个Incremental的reflow发生在同一个frame的子树上

八、关闭TCP连接或继续保持连接

通过四次挥手关闭连接(FIN ACK, ACK, FIN ACK, ACK)。
  在这里插入图片描述
   第一次挥手是浏览器发完数据后,发送FIN请求断开连接。

第二次挥手是服务器发送ACK表示同意,如果在这一次服务器也发送FIN请求断开连接似乎也没有不妥,但考虑到服务器可能还有数据要发送,所以服务器发送FIN应该放在第三次挥手中。

这样浏览器需要返回ACK表示同意,也就是第四次挥手。

至此从浏览器地址栏输入URL到页面呈现到你面前的整个过程就分析完了。
在这里插入图片描述


http://www.niftyadmin.cn/n/2752946.html

相关文章

Redis:WRONGTYPE Operation against a key holding the wrong kind of value

错误信息 redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value分析 当前程序中key的操作类型,并不与redis库中存在的key的类型相匹配。 举例: 第一次保存key,将其设…

epoll_wait会被系统中断唤醒

今天,当一个程序在epoll_wait阻塞时,用strace跟踪了一下,结果epoll_wait就被EINTR唤醒了,并且返回-1; 所以,当epoll_wait返回-1时,需要判断errno是不是EINTR,如果是,继续…

iOS开发常用代码块

遍历可变数组的同时删除数组元素 NSMutableArray *copyArray [NSMutableArray arrayWithArray:array]; NSString *str1 “zhangsan”; for (AddressPerson *perName in copyArray) { if ([[perName name] isEqualToString:str1]) { [array removeObject:perName]; } …

Redis 启动警告解决

警告 Increased maximum number of open files to 10032 (it was originally set to 1024).问题分析 这条警告是说:最大文件打开数不够。 解决方法一 如果是root用户,那么修改下 ulimit 就可以。 #查看系统限制 ulimit -a#设置“open files”数量 u…

JS事件类型有哪些?分别是什么?

JavaScript可以处理的事件类型为:鼠标类型、键盘类型和HTML类型! 注意:所有的事件处理函数都由两个部分组成, on事件名称。 例如:click事件,处理函数就是onclick 现在我们来看第一种 鼠标事件 click:单击鼠标按钮时触发 dblclick:当用户双击鼠标按钮时触发 mousedown :当…

php实现 字符个数统计

php实现 字符个数统计 一、总结 一句话总结&#xff1a; 1、php字符转ascii码函数&#xff1f; ord() 6 if(ord($input[$i]) < 128 and 0 < ord($input[$i]) and !in_array(ord($input[$i]),$AsciiSet)){ 2、判断数组中数值存在&#xff1f; in_array&#xff08;…

Linux Screen记录屏幕日志

screen是Linux窗口管理器&#xff0c;用户可以建立多个screen会话&#xff0c;每个screen会话又可以建立多个window窗口&#xff0c;每一个窗口就像一个可操作的真实的ssh终端一样。 下面介绍如何记录screen屏幕日志。 第一种方法 启动时添加选项-L&#xff08;Turn on outp…

系统不识别某些Android设备:adb devices不显示问题解决

1、获取厂商android设备ID 电脑连接android设备&#xff0c;然后执行命令&#xff1a; system_profiler SPUSBDataType 2、将厂商ID添加到 adb_usb.ini 文件中 Mac下文件位置&#xff1a;/Users/walker/.android/adb_usb.ini0x05ac 注&#xff1a;(英文字母大写&#xff0c;小写…