67 views

HTTP/2标准的发展 3 – HOL 及其它协议缺陷

image

续前一篇,这里将HTTP1.X协议的一些问题介绍完。

【1】是HTTP/2最新的draft,除了前文的server push,它还提到了其它HTTP1.X的其它问题。

1.HOL(head-of-line blocking)

这个词被中文翻译为“线头阻塞”,算是奇葩翻译中的战斗机了,听起来是缝纫界词汇。“队首阻塞”更好,即队列首部成员的处理阻塞了后继成员。

简言之,HTTP是一种顺次处理的ping-pang协议(ping即HTTP request,pang即HTTP response)。HOL指同一连接上,请求有序处理,即便请求之间没有关联性。

HOL是下面HTTP1.X的已有技术的传承:

1.1.HTTP1.0

每个连接一对request和response,然后关闭连接。

1.2.HTTP 1.1 Persistent connection

应用可以复用一个HTTP连接,多次ping-pang,时序是:

 

进行完一对ping-pang,client才能发起新的请求。

在第一次听说persistent connection的时候我有如下疑问:

A).Client和Server之间如何协商Persistent Connection?

RFC2616的8.1.2.1章节里面

An HTTP/1.1 server MAY assume that a HTTP/1.1 client intends to maintain a persistent connection unless a Connection header including the connection-token “close” was sent in the request.

也就是说对于HTTP1.1,persistent connection是缺省行为。如果client不支持,需要在request中显示添加 connection : close字段。

B).谁来关闭Persistent Connection?

RFC2616之中也有定义:

If either the client or the server sends the close token in the Connection header, that request becomes the last one for the connection.

Client和Server都有权关闭persistent connection。

任何包括“connection:close”字段的HTTP消息(无论请求应答),都表示当前的ping-pang是最后一对了。

 

1.3 HTTP 1.1 Pipe line

client可以一次发送一批request,可能的时序如下:

 

这是HTTP 1.1协议下看起来最并行的情景了。即便这样,如果req1没有处理完,server也不会处理req2。即,pipeline的情况下也有HOL问题。

 

1.4 解决办法

Head-of-line blocking在HTTP1.1中是协议缺陷,不修改协议的情况下只能并发多个HTTP连接。

如果可以对协议进行修改,最好可以实现类似下面这样的完全无序并发:

 

 

2.不是缺陷的缺陷

【1】还提到了一些其它HTTP1.X的问题,但我觉得都不是事儿,设计者的出发点也不是协议功能。

其一是HTTP报文头部冗余。协议建议进行首部压缩,这句话对于任何协议都适用。首部都压缩后,我们网络工程师调试困难多多,还怎么构造文本直接通过telnet测试。安全网关处理这些信息,不得不分配内存解压缩,劳神费力易出错。

其二是引入了流控以及请求优先级的概念,都是协议增强,和缺陷无关。

 

【参考】

1.HTTP/2 draft 16 – http://tools.ietf.org/html/draft-ietf-httpbis-http2-16

2.head-of-line blocking – http://en.wikipedia.org/wiki/Head-of-line_blocking

3.HOL – http://baike.baidu.com/view/3123571.htm

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">