HTTP 0.9/1.0/1.1/2 版本变迁

记录一下 稍后总结

HTTP 0.9 - 1.0 - 1.1 - 2 版本变迁

http://www.52im.net/thread-1709-1-1.html

HTTP 1.1 版本协议详解

http://www.52im.net/thread-1677-1-1.html

HTTP协议

http://www.52im.net/thread-2456-1-1.html

移动网络优化手段

http://www.52im.net/thread-1413-1-1.html

-----

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。

我们在浏览器的地址栏里输入的网站地址叫做URL (Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。

HTTP是基于传输层TCP协议的应用层协议,主要规定了客户端和服务器之间的通信格式。

HTTP 0.9/1.0/1.1/2 版本变迁_第1张图片

 

HTTP/0.9版本:

1991年发布,只有一个简单的GET命令,服务器只能回应HTML格式的字符串,回应结束后,TCP链接就关闭。

---

HTTP/1.0版本:

1996年5月发布。

任何格式的内容都可以发送。这使得互联网不仅可以传输文字,还能传输图像、视频、二进制文件。

引入了POST命令和HEAD命令,丰富了浏览器与服务器的互动手段。

HTTP请求和回应的格式也变了。除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据,1.0版规定,头信息必须是 ASCII 码

新增 状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)。

缺点:

每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slow start)。所以,HTTP 1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。

为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection字段:

Connection: keep-alive  

但是,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决办法。

---

HTTP/1.1版本:

1997年1月发布。

1.1版本的最大变化就是引入了持久链接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用。(Connection: keep-alive)

引入管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求。Content-Length 字段用来区分数据包是属于哪一个回应。

持久连接使得多数请求以管线化方式发送成为可能。以前发送请求后需等待并接收到响应,才能发送下一个请求。管线化技术出现后,不用等待亦可发送下一个请求。这样就能做到同时并行发送多个请求,而不需要一个接一个地等待响应了。

HTTP 0.9/1.0/1.1/2 版本变迁_第2张图片

分块传输编码,使用Content-Length字段的前提条件是,服务器发送回应之前,必须知道回应的数据长度。
对于一些很耗时的动态操作来说,这意味着,服务器要等到所有操作完成,才能发送数据,显然这样的效率不高。更好的处理方法是,产生一块数据,就发送一块,采用"流模式"(stream)取代"缓存模式"(buffer)。
因此,1.1版规定可以不使用Content-Length字段,而使用"分块传输编码"(chunked transfer encoding)。

新增了许多动词方法:PUT、PATCH、HEAD、 OPTIONS、DELETE。

缺点:

虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,或者是因为丢失等待重传(TCP的机制),后面就会有许多请求排队等着。这称为"队头堵塞"(Head-of-line blocking)。pipelining在接收response返回时,也必须依顺序接收,如果前一个请求遇到了阻塞,后面的请求即使已经处理完毕了,仍然需要等待阻塞的请求处理完毕。

---

HTTP/2.0版本:

2015年发布。

HTTP/1.1 版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。

HTTP/2 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"。举例来说,在一个TCP连接里面,服务器同时收到了A请求和B请求,于是先回应A请求,结果发现处理过程非常耗时,于是就发送A请求已经处理好的部分, 接着回应B请求,完成后,再发送A请求剩下的部分。这样双向的、实时的通信,就叫做多路复用Multiplexing)。

多路复用(Multiplexing)技术,Multiplexing是通信和计算机网络领域的专业名词。http2中将多个请求复用同一个tcp链接中,将一个TCP连接分为若干个流(Stream),每个流中可以传输若干消息(Message),每个消息由若干最小的二进制帧(Frame)组成。也就是将每个request-response拆分为了细小的二进制帧Frame,这样即使一个请求被阻塞了,也不会影响其他请求。

HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。

引入了头信息压缩机制(header compression)。一方面,头信息使用gzip或compress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。

HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。

你可能感兴趣的:(计算机网络)