HTTP 1.0 1.1 2.0 区别

HTTP1.1

  • 缓存处理

    Etag,If-Unmodified-Since, If-Match, If-None-Match

  • 带宽优化及网络连接的使用

    range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content)

  • 错误通知的管理

    新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

  • Host头处理,

    请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。

  • 长连接

    支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应
    默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点

HTTP2.0

  • 新的二进制格式(Binary Format)
  • 多路复用(MultiPlexing)

一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面

  • header压缩

使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小

  • 服务端推送(server push)

同SPDY一样,HTTP2.0也具有server push功能

header

List of HTTP header fields @wiki

状态码

HTTP状态码@wiki

301 vs 302

301 Moved Permanently
被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。
如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。

302 Found (原始描述短语为“Moved Temporarily)
请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,并且使用GET方式访问在Location中规定的URI,而无视原先请求的方法。[21]因此状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。

303 See Other
  该状态码表示由于请求对应的资源存在另一个URI,应该使用GET方法定向获取请求的资源。
  303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明确表示客户端应当采用 GET 方法获取资源,这点与 302 状态码有区别。
大多数的浏览器处理302响应时的方式恰恰就是上述规范要求客户端处理303响应时应当做的

307 Temporary Redirect
与302相反,当重新发出原始请求时,不允许更改请求方法

URL 劫持即利用 302 重定向

401 vs 403

**401 Unauthorized**
没有携带有效的身份验证信息, 比如未登录

**403 Forbidden**
携带的身份验证信息不通过, 比如密码错误