HTTP 的前世今生

前言

不要被标题吓到,本文只是想记录下 HTTP 的进化史。

HTTP 是什么

HTTP,HyperText Transfer Protocol(超文本传输协议)是互联网上应用最为广泛的一种网络协议,所有的 WWW 文件都必须遵守这个标准。HTTP 是一个客户端(终端用户浏览器)和服务器端(网站)请求和响应的标准(TCP)。从 HTTP 1.0 (1996年) 到 1.1 (1999年)再到 2.0 (2013年8月),十几年,说长不长说短不短。下面就对这三个版本进行详细的记录。

HTTP 1.0

HTTP 1.0 是无状态,基于短连接。

无状态:对所有的请求都没有识别能力,即每次请求都是相互独立,不关联的,这就导致了服务器没办法知道任意两个请求的一些基本信息,比如:是谁发起的?两个请求是不是同一个用户发起?正因为 HTTP 1.0 无状态,所以才出现了两种用于保持 HTTP 连接状态的技术,一个是 Cookie,而另一个是Session。通过 Cookie 和 Session 来记录分别在客户端和服务端记录下请求中的一些基本信息,比如:这个请求来自谁,通过一个缓存数据,就可以解决状态的问题。

短连接:指的是 TCP 连接,而不是指每次客户端发起的请求,对于请求只要服务端响应了,就说明此次请求完成或者结果了。对于客户端的每次请求服务器都会创建一个新连接(需 TCP 3 次握手),请求完成之后, TCP 连接断开。通常承载于TCP协议之上,或者承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS,HTTP 1.0 默认的端口号为 80。

HTTP 1.1

HTTP 1.1 默认使用长连接(持久连接),长连接就是对 HTTP 1 中的短连接进行改进。让创建的连接可以复用,即一个连接可以处理多个请求和响应,并且是互不干扰的,但它是这么一个过程:客户端不必等待上一次请求的结果返回再发送下一个请求,只不过服务端会按请求顺序逐个有序地处理及返回。我们可以设置连接的存活时间,在指定时间内直接使用现在的连接,不创建新连接,这样就大大减少了创建连接时需要三次握手的资源开销。不过需要注意的是,这里所说的长连接针对的是同一个页面多种资源的请求有效(复用),每个独立的页面都需要一个单独的连接,这也就是为什么很多网站都是在当前页面中打开的原因。

HTTP 1.1 跟 HTTP 1.0 区别

  1. 默认使用长连接(Pipelining)
  2. 带宽优化,并支持断点续传(Chunked transfer-coding)
  3. 新增缓存控制策略,(比如:ETag、If-None-Match)
  4. Host头域(解决同 ip 多站点,即同一台服务器,多个虚拟机的问题)
  5. 新增了24个错误状态响应码(比如:100、405、415)

Chunked transfer-coding

发送门将消息分割成若干个任意大小的块,并且每个数年块都带上块的长度,最后一个块则用零长度的块作为结束的标致。不需要像以前那样把消息整个传输。

Host 头域

这个 Host 头域是用来存放主机名的,这个 host 头域会告诉服务器你访问的是哪一个虚拟机。

HTTP 2.0

HTTP 2.0 最大的改变变是在应用层和传输层之间插入了二进制分帧层。HTTP 2.0 用二进制对消息进行编码并分割成帧,帧是数据传输的最小单位。每个桢包括一个帧头、标志,标志用来区别是属于哪个流。

HTTP 2.0 跟 HTTP 1.1 区别

  1. 对请求划分优先级
  2. header 压缩
  3. 二进制分帧
  4. 多路复用
  5. 服务端推送(Server Push技术)

多路复用

HTTP 2.0 的多路复用比 HTTP 1.1 的更强大,页面不再需要创建多个连接,只需要创建一个,所有的请求都通过这个连接进行传输,并且不会阻塞,正因为请求不再阻塞,针对 HTTP2.0 之前的域分片、雪碧图等请求的优化方案就不再需要了。

服务端推送

分析主请求的依赖资源,在响应主请求的同时,主动并发推送依赖资源至客户端。

状态码分段

  1. 100-199 用于指定客户端相应的某些动作
  2. 200-299 用于表示请求成功
  3. 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息
  4. 400-499 用于指出客户端的错误
  5. 500-599 用于指出服务器错误

如果要记住具体的状态码估计有点难,所以下面就把常见的一些状态列出来。

  • 200:请求成功(OK正常)
  • 204:No Content/无内容
  • 301:重定向(Permanently Moved)
  • 304 (Not Modified/未修改) 
  • 400 (Bad Request/错误请求) 
  • 401 (Unauthorized/未授权) 
  • 403 (Forbidden/禁止) 
  • 404 (Not Found/未找到) 
  • 405 (Method Not Allowed/方法未允许) 【HTTP 1.1 新加入】
  • 415 (Unsupported Media Type/不支持的媒体格式) 【HTTP 1.1 新加入】
  • 500 (Internal Server Error/内部服务器错误) 
  • 502 (Bad Gateway/错误的网关) 

完整的状态文档可以参考百度百科:

参考链接

http://www.ruanyifeng.com/blog/2016/08/http.html

https://baike.baidu.com/item/HTTP状态码/5053660

https://http2.github.io/http2-spec/

https://www.jianshu.com/p/e57ca4fec26f

https://www.cnblogs.com/qcloud1001/p/9370493.html