浏览器从输入URL地址到最终显示内容的过程

1. 输入URL首先浏览器要根据URL查找域名对应的IP:

  • 首先查找浏览器自身的DNS缓存,如果有这个域名映射且没过期(TTL)则直接向该IP发送HTTP请求,否则下一步
  • 查找本地操作系统hosts缓存,如果有且没过期,拿出来使用完成DNS解析,否则下一步
  • 查找本地DNS域名服务器,如果不可以由该服务器解析,则把请求发至根域名服务器,解析该域名是由谁来授权管理,返回顶级域名服务器的IP地址
  • 本地DNS服务器收到返回的顶级域名服务器地址后,联系顶级域名服务器。
  • 顶级域名服务器如果无法解析,则找下一级DNS服务器,并把IP发给本地DNS服务器。
  • 以此类推,在DNS域名解析的过程中,使用UDP协议进行不可靠传输,不需要三次握手,传输需要的内容较少,使用UDP更快。
  • 在网页开发过程中尽量减少对DNS域名的解析,天猫,淘宝等使用进行dns延迟缓存

2. 如果是第一次访问请求该网址

  • 浏览器发送HTTP请求,请求头包括:请求方法(Request Method)、协议版本、客户端信息(User-Agent)、connect、请求内容等、host。
  • 如果顺利访问:客户端返回200状态码,返回信息包括:返回内容、expires设置缓存过期时间、contentType返回内容类型、contentLength、status、Etage该缓存的版本号、contentEncoding、Date、cache-control、set-cookie设置本域名下浏览器的cookie、lastModified
  • 如果返回404则请求地址错误,请求内容不在服务器里
  • 如果返回30*则重定向

3.如果是第二次

  • 浏览器则发出http请求时带上cookie发送,会带上if-Modified-since(匹配前一次请求时返回的last-modified)/if-None-match(匹配前一次请求时返回的Etage),如果资源没有被修改则返回304状态码。但是如果前一次请求浏览器设置expires,则浏览器首先会检查缓存中的资源,如果在设置的expires时间之内则不会再次发送请求。
  • lastModified代表服务器最后修改时间,精确到秒。expires资源过期时间,精确到秒。Etage则代表资源的版本号,每次修改资源Etage就会变。不同资源的Etage不同。
  • 刷新: enter+url  如果expires没过期则直接使用缓存资源。F5刷新,如果expires没过期,依然发送http请求,可能返回304;而ctrl+F5,则跟第一次访问该URL无异。

4.发送HTTP请求:

  • HTTP是应用层协议,HTTP请求使用TCP可靠性协议进行传输,TCP创建连接时需要三次握手,创建一个socket,发送socket的connect请求,客户端阻塞等待服务器响应,服务器接收后发送accept,服务器等待浏览器的确认,浏览器发送确认后TCP连接创建完成。
  • HTTP在发送请求的过程中先是在传输层包装成TCP报文,在网络层加上ip头,封装成ip包进入链路层,ip报文的TTL时255,每经过一个路由-1,直到为0就抛弃该报文,所以IP协议是不可靠的,使用地址解析协议ARP进行地址解析,如果在同一个网段内,ARP则广播给网段内所有主机,查询MAC地址,如果不在同一个网段,则ARP把ip报文转发到下一站路由的MAC地址。ARP负责IP报文在每一跳的MAC地址查询。

6.如果正确访问,则浏览器根据返回content-type,解析服务器返回的数据,浏览器解析html文件时,没遇到frame、img、link、javascript都会重新发送一个http请求,javascript下载完后就会立即执行阻塞浏览器的渲染以及绘制。所以一般js链接放在最后,但是很多浏览器都会优先下载js文件和css文件,所以如果js没有对dom操作,尽量defer延迟加载js文件。css在文档头,防止因为css样式改变导致浏览器多次重绘或者回流,是页面闪动卡顿。js和css尽量使用外链形式,减少DOM结构的长度和复杂度,减少浏览器解析html文件的时间。dom节点尽量别深度嵌套,css少使用多层选择器。页面减少http请求的个数,多个图片使用图片dataURI编码或则图片精灵进行合并、css文件压缩合并、js文件压缩合并。配置localhost之后就不会走dns了

7. 

你可能感兴趣的:(浏览器从输入URL地址到最终显示内容的过程)