0.0.0.0, 127.0.0.1, 127.0.0.2, 本机IP四者区别:
环回的特征是数据包不经过IP层以下的协议栈,直接被拷贝到环回地址socket的缓冲区中
首先假设本机有多个网卡:eth0 :192.168.0.1 eth1:192.168.1.1 lo: 127.0.0.1
1. 监听0.0.0.0创建Socket,那么无论使用127.0.0.1或127.0.0.2或本机ip都可以建立tcp连接,也就是不论通过127.0.0.1或127.0.0.2或192.168.0.1、192.168.1.1都能连接成功。
0.0.0.0建立tcp连接的时候也可以通过绑定IP_ADDR_ANY来实现。
2. 但是监听127.0.0.1,创建Socket,那么用本机地址或127.0.0.2建立tcp连接不成功,反过来也是如此;也就是,监听时采用的地址为192.168.0.1,就只能用192.168.0.1进行连接。IP层会过滤掉不同的IP。
3. 监听localhost? localhost是个域名,性质跟 “www.baidu.com” 差不多。不能直接绑定套接字,必须先gethostbyname转成IP才能绑定
那么问题来了,还回地址必须是127.0.0.1么?
答案:不是必须!IPv4 的环回地址是保留地址之一 127.0.0.1。尽管只使用 127.0.0.1 这一个地址,但地址 127.0.0.0 到 127.255.255.255 均予以保留。此地址块中的任何地址都将环回到本地主机中。此地址块中的任何地址都绝不会出现在任何网络中。
可以做一个简单的测试,用ssh root@127.2.3.4 然后登录看看是不是还是本机?不用修改ip,随意一个此范围内长度ip地址均可以ping通,并且通过ssh登录到本机。
如下图,lo地址为127.0.0.1,netmask为255.0.0.0,所有与netmask掩码运算的结果 = inet & netmask都被视为环回地址。
环回的特征是数据包不经过IP层以下的协议栈,直接被拷贝到环回地址socket的缓冲区中
ip输出函数先检查地址是不是环回地址
1.如果是环回地址 直接交给环回驱动程序处理 返回ip输入函数
2.如果不是环回地址 检查是不是广播或者多播地址。如果是广播地址或者组播地址数据报复制一份传给环回接口。然后在送到以太网上,因为广播和多播包含主机本身
3.如果不是广播或者多播地址 再检查是不是本机地址 如果是本机地址 则交给环回驱动程序处理,环回驱动程序返回给ip输入函数
从上面可以看出 ping127.0.0.1 数据包是不经过网卡的, ping本机则是需要经过网卡的
所以,
1.ping 127.0.0.1是检查TCP/IP协议栈是否正常。
2.ping 本地IP 是检查你网卡、配置是否正常。