NPN和ALPN
ALPN是NPN的升级版本,他们的作用都是应用层协议协商协议。它其实是TLS协议的扩张,从而确定在TLS上应该实行哪个通信协议,从而避免独立于应用层协议的通信。
NPN
NPN的交互流程是这样的:
ALPN
ALPN的交互流程是这样的:
两者的区别
- NPN 是服务器发送协议列表,由客户端进行选择。而 ALPN 则是客户端发送列表,由服务端选择。
- NPN 的协商结果是在 Change Cipher Spec 之后加密发送给服务端;而 ALPN 的协商结果是通过 Server Hello 明文发给客户端
HTTP Upgrade
HTTP Upgrade也可以进行通信协议的协商。注意这个机制是从HTTP/1.1协议才引入的。
它基本的要求是:
Connection: Upgrade
Upgrade: protocol-name[/protocol-version]
客户端通过 Upgrade 头部字段列出所希望升级到的协议和版本,多个协议之间用英文逗号和空格(0x2C, 0x20)隔开。
一般根据协商(应该说升级)的协议的不同,会需要额外补充其他的头部字段吧。
如果服务端不同意升级或者不支持 Upgrade 所列出的协议,直接忽略即可;否则服务端会返回这样的响应(在响应中就已经可以使用新的协议传递信息了):
HTTP/1.1 101 Switching Protocols
Connection: upgrade
Upgrade: protocol-name[/protocol-version]
[... data defined by new protocol ...]
ALPN VS Upgrade
Upgrade存在的问题是,在升级的通信过程中,由于中间节点不能正确处理头部信息而导致升级失败。
ALPN是基于TLS的,所以一般应用在https的通信中。