一篇文章让你彻底理解 http/https协议、常见状态码、get/post、http缓存机制

一、http/https协议

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

先来观察这两张图,第一张访问域名http://www.12306.cn,谷歌浏览器提示不安全链接,第二张是https://kyfw.12306.cn/otn/regist/init,浏览器显示安全,为什么会这样子呢?2017年1月发布的Chrome 56浏览器开始把收集密码或信用卡数据的HTTP页面标记为“不安全”,若用户使用2017年10月推出的Chrome 62,带有输入数据的HTTP页面和所有以无痕模式浏览的HTTP页面都会被标记为“不安全”,此外,苹果公司强制所有iOS App在2017年1月1日前使用HTTPS加密。

HTTP特点:

  • 无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
  • 无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
  • 基于请求和响应:基本的特性,由客户端发起请求,服务端响应
  • 简单快速、灵活
  • 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性

HTTPS特点:

  • 基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护
  • 内容加密:采用混合加密技术,中间者无法直接查看明文内容
  • 验证身份:通过证书认证客户端访问的是自己的服务器
  • 保护数据完整性:防止传输的内容被中间人冒充或者篡改

二、常见状态码

  1. 分类 描述
  • 信息。服务器收到请求,请继续执行请求
  • 成功。请求被成功接收并处理
  • 重定向。需要进一步操作来完成请求
  • 客户端错误。无法完成请求,或请求包含语法错误
  • 服务器错误。服务器在处理请求的过程中发成错误
  1. 各个状态说明
  • 100继续请求者应当继续提出请求。服务器已收到请求的一部分,正在等待其余部分。
  • 101切换协议请求者已要求服务器切换协议,服务器已确认并准备切换。
  • 200成功服务器已成功处理了请求。
  • 201已创建请求成功并且服务器创建了新的资源。
  • 202已接受服务器已接受请求,但尚未处理。
  • 203非授权信息服务器已成功处理了请求,但返回的信息可能来自另一来源。
  • 204无内容服务器成功处理了请求,但没有返回任何内容。
  • 205重置内容服务器成功处理了请求,内容被重置。
  • 206部分内容服务器成功处理了部分请求。
  • 300多种选择针对请求,服务器可执行多种操作。
  • 301永久移动请求的网页已永久移动到新位置,即永久重定向。
  • 302临时移动请求的网页暂时跳转到其他页面,即暂时重定向。
  • 303查看其他位置如果原来的请求是 POST,重定向目标文档应该通过 GET 提取。
  • 304未修改此次请求返回的网页未修改,继续使用上次的资源。
  • 305使用代理请求者应该使用代理访问该网页。
  • 307临时重定向请求的资源临时从其他位置响应。
  • 400错误请求服务器无法解析该请求。
  • 401未授权请求没有进行身份验证或验证未通过。
  • 403禁止访问服务器拒绝此请求。
  • 404未找到服务器找不到请求的网页。
  • 405方法禁用服务器禁用了请求中指定的方法。
  • 406不接受无法使用请求的内容响应请求的网页。
  • 407需要代理授权请求者需要使用代理授权。
  • 408请求超时服务器请求超时。
  • 409冲突服务器在完成请求时发生冲突。
  • 410已删除请求的资源已永久删除。
  • 411需要有效长度服务器不接受不含有效内容长度标头字段的请求。
  • 412未满足前提条件服务器未满足请求者在请求中设置的其中一个前提条件。
  • 413请求实体过大请求实体过大,超出服务器的处理能力。
  • 414请求 URI 过长请求网址过长,服务器无法处理。
  • 415不支持类型请求的格式不受请求页面的支持。
  • 416请求范围不符页面无法提供请求的范围。
  • 417未满足期望值服务器未满足期望请求标头字段的要求。
  • 500服务器内部错误服务器遇到错误,无法完成请求。
  • 501未实现服务器不具备完成请求的功能。
  • 502错误网关服务器作为网关或代理,从上游服务器收到无效响应。
  • 503服务不可用服务器目前无法使用。
  • 504网关超时服务器作为网关或代理,但是没有及时从上游服务器收到请求。
  • 505HTTP 版本不支持服务器不支持请求中所用的 HTTP 协议版本。

三、POST和GET都是向服务器提交数据,并且都会从服务器获取数据。

  • 区别:

1、GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输。
POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的id=1213&name=suguniang就是两个实际的传输数据键值对。因此,GET请求的数据会暴露在地址栏中,而POST请求则不会。

2、传输数据的大小
在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制。
对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。
3、安全性
POST的安全性比GET的高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都会暴露再URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET请求提交的数据还可能会造成Cross-site request frogery攻击,但是真正重要的数据在传的过程中还会更换协议http–>https,比如在网上支付的过程中
4、HTTP中的GET,POST,SOAP协议都是在HTTP上运行的

四、http缓存机制

1、缓存的作用

  • 提高资源加载速度
  • 减少网络请求,提高页面渲染速度

2、缓存的分类

  • http缓存
  • 数据缓存

3、HTTP缓存
常见的 HTTP 缓存只能存储 GET 响应,对于其他类型的响应则无能为力。 浏览器在每次GET URL时都会先检查URL对应的缓存,除非你指定不使用缓存(强制刷新或者在控制台勾选Disable Cache等)

在这里插入图片描述
4、强缓存
不请求服务器,直接用,返回状态码200

  • Pragma
    包括实现特定的指令,它可应用到响应链上的的任何接收方
    no-cache
    指定不缓存响应,即资源不缓存;
    不直接询问浏览器缓存情况,向服务器验证当前资源是否更新,因此有的时候只设置no-cache防止缓存还是不够保险,还可以加上private指令,将过期时间设为过去的时间。
    no-store
    绝对缓存,每次请求都会请求服务端
  • Cache-Control
    显示是否可以缓存及其缓存类型
    max-age&s-maxage
    max-age(单位为s)指定设置缓存最大的有效时间,定义的是时间长短。当第一次访问服务器的时候,返回一个max-age,在max-age这段时间内,客户端不会在访问服务器获取该资源。
    s-maxage用于共享缓存(比如CDN),s-maxage也叫代理缓存,优先级高于max-age
    public&private
    public表示该资源可以被多个用户共享,当没有指定public还是private的时候,默认是public
    private响应只作为私有的缓存,不能在用户间共享,如果要求认证,响应会自动设置为private
    no-cache&no-store
    no-cache
    指定不缓存响应,即资源不缓存;
    不直接询问浏览器缓存情况,向服务器验证当前资源是否更新,因此有的时候只设置no-cache防止缓存还是不够保险,还可以加上private指令,将过期时间设为过去的时间。
    no-store
    绝对缓存,每次请求都会请求服务端
  • Expires
    响应过期的日期和时间(服务器的绝对时间)
    Expires是一个时间戳,当客户端再次请求资源的时候,会吧客户端的时间与时间戳相比,如果过期了,则会访问服务端的资源,不会访问缓存资源

5、协商缓存

  • 请求服务器,服务器同意了才用,返回状态码304
    当浏览器检测某个资源请求没有强缓存,就会发起一个请求到服务器,验证是否存在协商缓存,如果存在协商缓存就回家返回http状态为304,并且会显示一个not modified的字符串
    协商缓存是利用的是【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】这两对Header来管理的

  • last-Modified
    服务器端文件的最后修改时间,需要和cache-control共同使用,是检查服务器端资源是否更新的一种方式。当浏览器再次进行请求时,会向服务器传送If-Modified-Since报头,询问Last-Modified时间点之后资源是否被修改过。如果没有修改,则返回码为304,使用缓存;如果修改过,则再次去服务器请求资源,返回码和首次请求相同为200,资源为服务器最新资源。

  • ETag ETag就像一个指纹,资源变化都会导致ETag变化,跟最后修改时间没有关系,ETag可以保证每一个资源是唯一的;可以理解为ETag是一个可以与Web资源关联的记号(token) If-None-Match的header会将上次返回的ETag发送给服务器,询问该资源的ETag是否有更新,有变动就会发送新的资源回来;如果ETag没有变动,则返回状态码304