实验的环境背景介绍:
本主机的计算机全名为HC-PC5.zj2012.local,计算机名(即主机名,hostname)为HC-PC5,域为zj2012.local,主机的IP地址为192.168.1.105,该主机的操作系统为win 7 旗舰版。
注释:
计算机全名=计算机名+域。
fully qualified hostname= hostname + domain name。
fully qualified hostname ,就是Fullyqualified domain name。
一、hosts文件里内容为空时,执行命令“ping 名字”所得的结果说明了什么?
当hosts文件里的内容为空的时候,获得上面图示里的结果。获得如此结果的原因如下:
因为获得上面图示里的结果时hosts文件里的内容为空的,而“ping名字”的解析过程(即将名字对应成IP地址)首先需要信息是名字和IP地址间的映射条目(这一变量),读取这些映射条目后才能开始解析,所以上述“ping 名字”的解析过程(即将名字对应成IP地址)所需要的映射条目不是从配置文件(如hosts文件)里读取的,而是由win操作系统上的某一进程所调用的rtlIPv6AddressToStringW函数(来自win操作系统上的ntdll.dll文件)构造出这些映射条目的(即程序写死的)。
该函数的功能是获得名字1、名字2和IP地址这两个参数,之后返回一个字符串变量,而这个字符串变量里的内容为“IP地址 名字1 名字2”这一映射条目。
从上图中可知,rtlIPv6AddressToStringW函数应该构造了两条映射条目:
::1 HC-PC5.zj2012.local localhost
fe80::a482:e28f:6406:c09%11 HC-PC5.zj2012.local hc-pc5
注释:
1、 ::1是IP6形式的环回地址,相当于IP4里的127.0.0.1。
2、 fe80::a482:e28f:6406:c09%11也是IP地址在IP6协议里的表示方法。
3、
在上述window调用的构造函数下,映射条目的写法为<ipaddress> <fully qualified hostname> <short hostname>;
在DNS系统下,映射条目的写法为<ipaddress> <fully qualified hostname> <short hostname>;
在host文件下,映射条目的写法为“IP地址 名字1 名字2”。
二、映射条目里存在多个名字时,执行命令“ping 名字n”所得的结果如何?
下面两张图片里,我们只要对比各自第一条命令执行结果的不同即可,因为两张图片里执行的第一条命令对应的hosts文件里的映射条目不同:
小结:
存在“IP地址 名字1 名字2。。。。。。名字k”这一映射条目时,则执行命令“ping 名字n”时,无论命令中的名字n为映射条目中的哪一个名字,执行命令所得的结果“正在Ping 名字m [IP地址] 具有 32 字节的数据”中的名字m指的都是映射条目中的名字1。
上述实验中,可能会觉得HC-PC5.zj2012.local这个名字会比较特殊,那么我们在映射条目中将其换成一般的名字,所得结果还是跟上述结论一样:
三、不同映射条目里只要存在同一个名字值时,执行命令“ping 名字A”所得的结果如何?
上面图示里左侧的上半部分执行那条命令时,hosts文件里的内容为空的。所以,执行结果里显示的为“正在 Ping HC-PC5.zj2012.local [fe80::a482:e28f:6406:c09%11] 具有 32 字节的数据”。而当hosts文件里的内容配置如上后,还是执行那条命令,即ping HC-PC5.zj2012.local,则执行结果里显示的为“正在 PingHC-PC5.zj2012.local [192.168.1.105]具有 32 字节的数据”。说明解析过程,优先使用hosts文件里的映射条目。
上面图示里右侧部分所示的hosts文件里的映射条目和再上一张图示里右侧部分所示的hosts文件里的映射条目是一样的,只是两条映射条目上下顺序不一样。而上图执行命令ping HC-PC5.zj2012.local所得的执行结果里显示的也还是为“正在Ping HC-PC5.zj2012.local [192.168.1.105]具有 32 字节的数据”。上面两图对比说明,在win 旗舰版时,不同映射条目的第一个名字都是同一个名字的话,则执行结果与映射条目上下顺序无关,执行”ping 该名字”所得的结果正在 Ping该名字[IP地址] 具有 32 字节的数据”里的IP地址为本机的实际IP地址,而非环回地址127.0.0.1。
注释:在win 旗舰版时,该IP地址为环回地址127.0.0.1,而非本机的实际IP地址。
下面这两张图,第一张说明当不同映射条目的第一个名字都是同一个名字的话会如上图出现的结果,第二张说明例如不同映射条目的第二名字都是同一个名字的话,则也会出现类似上图出现的结果,而且还说明了“正在 Ping 名字n [IP地址] 具有 32 字节的数据”中的名字n指的就是映射条目中的名字1:
小结:
当多个映射条目的名字n都是同一个名字A(就是说不同映射条目里,都是第n个位置的名字所取的值相同),且映射条目里的IP地址大家不同时,则执行命令“ping 名字A”所得的结果“正在Ping 名字m [IP地址] 具有 32 字节的数据”中的名字m指的就是映射条目中的名字1,而不同的操作系统版本都有自己认为的某一特定优先IP地址做为该IP地址的值,在win 旗舰版时,操作系统优先取本机的实际IP地址为IP地址的值,在win 旗舰版时,操作系统优先取环回地址127.0.0.1为IP地址的值。
下面两张图片,是为了说明不同映射条目里只要存在同一个名字值,则无论该同名字值在不同映射条目里是否处于同一位置,比如,名字A在映射条目X里处于名字n的位置,而在映射条目Y里处于名字m的位置,执行命令“ping 名字A”所得的结果“正在Ping 名字m [IP地址] 具有 32 字节的数据”中的IP地址,操作系统版本都有自己认为的某一特定优先IP地址做为该IP地址的值:
注释:
Microsoft TCP/IP for Windows:说明 每个操作系统自己会根据标准TCP/IP协议来修改出适合自己操作系统的特定版本的TCP/IP协议。
参考:
附加:
1、客户端会用到(自己的)hosts文件在建立连接时,而不是服务端用到(自己的)hosts文件
客户端的操作系统在向DNS服务器发出域名解析请求之前会查询自己的hosts文件,所以说hosts文件里的映射条目都是指服务端主机的ip地址和ip地址的域名间的映射:
客户端比如在浏览器中输入一个域名时,就会自动查询事先存在自己hosts文件里的映射条目,之后就能查出服务端的ip地址,从而通过ip地址连接到服务端(两个主机间要建立连接通讯只能靠ip地址的形式,而不是域名之类别的形式,因为通讯协议即ip协议设计时就是只支持ip地址格式的)。
2、hosts文件里的映射条目在格式上不必说<ip地址> 后的第一个域名是<fully qualified hostname>形式的,第二个域名是<short hostname>形式的
所以说,hosts文件里的映射条目在格式上不必说<ip地址> 后的第一个域名是<fully qualified hostname>形式的,第二个域名是<short hostname>形式的,即不一定要用下面的写法,只是该写法是一个习惯而已:
hosts文件格式是一行一条记录,分别是IP地址 hostname aliases,三者用空白字符分隔,aliases可选
<ipaddress> <fully qualified hostname> <short hostname> <ip地址><完全合格的主机名> <短主机名>
其实,<ip地址> 后跟着的域名为什么名字是客户端可以随便取的,因为这个域名,只要写着该域名的hosts文件所在的客户端所在的主机(即操作系统)认识该域名即可,也就是说,该域名是该主机给某一个ip地址取的别名而已,主机将该别名和真名(即ip地址)的映射存在自己的hosts文件里,这样,下次主机在自己的浏览器上输入这个别名就可知道这个别名对应的真名(即ip地址)是什么,从而连接到自己想要连接的主机(即操作系统)服务端上。类似于,你给某一个人取了个别名,这个别名除了你自己别人(被你取了别名的那人)都不到这个别名真实的意思是什么,你自己说这个别名时自己知道这个别名是指谁(相当于你的主机hosts文件有这么一条映射条目),如果你自己说这个别名时自己也不知道这个别名是指谁(相当于你的主机hosts文件没有有这么一条映射条目),那你就不知道说这个别名的目的何在了(相当于没法通过域名解析后连接到对方)。
而DNS系统(由因特网上的多个DNS服务器主机加上DNS协议组成)是给因特网上所有的主机取了别名,而且这个别名是按照一定规则取的,不是乱取名的,比如,某一批人的别名会出现.com等。当你手里有一个人的别名而不知道别名具体指谁时,就可以向DNS系统(上的DNS服务器主机)查询这个别名具体指谁,DNS服务器主机就会告诉你这个别名对应的真名(即ip地址)是什么,从而连接到自己想要连接的主机(即操作系统)服务端上。如果你乱写了一个别名,在DNS系统的别名库没有的话,那你问DNS系统(上的DNS服务器主机)也问不出结果的,因为它不认识这个别名。
DNS系统和hosts文件给同一主机取了别名,但是因为是两套别名系统,各自不知道对方取的别名的含义,就像两个人,一个讲英语,一个讲中文,双方都听不懂对方的语言,所以两个人都在说苹果,但双方都不知道讲的意思。
在DNS系统下,映射条目的写法为<ipaddress> <fully qualified hostname> <short hostname>;
在host文件下,映射条目的写法为“IP地址 名字1 名字2”。
不可以,因为FQDN是DNS协议设计时规定好的一种域名取名的格式,即就是要求DNS服务端给DNS客户端取一个FQDN 时该FQDN有客户端的主机名。
Hostname指定系统的 DNS 主机名,该主机名可由“hostname”命令返回。也就是FQDN (fully qualified domain name,完全限定域名)=主机名+域名(包括顶级域)中的那个主机名。因为hostname是dns主机名,所以hostname会出现在dns系统用的fqdn格式的域名里。如上一段所说,在window系统下,由于调用执行了一函数,使得Hostname和主机的Ip地址间构造出了一个映射条目,而Linux没有。
在window系统下,构造出了一个映射条目 习惯 将“IP地址 名字1 名字2”[这是一般形式写法]这一格式里的名字1写为<fully qualified hostname>,名字2写为 <short hostname> ,也就是Hostname。最后结果,即为<ipaddress> <fully qualified hostname> <short hostname>
注释:
1、服务端不一定就是和客户端在不同的主机上,也可以在同一主机上。比如,一主机有ip地址A和B,服务端用A,客户端用B。或者,一主机只有一个ip地址A,服务端用A,客户端也同时可用A。
2、fully qualified host name就是fully qualified domain name
<short hostname>就是平时说的主机名。
3、域名,确切地说,是和主机(即操作系统)上的一个IP地址对应。