如何使协议知道foo主机名?


10

这是关于主机名感知和代理的规范问题

我知道某些协议可识别主机名。也就是说,当我连接到HTTP服务器时,www.example.com它知道我想要www.example.com的HTTP服务而不是HTTP服务www.example.net,即使它们位于相同的IP地址上也是如此。如何为foo协议执行此操作?

(临时注释:根据该元讨论出现此问题。)

Answers:


14

要了解发生了什么,您需要对DNS有一点了解。

当客户端想要连接到给定主机上的服务时,它会通过其本地DNS基础结构查找主机名,并作为响应接收IP地址。然后,它连接到该IP地址,并按照其构建的Procotol规定的方式请求服务。

在某些情况下,该协议的一部分涉及第二次发送最初查找的主机名,在这种情况下,该主机名被发送到服务器而不是DNS基础结构。对于HTTP,这是RFC 2616中HTTP / 1.1的一部分;如果是HTTPS,则在RFC 4366中将其实现为服务器名称指示(SNI);对于FTP,它是由RFC 7151中的命令添加的(但请参见后面的警告)。 如果第二次发送没有发生,则服务器将无法知道客户端将其主机名传递给其本地DNS的主机名,以获取服务器的IP地址。HOST

请注意,在所有情况下,都需要对协议进行更改才能进行第二次发送,从而使客户端-服务器交互可识别主机名。更改协议后,必须更新服务器代码以实现该协议。最后,必须更新客户端以与服务器讨论新协议。最后一步可能会特别慢;就SNI而言,Windows XP上的Internet Explorer从未实现过,因此尽管周围仍然有大量的IE-on-XP用户,但仍不能依赖该协议,因此他们花了大约十年的时间来终止和/或升级SNI可以可靠部署。

因此,这就是使非主机名感知协议知道主机名的过程。这不是简单的标志设置或配置更改。我们有一些特定于协议的答案,用于处理事务状态以及可能的缓解措施,尤其是针对该协议: SSH(以及SFTP)和 FTP(指出HOST对FTP的支持目前尚不完整) -支持阶段,因此尚不能依靠)。

简短的答案是,如果您的协议当前未实现主机名感知功能,并且在客户端和服务器之间都具有良好的支持,那就算了:这不是您可以做的。


6
我想我会用一些协议是针对全新产品或本地协议足以使一家公司控制服务器和客户端的所有实例这一事实来缓和这个答案。在这些情况下,仅添加主机名命令或数据包非常简单且易于实现。您描述了将任何新功能添加到许多供应商已经广泛使用的现有协议中的困难。
JPhi1618

4
@ JPhi1618,我听到了您的声音,但我认为,由单个公司创建和实现的,嵌入RFC的任何“协议” 根本不是协议;这只是内部工程决策,我对这种专有产品不感兴趣。如您所指出的,如果愿意,供应商可以立即进行更改以实现主机名感知。但由于没有一个其他的不是供应商能做到这一点,我不明白它是如何备受关注的OP的。
MadHatter

我认为相关的问题是您是在设计新协议还是询问如何更改现有协议。
Barmar

专有协议仍然是协议。
Barmar

@Barmar可能不是进入这里的好讨论。这个问题与更改现有协议有关,正如我之前提到的,如果专有工程决策/协议baz只能由其所有者和唯一的实施者更改,那么使它具有主机名意识的唯一方法就是向所有者提出上诉。这不会带来有趣的SF答案,而且(在我看来)也不是主题。“ 我如何设计一个支持主机名的协议 ”是另一个问题,并不是我感兴趣的问题。
MadHatter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.