如何检测服务器是不是正在使用 SPDY

Posted

技术标签:

【中文标题】如何检测服务器是不是正在使用 SPDY【英文标题】:How to detect if a server is using SPDY如何检测服务器是否正在使用 SPDY 【发布时间】:2014-07-07 17:15:41 【问题描述】:

有什么方法可以检测远程网站是否支持 SPDY 以及它是什么版本?

我可以从命令行使用的东西,比如 bash 脚本。

尝试使用 curl 发送自定义 User-Agent 标头,但无法获得任何可以帮助我的响应标头。

我们的想法是能够为任何域获取 SPDY:true/false Version:3.1/3.0...。

【问题讨论】:

您是要编写一个程序来执行此操作,还是要为您编写此程序? 我希望有一些东西可以在 bash 脚本中使用。 【参考方案1】:
openssl s_client -connect google.com:443 -nextprotoneg ''
CONNECTED(00000003)
Protocols advertised by server: spdy/3.1, spdy/3, http/1.1

【讨论】:

如果您使用的是 openssl 0.9.8,此命令将不起作用。如果您使用的是 Mac,您可以使用 brew 更新 openssl:apple.stackexchange.com/a/126832/78754 我的服务器使用 openssl v1.0.1,这个命令有帮助。非常感谢!【参考方案2】:

SPDY 协议协商发生在初始 TLS 握手期间。

目前有两种协商协议的方法:较旧的一种称为 NPN (https://datatracker.ietf.org/doc/html/draft-agl-tls-nextprotoneg-04)。 在 ClientHello TLS 消息中,客户端发送 ID 为 0x3374 的 NPN 扩展。服务器回复一个 ServerHello TLS 消息,该消息还包含服务器支持的协议列表,也在 NPN 扩展中。 客户端然后选择协议并将其选择加密发送到服务器。

较新的方法是为 HTTP 2.0 设计的,称为 ALPN (https://datatracker.ietf.org/doc/html/draft-ietf-tls-applayerprotoneg-05)。 ClientHello TLS 消息包含 ID 为 0x10 的 ALPN 扩展。 这一次,客户端发送支持的协议列表,服务器回复一个 ServerHello TLS 消息,该消息包含服务器选择的协议,也在 ALPN 扩展中。

在 NPN 和 ALPN 扩展中,协议列表都以字符串形式发送,例如 http/1.1spdy/3

一旦选择了协议,TLS 握手将继续,然后双方将立即开始使用他们选择的协议。

因此,了解协议协商的唯一方法是使用 TLS 并拥有一个公开协议协商扩展的客户端。 每个客户端都以特定方式执行此操作,但据我所知,尚不支持 bash 脚本。

例如,HAProxy 支持 NPN 和 ALPN (http://cbonte.github.io/haproxy-dconv/configuration-1.5.html),Jetty 9.2 也支持 NPN 和 ALPN(用于客户端和服务器)。

nginx 或 Apache 等其他服务器支持带有 ALPN 补丁的 NPN(因为无论如何 HTTP 2.0 都需要它)。

NPN 最终会消失; Google 的 Adam Langley has stated 表示 NPN 将被 ALPN 弃用。

【讨论】:

所以你推荐使用wireshark来检查SPDY?有什么方法可以自动化这个过程? Wireshark 当然是一个选择。可编程选项是找到允许您设置/检查 TLS 扩展的 API。我知道 Java 还没有提供一个(还),但其他语言/平台可能。 Jetty 项目在 Java 中有 NPN 和 ALPN 的 API,但它们不能一起使用。通过使用 Jetty API,检测 SPDY 支持将相当容易(这就是 Jetty SPDY 客户端所做的)。 我认为这个被错误否决的答案比接受的答案要好。 +1

以上是关于如何检测服务器是不是正在使用 SPDY的主要内容,如果未能解决你的问题,请参考以下文章

如何检测访问者使用的是 HTTP/2 还是 SPDY?

使用 Dropwizard 客户端支持 SPDY

检测浏览器中的 HTTP2/SPDY 支持

如何运行瓶子 + 龙卷风 + ssl (https) + spdy

如何使用 SPDY 协议为 Django 应用程序提供服务?

将 SPDY 与 Netty 一起使用