热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

WithinHTTP2:在HTTP2:Sowhenrequestonehtmlpage,withmultipledomains(www.example.com,api.exa

Within HTTP2:

在HTTP2:

So when request one html page, with multiple domains(www.example.com, api.example.com...), it is said, there will be multiple connections.

因此,当请求一个html页面时,有多个域(www.example.com, api.example.com…),会有多个连接。

but what if these domains share one same IP? Are there still multiple connections?

但是如果这些域名共享一个IP呢?还有多个连接吗?

2 个解决方案

#1


2  

That depends on the client.

这取决于客户。

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

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

Clients SHOULD NOT open more than one HTTP/2 connection to a given host and port pair, where the host is derived from a URI, a selected alternative service [ALT-SVC], or a configured proxy.

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

...

A client MAY open multiple connections to the same IP address and TCP port using different Server Name Indication [TLS-EXT] values or to provide different TLS client certificates but SHOULD avoid creating multiple connections with the same configuration.

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

...

Connections that are made to an origin server, either directly or through a tunnel created using the CONNECT method (Section 8.3), MAY be reused for requests with multiple different URI authority components. A connection can be reused as long as the origin server is authoritative (Section 10.1). For TCP connections without TLS, this depends on the host having resolved to the same IP address.

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

So there's not really a hard requirement, so if a client has very good reasons for making multiple connections instead of reusing one it is allowed to do so.

所以没有硬性要求,所以如果客户端有很好的理由建立多个连接而不是重用一个,那么它就可以这么做。

Specially if both domains use a different TLS certificate (not one where both names are present as SubjectAltNames) I'd expect to see a separate connection for each.

特别是如果两个域都使用不同的TLS证书(而不是两个名称都作为subject - taltnames显示的证书),我希望看到每个域都有单独的连接。

#2


0  

As @mata says this is up to the client.

@mata说这取决于客户。

However one clear use case is in connection coalescing.

然而,一个清晰的用例是连接合并。

Under HTTP/1.1 domains were often sharded (e.g. www.example.com might also have a static.example.com domain for serving static assets). This was for two reasons:

在HTTP/1.1下,域通常是分片的(例如www.example.com也可能有一个用于服务静态资产的static.example.com域)。这有两个原因:

  1. To break the 6-8 connection limit per domain that browsers often used and allow more downloads in parallel.
  2. 为了打破浏览器经常使用的每个域的6-8连接限制,并允许更多的并行下载。
  3. To have so called "COOKIE-less" domains which saved on the overhead of sending these HTTP headers for static assets that didn't need them (e.g. images, css, Javascript).
  4. 有所谓的“无COOKIE”域,它节省了将这些HTTP头发送给不需要它们的静态资产(例如图像、css、Javascript)的开销。

Under HTTP/2 there is one connection and the limit on parallel downloads is the stream limit which is much higher (usually 100-150 though can also be unlimited). Additionally with HPACK header compression large COOKIEs cause less of a performance hit (though there can still be security issues which can be another reason for COOKIE-less domains).

在HTTP/2下有一个连接,并行下载的限制是流限制,后者要高得多(通常是100-150,但也可以是无限的)。此外,使用HPACK头压缩时,大型COOKIE会减少性能损失(尽管仍然存在安全问题,这可能是无COOKIE域的另一个原因)。

So, should we just give up on sharded domains completely now? What about those clients that cannot support HTTP/2? While support is very good it is not universal and those behind proxy connections (e.g. corporate connections or antivirus software) often cannot use this even if their browsers can.

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

Connection coalescing is used by browsers to collapse near identical connections (usually those with the same IP address and same TLS certificate) into one connection rather than opening a single one when using HTTP/2 and allows HTTP/1.1 connections to continue seeing these as separate domains. Daniel Haxx has the best blog post on how this is actually implemented by browsers(though it's about a year and a half old at the time of writing so this may have changed). To summarise it, Chrome uses it as you'd expect, Firefox is (overly?) aggressive about coalescing in as many circumstances as it can (and maybe some that it shouldn't!) and Edge and Safari don't do coalescing at all.

浏览器使用连接合并将几乎相同的连接(通常是具有相同IP地址和相同TLS证书的连接)合并到一个连接中,而不是在使用HTTP/2时打开一个连接,并允许HTTP/1.1连接继续将这些连接视为独立的域。Daniel Haxx有一篇关于浏览器是如何实现这一功能的最好的博客文章(尽管写这篇文章的时候已经有一年半的时间了,所以可能已经发生了变化)。总而言之,Chrome按照你所期望的那样使用它,Firefox在尽可能多的情况下(也许有些情况下它不应该这么做)积极地进行合并,而Edge和Safari根本就没有合并。

If a connection is coalesced when it shouldn't be, the server can respond with a 421 HTTP Status code which basically means "What are you doing, that's not a request for me!!" and the browser can then try again with a separate connection.

如果连接不应该被合并,服务器可以使用421 HTTP状态码进行响应,这基本上意味着“您在做什么,这不是我的请求!”,然后浏览器可以再次尝试使用一个单独的连接。

It also looks like that HTTP/2 will shortly add the ORIGIN Frame which will allow the server to respond to any request with a "hey, I can also serve you api.example.com requests if you want" style message. Even if the IP address doesn't match (which has some people concerned about the security implications of that!).

看起来HTTP/2很快就会添加源框架,允许服务器以“嘿,如果你想要的话,我也可以为你提供api.example.com请求”样式消息来响应任何请求。即使IP地址不匹配(这让一些人担心它的安全影响!)

While we're on the topic, it's not always the case that as single domain will always use one connection either. Read Jake Archibald's excellent post on HTTP/2 Push which shows that there are various circumstances when that's not the case (summarised as: for non-credentialed requests, when having the same domain open in a separate tab in Edge, or randomly even on the same tab for Safari).

虽然我们在讨论这个主题,但并不总是单个域总是使用一个连接。请阅读Jake Archibald在HTTP/2 Push上发表的优秀文章,该文章显示,当情况并非如此时,会出现各种各样的情况(总结为:对于未认证的请求,当同一域在Edge的另一个选项卡中打开时,或者在Safari的同一个选项卡上随机打开时)。


推荐阅读
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • feat: Enhances Jest Testing Capabilities with Snapshot Support ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 在OpenShift上部署基于MongoDB和Node.js的多层应用程序
    本文档详细介绍了如何在OpenShift 4.x环境中部署一个包含MongoDB数据库和Node.js后端及前端的多层应用程序。通过逐步指导,读者可以轻松完成整个部署过程。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • SSL 错误:目标主机名与备用证书主题名称不匹配
    在使用 `git clone` 命令时,常见的 SSL 错误表现为:无法访问指定的 HTTPS 地址(如 `https://ip_or_domain/xxxx.git`),原因是目标主机名与备用证书主题名称不匹配。这通常是因为服务器的 SSL 证书配置不正确或客户端的证书验证设置有问题。建议检查服务器的 SSL 证书配置,确保其包含正确的主机名,并确认客户端的证书信任库已更新。此外,可以通过临时禁用 SSL 验证来排查问题,但请注意这会降低安全性。 ... [详细]
author-avatar
天使犯罪de快乐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有