目录
问题描述
本机为win10系统,在命令行窗口ping localhost时,本机IP127.0.0.1被解析为了 ::1的问题
1、在命令行窗口 ping 127.0.0.1
2、在命令行窗口 ping localhost
我们看到在ping localhost时,本机ip127.0.0.1被解析为了::1 。
问题分析
原因是windows有个优先解析列表,当IPv6的优先级高于IPv4时,就会出现ping localhost时本机ip127.0.01被优先解析为IPv6格式的这种环回地址的情况。
IPV6协议会将本机ip127.0.0.1解析为 ::1 ( ::1是本机ip127.0.01 IPv6地址格式的表示形式或表达方式),::1是IPv6地址相当于IPv4的127.0.0.1,127.0.0.1是个回环地址。
所以,输入ping localhost命令时默认的就会出现返回的数据包并不是127.0.0.1而是::1,这就是Ipv6格式的本地ip地址
解决方案
一、修改host文件
修改C:\Windows\System32\drivers\hosts文件,在末尾加上下面两行:
127.0.0.1 localhost
localhost 127.0.0.1
配置C:\Windows\System32\drivers\hosts文件之后还是无法解决解析为::1,可以看看下面这种修改修改注册表的方法
二、修改注册表
在cmd中ping localhost解析出来的是IPV6的::1,原因是windows有个优先解析列表,当IPv6的优先级高于IPv4时,就会出现这种情况。我见网上有一种方法是修改注册表来提升IPv4优先级的。具体方法为:
打开RegEdit,导航到HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ tcpip6 \ Parameters, 创建DisabledComponents DWORD注册表值,将其值设置为20(十六进制),然后重启电脑。这种方法我试了,还是没能解决。最后,只能尝试终极大法——使用管理员命令行修改IPv6的优先级
三、修改IPv6的优先级
修改IPv6优先级的方法,即修改IPv4优先级高于IPv6的记录到优先解析表中。具体方法如下:
1、按win徽标+X(或在徽标键上右键),打开管理员命令行窗口(就是用管理员权限打开cmd)
2、输入命令 netsh interface ipv6 show prefixpolicies 查看IPv6优先级
请注意,以上可以看出,IPv6的优先级高于IPv4,即IPv6地址(::/0)优先于IPv4地址(::/96,::ffff:0:0/96),因此,我们可以制定策略,使IPv6不会比任何IPv4地址有利。其中,标签表示优先级,0表示优先级最高,依次类推。
🔉 番外:IPv6特殊用途地址
- ::/0,默认路由条目,不用于寻址;
- ::/128,未指定地址, 可作为源IP地址使用;
- ::1/128,IPv6主机回送地址,不用于发送出本地主机的数据中;
- ::ffff:0:0/96,IPv4映射地址, 这种地址不会出现在分组头部,只用于内部主机;
- ::{ipv4-address}/96,IPv4兼容地址,已过时,未使用;
- 2001::32,Teredo地址;
- 2001:10::/28,ORCHI(覆盖可路由加密散列标识符),这种地址不会出现在公共的Internet中;
- 2001:db8::32,用于文档和实例的地址范围,这种地址不会出现在公共的Internet中;
- 2002::16,6to4隧道中继的6to4地址;
- 3ffe::/16,用于6bone实验,已过时,未使用;
- 5f00::/16,用于6bone实验, 已过时,未使用;
- fc00::/7,唯一的本地单播地址,不用于全球性的Inrternet;
- fe80::/10,链路本地单播地址;
- ff00::/8,IPv6组播地址, 仅为目的地址使用。
::/128 ——即0:0:0:0:0:0:0:0,只能作为尚未获得正式地址的主机的源地址,不能作为目的地址,不能分配给真实的网络接口
::1/128 ——即0:0:0:0:0:0:0:1,回环地址,相当于ipv4中的localhost(127.0.0.1),ping locahost可得到此地址
3、设置优先级
现在需要设置使::/96、::ffff:0:0/96的优先级高于::/0和::1/128,在命令行中依次设置优先级
netsh int ipv6 set prefix ::/96 50 0
netsh int ipv6 set prefix ::ffff:0:0/96 40 1
netsh int ipv6 set prefix 2002::/16 35 2
netsh int ipv6 set prefix 2001::/32 30 3
netsh int ipv6 set prefix ::1/128 10 4
netsh int ipv6 set prefix ::/0 5 5
netsh int ipv6 set prefix fc00::/7 3 13
netsh int ipv6 set prefix fec0::/10 1 11
netsh int ipv6 set prefix 3ffe::/16 1 12
4、查看设置后的优先级
完了后输入命令netsh interface ipv6 show prefixpolicies查看优先级
可以看到,此时::/96,::ffff:0:0/96优先级高于::/0了。
5、ping一下localhost
OK,配置完成!