刚插上网线,电脑怎么知道自己的IP?( 二 )


en0可以替换成其他网卡,比如eth0啥的 。
这时候就可以抓到相关的数据包 。

刚插上网线,电脑怎么知道自己的IP?

文章插图
我们可以看到蓝色的四个数据包,分别对应上面提到的四个DHCP阶段 。
其中第二阶段中的DHCP Offer里会返回给我们需要的IP、子网掩码、路由器地址以及DNS服务器地址 。
刚插上网线,电脑怎么知道自己的IP?

文章插图
另外,通过抓包,我们可以发现DHCP是应用层的协议,基于传输层UDP协议进行数据传输 。
刚插上网线,电脑怎么知道自己的IP?

文章插图
那么问题又来了 。
为什么DHCP用UDP,能不能改用TCP?
按道理说,UDP能做到的,TCP一般也能做到 。但这次真不行 。
主要原因还是因为TCP是面向连接的,而UDP是无连接的 。
所谓"连接",他就只有一个发送端和一个接收端,就跟水管一样 。
而DHCP由于一开始并不知道要跟谁建立连接,所以只能通过广播的形式发送消息,注意,小细节,广播 。
刚插上网线,电脑怎么知道自己的IP?

文章插图
同样是在本地网段内发广播消息,UDP只需要发给255.255.255.255 。它实际上并不是值某个具体的机器,而是一个特殊地址,这个地址有特殊含义,只要设了这个目的地址,就会在一定本地网段内进行广播 。
而TCP却不同,它需要先建立连接,但实际上255.255.255.255对应的机器并不存在,因此也不能建立连接 。如果同样要做到广播的效果,就需要先得到本地网段内所有机器的IP,然后挨个建立连接,再挨个发消息 。这就很低效了 。
因此DHCP选择了UDP,而不是TCP 。
为什么第二阶段不是广播,而是单播 。
刚插上网线,电脑怎么知道自己的IP?

文章插图
另外一个小细节不知道大家注意到没,上面在提到 DHCP Offer 阶段时,提到的是DHCP服务器会使用广播的形式回复 。但抓个包下来却发现并不是广播,而是单播 。
其实,这是DHCP协议的一个小优化 。原则上大家在DHCP offer阶段,都用广播,那肯定是最稳的,目标机器收到后自然就会进入第三阶段DHCP。而非目标机器,收到后解包后发现目的机器的mac地址跟自己的不同,也会丢掉这个包 。
但是问题就出在,这个非目的机器需要每次都在网卡收到包,并解完包,才发现原来这不是给它的消息,这 。。。真,有被打扰到 。
如果本地网段内这样的包满天飞,也浪费机器性能 。
如果能用单播,那当然是最好的 。但这时候目的机器其实并没有IP地址,有些系统在这种情况下能收单播包,有些则认为不能收,这个跟系统的实现有关 。因此,对于能收单播包的系统,会在发DHCP 阶段设一个flag = 0 () 的标志位,告诉服务器,支持单播回复,于是服务器就会在DHCP Offer阶段以单播的形式进行回复 。
刚插上网线,电脑怎么知道自己的IP?

文章插图
是不是每次联网都要经历DHCP四个阶段?
只要想联网,就需要IP,要用IP,就得走DHCP协议去分配 。
但大家也发现了,DHCP第一阶段和第二阶段都可能会发广播消息 。对于家用电脑还好,插个网线,之后就雷打不动 。但像手机这样的移动设备,是要带着到处跑的,坐个地铁,进个电梯,公司里到处走走,都可能会涉及到网络切换 。
这每次都要来一个完整的四阶段,各种广播消息满天飞,其实对网络环境不太友好 。
于是问题叒来了,是不是每次联网都要经历DHCP四个阶段?