很多小伙伴遇到网络故障
或者无法连通时,
大多情况下,
我们都会一顿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.删除注册表键值
开始-运行-regedit,找到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Winsock
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Winsock2
把这两个删除 。
2.重新安装协议
本地连接-属性-安装-协议-增加-从硬盘导入-选择%Windir%\inf 文件夹(一般为 C:\Windows\inf)-选择TCP/IP协议v4 。
3.将TCP/IP协议栈恢复至初始状态
管理员权限运行 cmd, netsh int ip reset C:\resetlog.txt 。其中C:\resetlog.txt为记录日志,一定要指定。
4.重启;