据我所知,我们从dns查询得到的是一个ip地址。因此,到最后,如果是这样的话,我们仍然使用ip地址来连接服务器,域名也是它们的名字。
那么,服务器如何知道我用来查询ip地址的域呢?如果域数据在dns查询期间丢失,vhost如何工作?
发布于 2018-11-29 20:36:37
因特网是分层次工作的。每个层使用不同类型的参数来完成其工作。
第三层通常是IP,也就是Internet协议。为了使用IP地址,每台计算机至少有一台可以与另一台计算机进行讨论。实际上有两个家族:第4版和第6版。
由于在任何给定的计算机上都可以有多个服务,所以您需要在第4层之上建立一个处理传输的层。“优势”之一是TCP,也就是传输控制协议,但也有UDP。TCP和UDP使用端口:一个为特定协议编码的2字节整数。
例如,HTTP的端口号为80 (完全任意),HTTPS端口为443。
DNS本身使用UDP和TCP (端口53),允许将给定的主机名映射到给定的IP地址或多个IP地址。这是典型的A和AAAA记录。还有一个CNAME记录,它将一个域名映射到另一个域名。还有一个SRV记录,它将服务(即协议名+传输)映射到给定的主机名和端口号。
当一台计算机连接到另一台计算机时,其第一步就是找出要连接到的IP地址。它可以使用DNS。通常,它将只获得IP地址,但是,(取决于协议(4层以上))也可能获得一个端口(如果使用SRV记录)。
HTTP不使用SRV记录。因此,浏览器只使用硬编码的80或443端口,或者URL中显示的端口号。
那么我们就处于传输级别,比如说TCP。连接已经完成(因为现在知道了远程IP地址和端口),TCP上面的协议,像HTTP一样,可以自由地传递任何类型的额外数据,比如客户机最初使用的主机名(从URL中获取)来查找IP地址。这是通过HTTP host报头完成的,请参阅RFC 2616
请注意,如果您通过TLS (概念上位于TCP和HTTP之间)进行操作,甚至还会发生其他事情: SNI或Server名称指示。
在进行TLS握手时,因此在任何类型的HTTP头或内容之前,客户端将在某些特定的TLS消息中发送所需的最终主机名。为什么?这样,服务器就可以找到它应该回答哪个特定的证书,否则它将无法知道请求哪个主机名,因为它位于某些HTTP头中,在完成TLS握手之前不存在。
see服务器将能够查看SNI内容,以查找要发回哪个证书,然后查看host头,以确定哪个VirtualHost (在Apache中)部分与正在处理的查询相关。
如果您不在HTTP世界,那么这完全取决于所使用的协议。早期的协议,如FTP,一开始并不打算“多主机”,例如,给定的IP地址只意味着一个主机名和服务。
https://stackoverflow.com/questions/53545873
复制相似问题