我知道一些协议是主机名知道的; 也就是说,当我连接到www.example.com的HTTP服务器时,它知道我想要www.example.com的HTTP服务,而不是www.example.net ,即使它们在同一个IP地址上。 我怎样才能做到这一点协议foo ?
(暂时的注意:这个问题出现在这个元讨论中 。)
要了解发生了什么,您需要了解一些关于DNS的知识。
当客户想要连接到给定主机上的服务时,它通过其本地DNS基础结构查找主机名,并接收IP地址作为响应。 然后连接到该IP地址,并按照它所构build的协议规定的方式请求服务。
在某些情况下,该协议的一部分涉及第二次发送主机名,在这种情况下,这个主机名被发送到服务器而不是DNS基础设施。 在HTTP的情况下,这是在RFC 2616中作为HTTP / 1.1的一部分添加的; 在HTTPS的情况下,这被实现为RFC 4366中的 服务器名称指示 (SNI) 而在FTP的情况下,这是由RFC 7151中的HOST命令添加的(但是请参阅后面的警告)。 如果这样的第二次发送没有发生,服务器就无法知道客户端为了得到服务器的IP地址而提供给它本地DNS的主机名。
请注意,在所有情况下都需要对协议进行更改,以便进行第二次发送,从而使客户端 – 服务器交互主机名知道。 协议更改后,必须更新服务器代码才能实现它。 最后,客户端必须更新,以便将新协议交给服务器。 最后一步可能会特别慢。 在SNI的情况下,Windows XP上的Internet Explorer从未实现过它,所以在IE-on-XP用户数量仍然很多的情况下,协议是不可靠的,大约需要十年时间才能完成。消失和/或获得SNI可靠部署的升级。
所以这就是使非主机名感知的协议主机名知道所需要的。 这不是一个简单的标志设置或configuration更改。 我们有一些协议特定的答案,处理事态的情况以及可能的缓解措施,特别是对于这个协议:对于SSH (也就是SFTP)和FTP (它指出HOST对FTP的支持当前在补片阶段,所以还不能依靠)。
简而言之,如果您的协议目前不实现主机名称感知,并且在客户端和服务器之间提供良好的支持,那么就不要忘了:这不是您可以做的事情。