HTTP各版本的演变

 


HTTP/0.9-单行协议

  最初版本的HTTP协议并没有版本号,请求由单行指令构成,以唯一可用的GET方法开头,后面跟着目标资源的路径(一旦连接到服务器,协议、主机名、端口号都不是必须的)。后来,为了区分后来的版本,把单行协议的版本定位在0.9。

GET /mypage.html

特点:

  • 唯一可用的方法是GET;
  • 响应内容不包含HTTP头,只能传输HTML文件;
  • 没有状态码或错误代码;

  

HTTP/1.0

  • 协议版本信息会随着每个请求发送;
  • 状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存);
  • 引入HTTP头的概念,具备了传输除HTML文件以外的其他类型文档(归功于Content-Type头);
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html

 

HTTP/1.1

  • 支持持久连接,节省了多次打开TCP连接加载网页文档资源的时间;
  • 增加管道化连接,允许在第一个请求的响应到达之前,就发送第二个请求;
  • 支持响应分块;
  • 引入额外的缓存控制机制;
  • 引入内容协商机制(也即协商首部),包括语言、编码、类型等,并允许客户端和服务器之间约定以最合适的内容进行交换;
  • 引入Host头,能够使不同域名配置在同一个IP地址的服务器上;
复制代码
GET /en-US/docs/Glossary/Simple_header HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header

200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 20 Jul 2016 10:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
Server: Apache
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
复制代码

 

HTTP/2.0

  • 该版本是二进制协议而不是文本协议,HTTP报文封装在帧中,语义不再可读;
  • 支持多路复用,摆脱了HTTP/1.1中顺序传输的约束,并解决了HTTP/1.1中的队头阻塞问题;
  • 压缩了headers,移除了重复和传输重复数据的成本;

 

HTTP/3.0

  也称为HTTP over QUIC,它的核心是基于UDP的QUIC(Quick UDP Internet Connection)协议。

  • 由于UDP本身是无连接的,QUIC有效减少了传统TCP连接时的握手时延;
  • 无队头阻塞的多路复用;
  • 传统TCP连接中,四元组(源IP,源端口,目的IP,目的端口)有任一发生改变都会导致连接重新建立,而QUIC的连接不受四元组的影响,IP或端口发生改变时,只要Connetion ID不变则连接仍然维持。

 

 

管道化连接与多路复用的区别

 

 

 

 

以单个TCP连接为例: 

 

  •   管道化连接使浏览器不必等待前一个请求的响应数据,立刻发送下一个请求,但资源的传输顺序仍然遵循原来请求发送的顺序,并没有解决HTTP/1.1中的队头阻塞问题。
  •   多路复用使得资源被切分成小的块,将不同资源的小块打乱或交错在网络中传输,使得资源的传输顺序不再遵循原来请求发送的顺序,可以有效解决HTTP/1.1的队头阻塞问题。

 

posted @   ˙鲨鱼辣椒ゝ  阅读(112)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示