HTTP2:不同的域但相同的IP,多连接还是一个连接?

Posted

技术标签:

【中文标题】HTTP2:不同的域但相同的IP,多连接还是一个连接?【英文标题】:HTTP2: different domain but same IP, multiple connection or one connection? 【发布时间】:2018-07-19 23:32:55 【问题描述】:

在 HTTP2 内:

所以当请求一个html页面时,有多个域(www.example.com,api.example.com...),据说会有多个连接。

但是如果这些域共享同一个 IP 怎么办?是否还有多个连接?

【问题讨论】:

【参考方案1】:

正如@mata 所说,这取决于客户。

然而,一个明确的用例是连接合并。

在 HTTP/1.1 下,域经常被分片(例如,www.example.com 也可能有一个 static.example.com 域来提供静态资产)。这有两个原因:

    打破浏览器经常使用的每个域 6-8 个连接限制,并允许更多并行下载。 拥有所谓的“无 cookie”域,从而节省了为不需要它们的静态资产(例如图像、css、javascript)发送这些 HTTP 标头的开销。

在 HTTP/2 下只有一个连接,并行下载的限制是更高的流限制(通常为 100-150,但也可以无限制)。此外,通过 HPACK 标头压缩,大型 cookie 对性能的影响较小(尽管仍然可能存在安全问题,这可能是无 cookie 域的另一个原因)。

那么,我们现在应该完全放弃分片域吗?那些不支持 HTTP/2 的客户端呢?虽然支持非常好,但并不是通用的,代理连接背后的人(例如公司连接或防病毒软件)通常无法使用它,即使他们的浏览器可以。

浏览器使用连接合并将相同的连接(通常是具有相同 IP 地址和相同 TLS 证书的连接)合并为一个连接,而不是在使用 HTTP/2 时打开一个连接,并允许 HTTP/1.1 连接继续查看这些作为单独的域。 Daniel Haxx has the best blog post on how this is actually implemented by browsers(尽管在撰写本文时它已经大约一年半了,所以这可能已经改变了)。总而言之,Chrome 会按照您的预期使用它,Firefox (过度?)在尽可能多的情况下(也许有些情况下不应该!)积极地进行合并,而 Edge 和 Safari 不会在全部。

如果连接在不应该合并的情况下合并,服务器可以响应 421 HTTP 状态代码,这基本上意味着“你在做什么,这不是对我的请求!!”然后浏览器可以使用单独的连接重试。

看起来 HTTP/2 很快就会添加ORIGIN Frame,这将允许服务器使用“嘿,如果你愿意,我也可以为你提供 api.example.com 请求”样式消息来响应任何请求.即使IP地址不匹配(这让一些人担心security implications of that!)。

虽然我们正在讨论这个主题,但也并非总是这样,因为单个域也总是使用一个连接。阅读Jake Archibald's excellent post on HTTP/2 Push,这表明在各种情况下并非如此(总结为:对于非凭据请求,在 Edge 的单独选项卡中打开相同的域时,或者甚至在 Safari 的同一选项卡中随机打开)。

【讨论】:

【参考方案2】:

这取决于客户。

http://httpwg.org/specs/rfc7540.html#HttpExtra

客户端不应该打开多个到给定主机和端口对的 HTTP/2 连接,其中主机派生自 URI、选定的替代服务 [ALT-SVC] 或配置代理。

...

客户端可以使用不同的服务器名称指示 [TLS-EXT] 值或提供不同的 TLS 客户端证书打开到相同 IP 地址和 TCP 端口的多个连接,但应避免与相同的配置。

...

直接或通过使用 CONNECT 方法(第 8.3 节)创建的隧道与源服务器建立的连接,可以重用于具有多个不同 URI 权限组件的请求。只要源服务器具有权威性,就可以重用连接(第 10.1 节)。对于没有 TLS 的 TCP 连接,这取决于解析到相同 IP 地址的主机。

所以实际上并没有什么硬性要求,所以如果客户端有充分的理由建立多个连接而不是重复使用一个连接,那么它是允许的。

特别是如果两个域都使用不同的 TLS 证书(不是两个名称都作为 SubjectAltNames 出现的证书),我希望每个域都有一个单独的连接。

【讨论】:

我在一个 IP 上遇到了 istio(一个通配符证书)和多个域(应用程序)的问题。在浏览器中打开一个后,对所有其他人的请求以 404 结束。【参考方案3】:

我们遇到了这个问题

在负载平衡器后面的不同服务器上使用多个环境进行测试设置

test1.domain test2.domain testx.domain

例如从 test1.domain.com 切换到 test2.domain.com 出现 404 错误或未授权

出现此问题的原因是负载均衡器希望客户端添加包含主机名的 SNI 扩展,例如test1.domain.com

在对负载均衡器的第一次调用中,包含了 SNI 名称,随后,chrome 浏览器指向另一个环境 test2.domain.com,chr​​ome 不发送 SNI 扩展 test2.domain.com,因此流量仍然存在路由 test1.domain.com

由于持有 test1.domain.com 的服务器不知道 test2.domain.com,因此向 chrome 发送 404 返回。

必须使用自己的 IP 地址重新配置负载平衡器上的每个服务,或者需要执行返回代码 421。 见https://daniel.haxx.se/blog/2016/08/18/http2-connection-coalescing/ 部分:惊喜和缓解它们的方法(HTTP 状态码 421 的实现)

【讨论】:

以上是关于HTTP2:不同的域但相同的IP,多连接还是一个连接?的主要内容,如果未能解决你的问题,请参考以下文章

重定向到其他域但保留键入的域

HTTP 2.0 - 1 个 TCP/IP 连接与 6 个并行

揭秘http2

HTTP843- 揭秘 HTTP2

如何使用 docker 和 nginx 反向代理托管具有相同域但路径不同的多个网站例如:domain.fr/siteA、domain.fr/siteB、/siteC

http2多路复用