在测试本地环境是否安装好 Tomcat 的时候我们经常使用localhost:8080
或者 127.0.0.1:8080
来测试。那么这两个到底有什么区别呢?
我们可以这样理解 localhost 的含义:在本机中用以指向本机自身,主要用来访问计算机本身运行的网络服务,换句话说就是可以通过访问 localhost 实现利用网络协议自己与自己通信。
在测试和开发中,我们经常使用 localhost 来测试本机上运行的服务。
127.0.0.1 也是 ip 地址。但是它属于一种特殊的 ip 地址。它是 IPv4议中定义的回环(loopback)地址范围内,该范围是从 127.0.0.0
到 127.255.255.255
。这个地址被用于指向执行网络请求的本地计算机,也就是说,它使得计算机可以向自己发送网络请求。在大多数情况下,127.0.0.1
被用作回环地址的标准。
那么以上述定义来看,localhost 和 127.0.0.1 的作用其实是一样的。那么它们到底有什么区别呢?
上面的结果来自 csdn 博客,阅读量高达 10 万+。博客中描述 localhost 不经过网卡传输。
那么如何判断是否经过网卡呢?
我们可以使用 tcpdump
命令。
tcpdump
tcpdump
是一款网络分析工具,它可以抓取通过网络接口传输的数据包的详细信息。换句话说 tcpdump 是一款抓包工具。那么我们就可以利用它来抓去有关 localhost 的数据包了。
首先,我们在终端内输入 ping -c 1 localhost
这个命令的意思是 ping 1 次 localhost
然后使用 tcpdump -i lo0 icmp
抓个包,结果如下图。
tcpdump -i lo0 icmp
命令的意思抓取 lo0 回环网卡上协议为 icmp 的数据包。ping 命令属于 icmp 协议。
可以很清楚的看到有数据包返回。所以,csdn 上那篇文章讲述的 localhost 不经过网卡是错误的。
在本机上运行 nslookup locahost
查看 localhost 对应的 IP 地址,得到结果如下。
nslookup locahost :用于查询域名系统(DNS)以获取主机名对应的IP地址,或者获取IP地址对应的主机名
上图中的属性解释如下:
"Non-authoritative answer" 表示这个回答不是来自权威的DNS服务器,而是本地DNS服务器提供的。
"Name: localhost" 表示查询的主机名是localhost。
"Address: 127.0.0.1" 表示localhost对应的IP地址是127.0.0.1。
这个输出表明localhost在本地主机上对应的IP地址是127.0.0.1。
我们打开本地的/etc/hosts 文件并进行修改
将箭头指向的 IP 地址修改为 127.0.0.2,然后保存。
再次使用 ping localhost 查看对应的 ip 地址,如下图
我们可以看到现在对应的 IP 已经是修改之后的 127.0.0.2 了。
那么假如我们使用114.114.114.114来作为 dns 服务器进行查询,结果如下:
上图结果说明,114.114.114.114 没有找到 localhost 这个主机名对应的 IP 地址,返回了"NXDOMAIN"(No Such Domain)
的响应代码。由此我们知道标准的 dns 服务是没有把 localhost 解析到 127.0.0.1 的。
这篇文章总结的很好。
我经过手动测试的出的结果
localhost 经过网卡
localhost 与 127.0.0.1 的映射关系在本机的/etc/hosts 中存放,我们可以修改验证
标准的 dns 服务器是不会把 localhost 解析为 127.0.0.1的。
用到的两个命令
nslookup
用于查询域名系统(DNS)信息
查询 localhost 对应的主机名:nslookup localhost
在特定的 dns 服务器上查询 localhost 对应的主机名:nslookup localhost 114.114.114.114
查询 IP 对应的主机:nslookup 127.0.0.1
tcpdump
抓包
sudo tcpdump -i any :抓取所有网络接口的包
sudo tcpdump -i eth0 :抓去指定网卡的数据包 ,指定 eth0
sudo tcpdump -i eth0 -w out.pcap :抓包数据保存到 out.pcap 文件
tcpdump -i lo0 icmp
:抓取 lo0 回环网卡上协议为 icmp 的数据包
最后,感谢任总@plantegg提供这么优质的实验。多说一句,CSDN 是上的帖子还是的手动验证一下比较好,要不胡说八道的太多。