今天这篇文章|刚插上网线,电脑怎么知道自己的ip是什么( 三 )


另外一个小细节不知道大家注意到没 , 上面在提到DHCPOffer阶段时 , 提到的是DHCP服务器会使用广播的形式回复 。 但抓个包下来却发现并不是广播 , 而是单播 。
其实 , 这是DHCP协议的一个小优化 。 原则上大家在DHCPoffer阶段 , 都用广播 , 那肯定是最稳的 , 目标机器收到后自然就会进入第三阶段DHCPRequest 。 而非目标机器 , 收到后解包后发现目的机器的mac地址跟自己的不同 , 也会丢掉这个包 。
但是问题就出在 , 这个非目的机器需要每次都在网卡收到包 , 并解完包 , 才发现原来这不是给它的消息 , 这 。。。 真 , 有被打扰到 。
如果本地网段内这样的包满天飞 , 也浪费机器性能 。
如果能用单播 , 那当然是最好的 。 但这时候目的机器其实并没有IP地址 , 有些系统在这种情况下能收单播包 , 有些则认为不能收 , 这个跟系统的实现有关 。 因此 , 对于能收单播包的系统 , 会在发DHCPDiscover阶段设一个Broadcastflag=0(unicast)的标志位 , 告诉服务器 , 支持单播回复 , 于是服务器就会在DHCPOffer阶段以单播的形式进行回复 。
今天这篇文章|刚插上网线,电脑怎么知道自己的ip是什么
文章图片
Discover要求使用单播回复是不是每次联网都要经历DHCP四个阶段?
只要想联网 , 就需要IP , 要用IP , 就得走DHCP协议去分配 。
但大家也发现了 , DHCP第一阶段和第二阶段都可能会发广播消息 。 对于家用电脑还好 , 插个网线 , 之后就雷打不动 。 但像手机这样的移动设备 , 是要带着到处跑的 , 坐个地铁 , 进个电梯 , 公司里到处走走 , 都可能会涉及到网络切换 。
这每次都要来一个完整的四阶段 , 各种广播消息满天飞 , 其实对网络环境不太友好 。
于是问题叒来了 , 是不是每次联网都要经历DHCP四个阶段?
当然不需要 。
我们会发现每次断开wifi再打开wifi时 , 机子会经历一个从没网到有网的过程 。
这时候去抓个包 , 会发现 。
今天这篇文章|刚插上网线,电脑怎么知道自己的ip是什么
文章图片
其实只发生了DHCP的第三和第四阶段 。 这是因为机子记录了曾经使用过192.168.31.170这个IP , 重新联网后 , 会优先再次请求这个IP , 这样就省下了第一第二阶段的广播了 。
另外需要注意的是 , 抓包图里DHCPRequest之所以出现两次 , 是因为第一次Request发出后太久没得到回应 , 因此重发 。 DHCP分配下来的IP一定不会重复吗?
一般来说DHCP服务器会在它维护的IP池里找到一个没人用的IP分配给机子 ,
这个IP如果重复分配了 , 那本地网段内就会出现两个同样的IP , 这个IP下面却对应两个不同的mac地址 。 但其他机器上的ARP缓存中却只会记录其中一条mac地址到IP的映射关系 。
于是 , 数据在传递的过程中就会出错 。
因此本地网段内IP必须唯一 。
那么DHCP分配下来的IP有没有可能跟别的IP是重复的?
都这么问了 , 那肯定是可能的 。
有两个常见的情况会出现IP重复 。
文章开头提到 , IP是可以自己手动配的 , 自己配的IP是有可能跟其他DHCP分配下来的IP是相同的 。 解决方案也很简单 , 尽量不要手动去配IP , 统一走DHCP 。 或者在DHCP服务器里维护的IP范围里 , 将这条IP剔除 。
一个本地网段内 , 是可以有多个DHCP服务器的 , 而他们维护的IP地址范围是有可能重叠的 , 于是就有可能将相同的IP给到不同的机子 。 解决方案也很简单 , 修改两台DHCP服务器的维护的IP地址范围 , 让它们不重叠就行了 。
不过吧 , 上面的解决方案 , 都需要有权限去修改DHCP服务器 。