浏览器端发起HTTP请求流程

  1. 构建请求,不构建怎么知道要请求了
  2. 查找缓存,比如说是cookie或者是本地的LocalStorage。一般存的是登录过账号之后生成的token。如果缓存查找失败或者是缓存已经过期,那就需要进入网络请求过程。
  3. 准备IP和端口。浏览器会先请求DNS域名系统返回域名对应的IP,如果这个域名已经解析过了,那么浏览器会缓存解析的结果,下一次请求的时候就不需要请求了。
  4. 等待TCP队列,Chrome中规定,同一个域名同时最多只能建立6个TCP连接,超过6个连接那么剩下的请求会进入排队等待状态,直至请求完成。
  5. 建立TCP队列,因为TCP是作用于传输层的,浏览器使用HTTP协议作为应用层协议,用来封装请求的文本信息,并使用TCP/IP协议将它发到网络上,所以再HTTP工作开始之前,浏览器需要通过TCP与服务器建立连接。“三次挥手”建立TCP连接
  6. 发送HTTP请求,建立了TCP连接,浏览器就可以和服务器进行通信了,HTTP中的数据正是在这个通信过程中传输的。浏览器会向浏览器发送请求行,包括了请求方法,请求URI和HTTP版本协议。
  • HTTP请求数据格式由请求行、请求头以及请求体组成。
  • 发送请求行,就是告诉服务器浏览器需要什么资源,最常用的请求方法是Get,另一个常用的请求方法是POST,用于发一些数据给服务器。
  • 如果使用POST方法,浏览器准备的数据是通过请求体来发送。
  • 在浏览器发送请求行命令行之后,还要以请求头形式发送其他一些信息,把浏览器的一些基础信息告诉服务器

服务器端处理HTTP请求流程

  1. 返回请求。服务器响应的数据格式包含了响应行、响应头以及响应体。
  • 响应行包括协议版本和状态吗,最常用的状态码是200,表示处理成功,如果没有找到页面,则会返回404。
  • 发送完响应头后,服务器就可以继续发送响应体的数据,包括HTML的实际内容
  1. 断开连接。如果浏览器或者服务器在其头信息中加入了Connection:Keep-Alive,那么TCP连接在发送后将仍然保持打开状态,这样浏览器就可以继续通过同一个TCP连接发送请求。保持TCP连接可以省去下次请求时需要建立连接的时间,提升资源加载速度。
  2. 重定向。当重定向时,响应行返回的状态是301,状态301就是告诉浏览器我需要重定向到另外一个网址Location字段中。

为什么很多站点第二次打开速度会很快

  1. DNS缓存和页面资源缓存。

当服务器返回HTTP响应头给浏览器时,浏览器是通过响应头中的Cache-Control字段来设置是否缓存该资源。但是缓存有过期时长,是Max-age参数设置的。在缓存资源还未过期时,再次请求该资源,会返回缓存中的资源给浏览器。缓存过期了,浏览器会在HTTP请求头中带上If-None-Match:”4f80f-13c-3a1xb12a”,服务器收到请求头会根据这个的值判断请求的资源是否更新了。如果有更新,就返回最新资源,如果没有更新,返回304状态码,告诉浏览器,这个缓存可以继续使用,浏览器就刷新缓存新鲜度

  1. 登录状态保持。
  • 登陆用的POST请求,服务器接收到浏览器提交的信息之后,正确的话,生成一段表示用户身份的字符串,并把该字符串写到响应头的Set-Cookie字段里
  • 浏览器在接收到服务器的响应头后,如果响应头含有Set-Cookie字段,浏览器就会把这个字段信息保存到本地
  • 当用户再次访问时,浏览器发起HTTP请求,将已经保存的Cookie数据写进请求头里面
  • 服务器在收到HTTP请求头数据之后,查找头里面的“Cookie”字段信息,查询到该用户是已登录状态,然后生成含有该用户信息的数据,发送给浏览器

如果一个页面的网络加载时间过久,是如何分析卡在哪个阶段的?

  1. 首先要判断是不是网络原因导致访问资源过慢
  2. 然后判断服务器上面有没有相应的资源,返回的状态码是不是404
  3. 或者是资源比较大,我做的单页面应用首页加载白屏的问题比较多
  4. 或者是在资源加载之前有很多请求,后台查询速度不够快。或是前端请求没有写成并行。
  5. 再者就是前端代码报错。
  6. 应该还会有很多问题,但是技术小白肯定还有很多原因没想到