每个 HTTP/2 连接会发送一条隐藏的秘密信息!

每个 HTTP/2 连接会发送一条隐藏的秘密信息!

PRISM

如果你监听过 HTTP/2 连接的建立过程,你也许会注意到在每个连接建立时都会发送一条这样的报文。如下:

即以下文本:

PRI * HTTP2.0

SM

如果将 HTTP2.0 以及换行从其中去掉,那么我们就得到了“PRISM”!——这是什么?是斯诺登所揭露的 NSA 的“棱镜计划”!只要是 HTTP/2.0 连接,都会在一开头就发送这样的报文。

是你的 HTTP/2.0 连接被 NSA 监控了么?不是!这条消息代表了你的服务器真正支持了 HTTP/2.0,它是一个用于识别的魔法字符串。

它在 RFC7540 Section 3.5 中描述如下:

在 HTTP/2 中,每个端点都需要发送一个连接引语作为所用协议的最终确认,并用于建立 HTTP/2 连接的初始设置。客户端和服务器发送不同的连接引语。

客户端的连接引语以24个字节开始,以16进制表示如下:

0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a

即以下列字符串开始: “PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n”

事实上,这个魔法字符串原本是“FOOBA”:在 2013/5/29 发布的 draft-ietf-httpbis-http2-03 中它还是这个样子:“FOO * HTTP/2.0\r\n\r\nBA\r\n\r\n”。

而在同年6月份斯诺登事件沸沸扬扬之后,7/8发布的 draft-ietf-httpbis-http2-04 中就变成了“PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n”。

所以,你知道了吧?这个古怪的字符串是互联网工程任务组(IETF)对 NSA 的嘲讽。