走进HTTP 协议发展史

Posted 邋遢之道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了走进HTTP 协议发展史相关的知识,希望对你有一定的参考价值。

     

     不论是七层的OSI模型还是四层的TCP/IP模型,都是为网络数据传输服务的。在互联网蓬勃发展的今天,HTTP 应用已占据了互联网的半壁江山,如果不了解HTTP协议,都不要意思说自己是搞应用服务的。

      HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。HTTP是基于TCP/IP通信协议来传递数据的。它是属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。HTTP协议于1990年提出,经过多年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的最广泛的是HTTP/1.0的第六版,及HTTP/1.1。而最新版本 HTTP/2 更是让其成为新的技术热点。

       

       我们可能会注意到一个人的思维,都是在螺旋中不断上升,那么对于HTTP协议的发展也同样如此。接下来我们简单介绍 HTTP 协议的历史演变和设计思路。

       


一、HTTP/0.9


         

HTTP 协议最早版本是1991年发布的0.9版。该版本极其简单,只有一个命令 GET 。     
如:GET  HTTP://127.0.0.1:8080/index.html

    上面页面请求命令表示,通过建立TCP 连接,从客户端向服务器发送网页(index.html)请求,并在服务器发送完毕后,就关闭TCP连接。当时的协议还规定,服务器只能回应HTML格式的字符串,不能回应别的格式。这些规定在现在看来是多么的低效和不可思议呀!



二、HTTP/1.0


  1996年5月,HTTP/1.0 版本发布,内容大大增加,为互联网的大爆炸奠定了坚实的技术基础。
 首先,扩充了可以发送的内容格式。这使得互联网不仅可以传输文字,还能传输图像、视频、二进制文件等。
其次,除了GET命令,还引入了POST命令和HEAD命令,丰富了浏览器与服务器的互动手段。
再次,HTTP请求和响应的格式也发生了变化。除了数据部分,还引入了头信息(HTTP header),用来描述一些元数据。
最后 还新增了一些功能。包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。

2.1 请求格式 

我们可以看出数据请求部分已经与0.9版本项目,有了很大的变化,传送的数据内容也丰富了很多。
2.2 响应格式

响应部分也增加了很多字段,如协议版本,状态码,状态描述,响应长度,失效时间,服务器类型等。接下来简单介绍几个我们平时需要注意的数据字段。

2.3 状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK      //客户端请求成功
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权 
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
2.4 Content-Type字段
       我们知道1.0版本中丰富了内容的传送格式,那个需要一个特定的字段去指明当前服务器的响应内容是什么格式的。这就是Content-Type字段的作用。
下面是一些常用的Content-Type字段的值  
  • text/plain

  • text/html

  • text/css

  • image/jpeg

  • image/png

  • audio/mp4

  • video/mp4

  • application/javascript

  • application/pdf

  • application/zip

服务器端在进行数据响应的时候,说明了自身响应的数据格式,如果客户端的浏览器解决不了,那应该怎么办。于是在客户端发送请求的时候,就需要使用Accept字段声明自己可以接受哪些数据格式。

2.5 Accept字段

Accept请求报头 :用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图像格式的资源;Accept:text/html,表明客户端希望接受html文本。
Accept-Charset请求报头 :用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

Accept-Encoding请求报头:用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域,缺省是各种内容编码都可以接受。

Accept-Language请求报头:用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个域,缺省是各种语言都可以接受。

2.6 缺点

我们知道HTTP请求是建立在TCP连接的基础之上的。在HTTP1.0中每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。TCP连接的新建成本很高,因为需要客户端和服务器 。所以,HTTP 1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。发现缺点和问题,是技术进步的助推器。于是在半年后便发布了HTTP1.1。


三、HTTP/1.1


1997年1月,HTTP/1.1 版本发布,只比 1.0 版本晚了半年。它进一步完善了 HTTP 协议,一直用到了20年后的今天,直到现在还是最流行的版本。

 首先,1.1 版的最大变化,就是引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用,不用再显示的声明Connection: keep-alive。客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过规范的做法是,客户端在最后一个请求时,发送Connection: close,明确要求服务器关闭TCP连接。目前,对于同一个域名,大多数浏览器允许同时建立6个持久连接。

其次,除了1.0引入了POST和HEAD命令,在1.1中更加丰富了浏览器与服务器的互动手段,如:PUT、PATCH、HEAD、 OPTIONS、DELETE

再次,客户端请求的头信息新增了Host字段,用来指定服务器的域名。有了Host字段,就可以将请求发往同一台服务器上的不同网站,为后续虚拟主机的兴起打下了基础。

3.1 管道机制      

1.1 版还引入了管道机制,即在同一个TCP连接里面,客户端可以同时发送多个请求。这样就进一步改进了HTTP协议的效率。

客户端需要请求两个资源。以前的做法是,在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求。管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。

3.2 Content-Length 字段

在1.0版中,Content-Length字段不是必需的,因为浏览器发现服务器关闭了TCP连接,就表明收到的数据包已经全了。在1.1版本中由于出现了连接复用,一个TCP连接现在可以传送多个回应,势必就要区分数据包是属于哪一个回应的。其中Content-length字段的作用,声明本次回应的数据长度。

3.3 Transfer-Encoding 字段

书接上文,我们能使用Content-Length字段的前提条件是,服务器发送回应之前,必须知道回应的数据长度。但对于一些很耗时的操作来说,这就意味着,服务器需要等到所有操作完成,才能发送响应数据,有时可能黄花菜都凉了。那我们能怎么办,只能生产一块数据就发送一块,采用"流模式"(stream)取代"缓存模式"。因此,1.1版规定可以不使用Content-Length字段,而使用"分块传输编码"。只要请求或响应的头信息有Transfer-Encoding字段,就表明响应数据将由数量未定的数据块组成。

3.4 缺点
虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完上一个请求,才会进行下一个请求的处理。要是前面的请求处理的特别慢,后面就会有许多请求在排队。
为了避免这个问题,只有两种方法:一是减少请求数,二是同时启用更多的TCP连接。于是便出现比如图片合并、域名分片等网页优化手段。如果HTTP协议设计得更好一些,这些额外的工作是可以避免的。


四、HTTP/2


   2015年,HTTP/2 发布。它不叫 HTTP/2.0,是因为标准委员会不打算再发布子版本了。我们接下来看下HTTP/2又给我们提供了什么新功能。

4.1 二进制协议

我们知道HTTP/1.1 版的头信息肯定是文本,数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。二进制协议的一个好处是,可以定义额外的帧,为将来的高级应用打好了基础。如果使用文本实现这种功能,解析数据将会变得非常麻烦。

4.2 多工

HTTP/2 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求,而且不用按照次序进行的排队,这样就避免了请求堵塞。
举例说明下,在一个TCP连接里面,服务器同时收到了A请求和B请求,于是先回应A请求,结果发现处理过程非常耗时,于是就发送A请求已经处理好的部分, 发现B已处理完接着回应B请求,完成后,再发送A请求剩下的部分。

4.3 数据流

因为HTTP/2 的数据包是按顺序发送的,同一个连接里连续的数据包,可能属于不同的响应。因此必须对数据包做标记,以便指出它属于哪个响应。我们将 将每个请求或响应的所有数据包,称为一个数据流。且定义每个数据流都有一个独一无二的编号,客户端发出的数据流编号一律为奇数,服务器发出数据流编号为偶数。另外还规定,数据流发送到一半的时候,客户端和服务器都可以发送信号,取消这个数据流。1.1版取消数据流的唯一方法,就是关闭TCP连接。HTTP/2 可以发送信号取消某一次请求,同时保证TCP连接保持着,被其他请求复用。

4.4 头信息压缩

我们知道HTTP 协议是不带有状态,每次请求都必须附上所有信息,这样请求的很多字段都是重复的,比如Cookie和User Agent,每次请求都必须附带,这样会浪费很多带宽。HTTP/2 对这一点也做了优化,引入了头信息压缩机制。一方面,头信息使用gzip或compress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号就行。

4.5 服务器推送

HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送,以便减少服务请求发送次数。 常见场景是客户端请求一个网页,里面包含很多静态资源。在HTTP/2协议出现前, 客户端必须收到网页,解析出静态资源连接,然后再发出静态资源请求。 其实客户端请求网页后服务器是可以预期到客户端再次请求静态资源,HTTP/2协议就主动把这些静态资源随着网页一起发给客户端,减少连接次数,提高网络利用率。


总结

协议在改进,技术在进步,我们所面对的世界唯一不变的就是变化。但万变不离其宗,HTTP的基础是建立在TCP协议上的,只是在端到端发送数据的时候,加了很多标识字段,做了相应的数据优化等。

以上是关于走进HTTP 协议发展史的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 协议详解和版本介绍(HTTP发展历史)

HTTP协议发展历程

从网络虚拟化,看智能网卡发展史

HTTP协议发展历史

第66天:HTTP协议发展历程

深入理解HTTP协议破冰篇