HTTP协议详解(一)

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

完整的Url:模式(或称协du议)、域名(或IP,ip用来标识机器/主机/服务器)、端口、路径

https://blog.csdn.net/qq_35313994

https://blog.csdn.net:443/qq_35313994 https默认端口443

客户端请求消息

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成

HTTP协议详解(一)_第1张图片

​​​

服务器响应消息

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

浏览器中的network中的Resopnse看到的是响应正文

请求头中常见报文属性 

  • Accept :浏览器客户端用来告诉服务端其能接受什么类型的响应。
  • Accept-Charset: 支持使用的字符集
  • Accept-Encoding: 支持使用的编码方式
  • Accept-Language: 支持使用语言
  • Cookie:客户端浏览器用来存储一些用户信息以便让服务器辨别用户身份的(大多数需要登录的网站上面会比较常见),比如用户名和密码,sessionId等。
  • Host: 服务器地址。指定要请求的资源所在的主机和端口,通常从url里获取。这个字段是必需的
  • Referer:浏览器客户端用来告诉服务器这个请求是从哪个页面链接过来的,即请求来源。
  • User-Agent :告诉服务器,客户端使用的操作系统、浏览器版本和名称
  • Connection: Keep-Alive :(当前tcp连接的状态)客户端和服务器保持长时间链接,Connection:close 在响应结束后关闭连接
  • Content-Encoding:支持的编码
  • Content-Language:支持的自然语言
  • Content-Length:文本长度
  • Content-Location:资源所在位置
  • Content-Range:在整个资源中此实体表示的字节范围
  • Content-Type:主体的对象类型 点击查看 HTTP content-type

常见的状态码

常见的HTTP状态码:

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

点击查看 HTTP状态码汇总

缓存机制

Web 应用还可以利用客户端缓存去节省相同页面内容的生成和传输时间。分为强缓存和协商缓存

强缓存:浏览器直接从本地缓存中获取数据,不与服务器进行交互。强缓存在客户端和服务器端都会存在。​​​​​​​
协商缓存:浏览器发送请求到服务器,服务器判定是否可使用本地缓存。

浏览器缓存主要是 HTTP 协议定义的缓存机制。HTML meta 标签,例如



//使用带有 http-equiv 属性的  标签时,服务器将把名称/值对添加到发送给浏览器的内容头部

http-equiv类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显示网页内容。与之对应的属性值为content,content中的内容其实就是各个参数的变量值 

1.Expires(期限)

说明:指定网页在缓存中的过期时间,一旦网页过期,必须到服务器上重新传输。

语法:

注意:必须使用GMT的时间格式,或者直接设为0(数字表示多久后过期)

2.Pragma(cache模式)

说明:禁止浏览器从本地计算机的缓存中访问页面内容。

语法:

注意:网页不保存在缓存中,每次访问都刷新页面。这样设定,访问者将无法脱机浏览。

3.Refresh(刷新)

说明:自动刷新并指向新页面。

语法:


// 其中的5表示5秒后自动刷新并调整到URL新页面。

http缓存流程图 :

HTTP协议详解(一)_第2张图片 http缓存流程图 by nana

 

协商缓存流程分析: 

ETagIf-None-Match服务器为每份资源分配的唯一标识字符串。

浏览器发现缓存过期(缓存可能还能使用,服务器资源可能仍然没有改变,所以需要与服务器协商,让服务器判断本地缓存是否还能使用)

  1. 浏览器请求资源,服务器会在响应报文头中加入ETag字段。资源更新时,服务器端的ETag值也随之更新,生成 ETag 值时,并没有 统一的算法规则,而仅仅是由服务器来分配。
  2. 浏览器再次请求资源时,会在请求报文头中添加If-None-Match字段,它的值就是上次响应报文中的ETag的值;
  3. 服务器会比对ETagIf-None-Match的值是否一致,如果不一致,服务器则接受请求,返回更新后的资源;如果一致,表明资源未更新,则返回状态码为304的响应,可继续使用本地缓存,要注意的是,此时响应头会加上ETag字段,即使它没有变化。

Last-ModifiedIf-Modified-Since:是GMT格式的时间字符串。

  1. 浏览器第一次向服务器请求资源后,服务器会在响应头中加上Last-Modified字段,表明该资源最后一次的修改时间;
  2. 浏览器再次请求该资源时,会在请求报文头中添加If-Modified-Since字段,它的值就是上次服务器响应报文中的Last-Modified的值;
  3. 服务器会比对Last-ModifiedIf-Modified-Since的值是否一致,如果不一致,服务器则接受请求,返回更新后的资源;如果一致,表明资源未更新,则返回状态码为304的响应,可继续使用本地缓存,与ETag不同的是:此时响应头中不会再添加Last-Modified字段。

强缓存流程分析:

用户发起了一个http请求后,浏览器发现先本地已有所请求资源的缓存,便开始检查缓存是否过期。有两个http头部字段控制缓存的有效期:ExpiresCache-Control,浏览器是根据以下两步来判定缓存是否过期的:

  1. 查看缓存是否有Cache-Controls-maxagemax-age指令,若有,则使用响应报文生成时间Date + s-maxage/max-age获得过期时间,再与当前时间进行对比(s-maxage适用于多用户使用的公共缓存服务器);
  2. 如果没有Cache-Controls-maxagemax-age指令,则比较Expires中的过期时间与当前时间。Expires是一个绝对时间。
  3. 若缓存未过期,返回状态码为200,则直接从本地读取缓存,这就完成了整个强缓存过程;如果缓存过期,则进入协商缓存或服务器返回新资源过程。

 

你可能感兴趣的:(前端综合)