很多小伙伴遇到网络故障 或者无法连通时, 大多情况下, 我们都会一顿ping操作 判断是否网络故障。 那么我想问下, Ping 127.0.0.1的原理是什么? 我相信大部分小伙伴, 都会有“心有力,而语不出”这种感觉 心里感觉好像应该懂点什么, 到嘴里又好像没有什么可说的。 就问你,尴尬不尴尬? 今天,我们就好好聊聊 “Ping 127.0.0.1”背后那点事 首先,我们要弄清楚127.0.0.1的位置 1.window系统里,在hosts文件里可以找到127.0.0.1 可以发现localhost解析地址为127.0.0.1 2.linux中是写在/etc/hosts中 通过ifconfig命令,是可以看到这个lo0写了127.0.0.1地址 我们可以发现127.0.0.1默认配给了一个loopback虚拟接口上。 其次,我们要弄清楚ping 127.0.0.1的数据包是否经过网卡. 先简单的阐述下ping的程序 ping是对两个TCP/IP系统连通性进行测试的基本工具, 它只利用ICMP回显请求和回显应答报文, 而不用经过传输层(TCP/UDP) 我们一般把发送回显请求的ping程序为客户端, 而被ping的主机为服务器。 大多数的TCP/IP实现都在内核中直接支持ping服务器。 然后,我们引用“TCP/IP协议卷一”, 关于“网卡驱动处理IP数据包”的流程图,来解释下。 在我们输出ping 127.0.0.1时, IP输出函数会先检查地址是不是换回地址: 1. 如果是环回地址,直接交给环回驱动程序处理,返回ip输入函数 2. 如果不是环回地址,检查是不是广播地址或者多播地址, 如果是广播地址或者组播地址数据报复制一份传给环回接口。然后在送到以太网上。(因为广播和多播包含主机本身) 3. 如果不是广播或者多播地址,才检查是不是本机地址,如果是本机地址,则交给环回驱动程序处理,环回驱动程序返回给ip输入函数 另外,请童鞋注意的是,目前大部分网卡接口不能读会它自己发送出去的数据包, 所以如果是发送给本地的数据包, 最好是不需要经过网卡的。 很多网卡驱动的注释上都有备注。 从上面可以看出 ping 127.0.0.1数据包是不经过网卡的。 而如果ping本机IP是需要经过网卡。 那么,我们是不是可以得出这样的一个结论: 1.ping 127.0.0.1是检查TCP/IP协议栈是否正常。 2.ping 本地IP 是检查你网卡、配置是否正常。 为了验证这个问题,我们通过实验去看下结果: window环境下,我们把网卡禁用,我们来尝试ping 127.0.0.1 图一:网卡禁用 图二:Ping 结果 通过这个简单实验验证我们上面的结论。 那么,有童鞋会问 ping 127.0.0.1会不会被防火墙的影响 我们继续做一个实验去验证: 1.首先测试机开启防火墙功能 2.我们添加127.0.0.1的地址过滤,在高级设置->入站规则里与出站规则:新建规则 3.然后DOS里ping 127.0.0.1,同时wireshark抓包本地网卡的包 可以发现还是能正常ping通,而且网卡上没有127.0.0.1的数据包。 所以ping 127.0.0.1的数据包不受防火墙影响。 总结:ping 127.0.0.1环回地址, 如果不能ping通过说明当前机器的TCP/IP协议栈有问题。 Window的TCP/IP协议栈重装步骤: 1.删除注册表键值 把这两个删除 。 |
|