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


DHCPACK:DHCP服务器此时再回复你一个ACK , 意思是"ok的" 。 你就正式获得这个IP在一段时间(比如24小时)里的使用权了 。 后续只要IP租约不过期 , 就可以一直用这个IP进行通信了 。
到这里 , 问题来了为什么要有第三和第四阶段
大家有没有发现 , 在Offer阶段 , 其实你的机子就已经拿到了IP了 , 为什么还要有后面的Request和ACK呢?是不是有些多此一举?
这是因为本地网段内 , 可能有不止一台DHCP服务器 , 在你广播之后 , 每个DHCP服务器都有可能给你发Offer 。
本着先到先得的原则 , 你的机子一般会对第一个到的Offer响应DHCPRequest , 目的是为了确认offer , 在你确认Offer这段时间内 , DHCP服务器确认这个IP还没被分出去 , 你才可以安心使用这个IP 。
像不像你找工作的过程?
你海投简历(DHCPDiscover) , 然后拿到了多个offer(DHCPOffer) 。
这时候事情还没完 , 你一般会跟HR说:"你给我两天时间 , 我要跟家里人商量下" 。
HR也会对你说:"那你尽快确认 , 我这边还有不少候选人等着" 。
之后你考虑下来觉得不错 , 跟HR说要接这个Offer(DHCPRequest) , HR看了下这个岗位还在 , 才能确认让你第二天来上班(DHCPACK) 。 如果这个公司的岗位已经招到其他候选人了 , 第四阶段的消息就会改为发DHCPNAK , 意思是拒绝了你的接Offer请求 。 DHCP抓包
光看原理是有些枯燥 , 我们可以尝试下抓包看下数据 。
在命令行里执行下面的命令 , 可以强行让电脑的en0网卡重新走一遍DHCP流程 。 sudoipconfigseten0DHCP
en0可以替换成其他网卡 , 比如eth0啥的 。
这时候就可以抓到相关的数据包 。
今天这篇文章|刚插上网线,电脑怎么知道自己的ip是什么
文章图片
我们可以看到蓝色的四个数据包 , 分别对应上面提到的四个DHCP阶段 。
其中第二阶段中的DHCPOffer里会返回给我们需要的IP、子网掩码、路由器地址以及DNS服务器地址 。
今天这篇文章|刚插上网线,电脑怎么知道自己的ip是什么
文章图片
offer阶段
另外 , 通过抓包 , 我们可以发现DHCP是应用层的协议 , 基于传输层UDP协议进行数据传输 。
今天这篇文章|刚插上网线,电脑怎么知道自己的ip是什么
文章图片
那么问题又来了 。 为什么DHCP用UDP , 能不能改用TCP?
按道理说 , UDP能做到的 , TCP一般也能做到 。 但这次真不行 。
主要原因还是因为TCP是面向连接的 , 而UDP是无连接的 。
所谓"连接" , 他就只有一个发送端和一个接收端 , 就跟水管一样 。
而DHCP由于一开始并不知道要跟谁建立连接 , 所以只能通过广播的形式发送消息 , 注意 , 小细节 , 广播 。
今天这篇文章|刚插上网线,电脑怎么知道自己的ip是什么
文章图片
广播寻找DHCP服务器.drawio
同样是在本地网段内发广播消息 , UDP只需要发给255.255.255.255 。 它实际上并不是值某个具体的机器 , 而是一个特殊地址 , 这个地址有特殊含义 , 只要设了这个目的地址 , 就会在一定本地网段内进行广播 。
而TCP却不同 , 它需要先建立连接 , 但实际上255.255.255.255对应的机器并不存在 , 因此也不能建立连接 。 如果同样要做到广播的效果 , 就需要先得到本地网段内所有机器的IP , 然后挨个建立连接 , 再挨个发消息 。 这就很低效了 。
因此DHCP选择了UDP , 而不是TCP 。 为什么第二阶段不是广播 , 而是单播 。
今天这篇文章|刚插上网线,电脑怎么知道自己的ip是什么
文章图片