扩展

http2协议强制规定了接收方必须读取并忽略掉所有未知帧(即未知帧类型的帧)。双方可以在逐跳原则(hop-by-hop basis)基础上协商使用新的帧,但这些帧的状态无法被改变,也不受流控制。

是否应该允许添加扩展的这个话题在制定http2协议的时候被反复讨论了很久,但在draft-12之后,最终尘埃落定确定了允许添加扩展。

但扩展不再是协议本身的一部分,它被记录在核心协议规范之外。现在已经有两种类型的帧被工作组记录在案,它们很可能率先被纳入协议的扩展部分,而这两个曾被当作“原生”的帧非常流行,所以接下来我会详细讨论它们。

7.1. 备选服务(Alternative Services)

随着http2逐渐被接受,我们有理由相信,相对于HTTP 1.x,TCP连接会更长并被保持的更久。对客户端来讲,最好是到每个主机/站点的每一条连接都可以做尽可能多的事情,而这也需要每个连接可以保持更长的时间。

但这会影响到HTTP负载均衡器的正常工作,比如在一个网站会出于性能的考虑,当然也可能是正常的维护或者一些类似的原因,想建议客户端连接到另外一个主机的时候。

服务器将会通过发送Alt-Svc头(或者http2的ALTSVC帧)来告知客户端另一个备选服务。即另外一条指向不同的服务源、主机或端口,但却能获取同样内容的路由。

客户端应该尝试异步的去连接到该服务,如果连接成功的话,即可以使用该备选服务。

7.1.1. 机会型TLS(Opportunistic TLS)

Alt-Svc头部意味着允许服务器基于http://提供内容,与此同时,这个头部也意味着告知客户端:同样的内容也可以通过TLS连接来获取。

这是个还在讨论中的功能。因为这样的连接会产生一个未认证的、在任何地方也不会被标示为“安全”的TLS连接,也不会在客户端界面上出现任何锁标识,所以没法让用户知道这其实不是常规的HTTP连接。这就是很多人强烈反对机会型TLS的原因。

7.2. 阻塞(Blocked)

这个类型的帧意味着:当服务端存在需要发送的内容,但流控制却禁止发送任何数据时,那么此类型的帧将会被发送且发送一次。这种帧设计的目的在于,如果你接收到了此帧,那么连接中必然有错误发生或者是得到了低于期望的传输速度。

在此帧被放到协议扩展部分之前,draft-12中的一段话:

”阻塞帧被包含在草案版本中作为实验性的特性,如果它无法获得良好的反馈,那么该特性最后会被移除。”