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的通信中。

results matching ""

    No results matching ""