浏览器输入URL按下enter发生了什么

版权声明:转载请先告知哦 https://blog.csdn.net/PINK789/article/details/86650014
  1. 输入URL并按下enter;
  2. 浏览器查找当前URL是否存在缓存,并比较缓存是否过期;
  3. DNS解析URL对应的IP;
  4. 根据IP建立TCP连接(三次握手);
  5. HTTP发起请求;
  6. 服务器处理请求,浏览器接收HTTP响应;
  7. 渲染页面,构建DOM树;
  8. 关闭TCP连接(四次挥手);

一、ULR

url由三部分组成:协议//域名:端口号(默认80端口省略)除此之外URL还包含一些路径、查询和其他片段;
如http://www.tuicool.com/search?kw=%E4%;HTTP默认端口80,HTTPS默认端口443(扩展:同源策略,跨域问题);

二、缓存

HTTP缓存有多种规则,根据是否向服务器发起请求,分为强制缓存和对比缓存(暂定);
强制缓存:判断HTTP首部字段:cache-control , Expires

  1. Expires : 是一个绝对时间,即服务器时间,浏览器检查当前时间,若还未到失效时间就直接使用缓存文件。该方法存在一个问题:服务器时间可能与客户端时间不一致。因此该字段已经很少使用;
  2. cache-control : cache-control常用取值:private/no-cache/max-age/must-revalidate,默认为private。max-age中保存着一个相对时间。表示浏览器收到的文件缓存在该时间范围内不会去访问服务器,若浏览器同时存在这两个字段,浏览器总是优先使用cache-control;
    (百度百科cache-contro)https://baike.baidu.com/item/Cache-control/1885913?fr=aladdin
    对比缓存:通过HTTP的last-modified,Etag字段进行判断
  3. last-modified : 是第一次请求资源时,服务器返回的字段,表示最后一次更新的时间,下一次浏览器请求资源时就发送if-modified-since字段。服务器用本地的Last-modified时间与if-modified-since时间比较,若不一致则认为缓存已过期并返回新资源给浏览器;若一致则发送304状态码,让浏览器继续使用缓存;
  4. Etag : 资源的实体标识(哈希字符串),当资源内容更新时,Etag会改变。服务器会判断Etag是否是否变化,若变化则返回新资源,否则返回304;
    在这里插入图片描述

三、DNS域名解析(Domain Name System)

(DNS的百度百科 https://baike.baidu.com/item/dns/427444?fr=aladdin)
域名只是与IP地址的一个映射。域名解析的过程就是将域名还原为IP地址的过程。

  1. 首先浏览器检查本地host文件是否有这个网址映射关系,若有就调用这个IP的地址映射,完成域名解析
  2. 若没找到则会查找本地DNS解析,若查找到则返回;
  3. 若还是没找到就会查找本地DNS服务器,若查找到则返回;
  4. 最后迭代查询,按照根域服务器 -> 顶级域.cn -> 第二层域,hb.cn -> 子域,www.hb.cn的顺序找到IP地址

四、TCP连接

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

三次握手

  • 第一次握手:客户端向服务器发送SYN(syn=j)包,进入SYN_SENT状态,等待服务器确认;(SYN:同步序列编号synchronize Secquence number)
  • 第二次握手:服务器收到syn,必须确认客户端的SYN包,同时自己也发送一个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、Data、Pragma等组成;
响应体是服务器返回给浏览器的信息,主要由HTML,JS,CSS,图片文件组成;

七、页面渲染

(1) 浏览器将响应的内容进行解析渲染呈现给用户。整个过程设计两个方面:解析和渲染。在渲染页面之前,需要构建DOM树和CSSOM树;
(2)在浏览器还未接收到完整的HTML文件时,他就开始渲染页面了,在遇到外部链入的脚本标签或样式标签或图片,浏览器会再次发送HTTP请求重复上述的步骤,在收到CSS文件后会对已经渲染的页面重新渲染,加入应有的样式,图片文件加载完会立即显示在相应的位置。在这一过程中可能会触发页面的重绘(Repaint)或重排(Reflow);

  • Repaint:影响发生的变化只是影响元素的外观(例如背景颜色,边框颜色),此时只需重新应用新样式绘制该元素即可;
  • Reflow:也称为Layout,中文叫回流,一般意味着,一般意味着元素的内容,结构,位置或者尺寸发生了变化,需要重新计算样式和渲染树,该过程称为Reflow;

(3) 所以说重排的成本比重绘的成本高得多,DOM树的每个节点都会有Reflow方法,一个节点的Reflow很可能会导致子节点,甚至是父节点,同胞节点的Reflow;
(4)下面这些动作很大可能会是成本比较高的

  • 增加、删除、修改DOM节点,会导致Reflow或Repaint;
  • 移动DOM的位置,或是做个动画的时候;
  • 内容发生变化;
  • 修改CSS样式;
  • Resize窗口的时候(移动端无该问题),或是滚动的时候;
  • 修改页面的默认字体时;
    (5)基本来说,reflow有如下原因
  • Initinal:网页初始化时;
  • Incremental:一些JS在操作DOM树时;
  • Resize:某些元件的尺寸变了;
  • StyleChange:某些CSS的属性变了;
  • Dirty:几个Incremental的reflow发生在同一个frame的子树上;

断开TCP连接或继续保持连接

四次挥手断开TCP连接

由于TCP连接是全双工的,因此每个方向都需要单独进行关闭,原则是当一方完成数据发送任务后,就能够发送一个FIN来终止这个方向的连接,收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN时仍能够发送数据,首先执行关闭的一方将执行主动关闭,而另一方将执行被动关闭;

  • 第一次挥手:TCP客户端将首先发送一个FIN,用来关闭客户到服务器的数据传输;
  • 第二次挥手:服务器收到这个FIN,他发回一个ACK,确认序号为收的序号+1,和SYN一样,一个FIN将占用一个序号;
  • 第三次挥手:服务器关闭客户端的连接,并发送一个FIN给客户端;
  • 第四次挥手:客户端发回ACK报文确认,并将确认序号设置为受到序号+1;

猜你喜欢

转载自blog.csdn.net/PINK789/article/details/86650014