速读摘要文章源自JAVA秀-https://www.javaxiu.com/21733.html
这里提醒一些,这里发送的报文都是采用UDP报文,而不是TCP报文哈服务器次发送一个request报文,意在告诉它,我看中了你的报文。如果DHCP服务器收到Request报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则发送NAK报文作为回应,通知用户无法分配合适的IP地址。当用户不再需要使用分配IP地址时,就会主动向DHCP服务器发送Release报文,告知服务器用户不再需要分配IP地址,DHCP服务器会释放被绑定的租约。文章源自JAVA秀-https://www.javaxiu.com/21733.html
原文约 2447 字 | 图片 8 张 | 建议阅读 5 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/21733.html
电脑的 IP 是怎么来的呢?我又没有配置过
菜鸟要飞 文章源自JAVA秀-https://www.javaxiu.com/21733.html
以下文章来源于帅地玩编程,作者帅地文章源自JAVA秀-https://www.javaxiu.com/21733.html
文章源自JAVA秀-https://www.javaxiu.com/21733.html 文章源自JAVA秀-https://www.javaxiu.com/21733.html 帅地玩编程文章源自JAVA秀-https://www.javaxiu.com/21733.html 本号专注于讲解数据结构与算法、计算机基础(如计算机网络+操作系统+数据库+Linux)等编程知识,期待你的关注。文章源自JAVA秀-https://www.javaxiu.com/21733.html
文章源自JAVA秀-https://www.javaxiu.com/21733.html
对于我们平时上网的电脑的 ip 是如何来的呢?一种简单的方法就是我们自己来配置了文章源自JAVA秀-https://www.javaxiu.com/21733.html
文章源自JAVA秀-https://www.javaxiu.com/21733.html
显然,这里有两种配置方式,一种是自动获取 ip 地址,一种是我们手动来设置,我相信大部分人都是通过自动获取的方式来得到 ip 的,那么问题来了,它是如何自动获得到的呢?文章源自JAVA秀-https://www.javaxiu.com/21733.html
客户端请求 ip
可能很多人都知道,是通过 DHCP 服务器来获取 ip 的,那么问题来了,你要给 DHCP 服务器发报文来获取 ip,那么你知道 DHCP 服务器的 ip 是多少吗?自己客户端的源 ip 又是多少呢?现在啥也不知道,该如何发送报文呢?文章源自JAVA秀-https://www.javaxiu.com/21733.html
为了解决这个问题,客户端会发送一个广播,我们知道,广播报文是会发送局域网内的所有其他主机的,广播的目的 ip 是 255.255.255.255,目的端口是 67,为了让别人知道它是来请求一个 ip 的,我们的客户端会把 0.0.0.0 作为自己的源 ip,源端口是 68。意在告诉别人:我现在啥也没有,急需一个 ip,哪位老铁能给我提供一个 ip。文章源自JAVA秀-https://www.javaxiu.com/21733.html
文章源自JAVA秀-https://www.javaxiu.com/21733.html
我们把这个请求 ip 的报文称之为 discover 报文。文章源自JAVA秀-https://www.javaxiu.com/21733.html
这里提醒一些,这里发送的报文都是采用 UDP 报文,而不是 TCP 报文哈,下同。文章源自JAVA秀-https://www.javaxiu.com/21733.html
DHCP响应
当 DHCP 服务器收到这个报文之后,一看源地址是 0.0.0.0,就知道生意来了,知道这是一个请求 ip 的报文,DHCP 服务器就会给它提供一个 ip,包括 ip 地址,子码掩码,网关,ip 的有效期等信息。文章源自JAVA秀-https://www.javaxiu.com/21733.html
有人可能会问,只有源 ip 为 0.0.0.0 的信息,我们怎么把报文发送到它的手里呢?这不,我们每台电脑不都有 Mac 地址吗?在 discover 报文中,就会包含它的 MAC 地址了,DHCP 服务器,只需要发一个广播报文就可以了,广播报文的源ip是 DHCP 服务器自己的 ip,源端口是 67,目的地址是 255.255.255.255,目的端口是 68文章源自JAVA秀-https://www.javaxiu.com/21733.html
文章源自JAVA秀-https://www.javaxiu.com/21733.html
我们把 DHCP 提供 ip 地址的报文称之为offer报文。文章源自JAVA秀-https://www.javaxiu.com/21733.html
客户端挑选 ip 地址
我们知道,有可能不止一台 DHCP 服务器收到了 discover 请求报文,也就是说,我们的主机可能会收到多个 offer 报文,所以呢,我们的主机会选择其中一个心仪的 offer 报文来作为自己的 ip,一般是选择最先收到的 offer 报文,选择好之后,会给对应的 DHCP 服务器次发送一个 request 报文,意在告诉它,我看中了你的报文。文章源自JAVA秀-https://www.javaxiu.com/21733.html
DHCP 收到 request 报文之后,会给它回复一个 ACK 报文,并且把这个分配出去的 ip 进行登记(例如把这个 ip 标记为已使用状态)。文章源自JAVA秀-https://www.javaxiu.com/21733.html
当我们的主机收到 ACK 报文之后,就可以开始冲浪在网上冲浪了。文章源自JAVA秀-https://www.javaxiu.com/21733.html
文章源自JAVA秀-https://www.javaxiu.com/21733.html
几点说明
这里可能有人会说,如果 DHCP 服务器没有在我们所在的局域网里怎么办?这个时候,这个 discover 报文 就会通过我们的网关来进行传递,并且会把源 ip 替换成网络的 ip,源端口是 68,这里涉及到 NAT 地址到转换,不懂的可以看我之前的一篇文章。文章源自JAVA秀-https://www.javaxiu.com/21733.html
谈谈NAT:什么?全球IP和私有IP是什么鬼?文章源自JAVA秀-https://www.javaxiu.com/21733.html
DHCP 服务器收到报文之后,就可以根据源端口 68 来判断这是一个 discover 请求报文了。就会把 offer 发给网关,网关再发给我们的主机。文章源自JAVA秀-https://www.javaxiu.com/21733.html
租期
在DHCP客户端的租约时间到达 1/2 时,客户端会向为它分配 IP 地址的DHCP服务器发送 request 单播报文,以进行 IP 租约的更新。如果服务器判断客户端可以继续使用这个 IP 地址,就回复 ACK 报文,通知客户端更新租约成功。如果此IP地址不能再分配给客户端,则回复 NAK 报文,通知客户端续约失败。文章源自JAVA秀-https://www.javaxiu.com/21733.html
如果客户端在租约到达 1/2 时续约失败,客户端会在租约到 7/8 时间时,广播发送 request 报文进行续约。DHCP服务器处理同首次分配 IP 地址的流程。文章源自JAVA秀-https://www.javaxiu.com/21733.html
最后
这个过程中,涉及到听多种报文,为了篇幅不要太长,我有些报文没有详细说,这里为了方便大家查看,我把所有报文都总结了一下文章源自JAVA秀-https://www.javaxiu.com/21733.html
报文类型 | 描述 |
---|---|
Discove | DHCP客户端请求地址时,会在本地网络内以广播方式发送请求报文,这个报文成为Discover报文。 |
Offer | DHCP服务器收到Discover报文后,会构造一个Offer报文(包括各种所需要的各种),发送给用户 |
Request | DHCP客户端可能会收到很多Offer,所以必须在这些回应中选择一个。Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器,并回应一个广播Request报文,通告选择的服务器 |
ACK | DHCP服务器收到Request报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录,如果有则发送ACK报文作为回应,通知用户可以使用分配的IP地址 |
NAK | 如果DHCP服务器收到Request报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则发送NAK报文作为回应,通知用户无法分配合适的IP地址。 |
Release | 当用户不再需要使用分配IP地址时,就会主动向DHCP服务器发送Release报文,告知服务器用户不再需要分配IP地址,DHCP服务器会释放被绑定的租约。 |
Decline | DHCP客户端收到DHCP服务器回应的ACK报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则发送Decline报文,通知服务器所分配的IP地址不可用。 |
Inform | DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,服务器收到该报文后,将根据租约进行查找,找到相应的配置信息后,发送ACK报文回应DHCP客户端 |
如果大家对计算机网络这块感兴趣的话,后续会算法和计算机网络穿插讲勒。如果有哪里说错了,欢迎指点出来!文章源自JAVA秀-https://www.javaxiu.com/21733.html
文章源自JAVA秀-https://www.javaxiu.com/21733.html
说个题外话,鸟哥是个比较喜欢折腾的程序员,业余喜欢开发自己网站、小程序、App等,这些东西统统离不开服务器!最近就围绕服务器的主题创建了一个微信群,喜欢玩服务器或者想自己开发一款产品的读者可以进来,相互学习交流!群通知中给大家分享了一套搭建服务器的视频教程哦。非常适合新手学习!我也会时不时的带大家撸点和服务器相关的优惠券!不感兴趣,不喜欢折腾的就没必要凑着闹了!文章源自JAVA秀-https://www.javaxiu.com/21733.html
识别二维码,添加微信后文章源自JAVA秀-https://www.javaxiu.com/21733.html
发送【服务器】即可获取邀请链接文章源自JAVA秀-https://www.javaxiu.com/21733.html
文章源自JAVA秀-https://www.javaxiu.com/21733.html
这是我部署的机器人,请勿调戏!文章源自JAVA秀-https://www.javaxiu.com/21733.html
推荐阅读文章源自JAVA秀-https://www.javaxiu.com/21733.html
嘘!刚刚发现了一个山寨版某库....文章源自JAVA秀-https://www.javaxiu.com/21733.html
可怕!公司部署了一个东西,悄悄盯着你···文章源自JAVA秀-https://www.javaxiu.com/21733.html
发小被绿,我竭尽所学黑科技,动用云控捉奸寻找证据….文章源自JAVA秀-https://www.javaxiu.com/21733.html
终于把废旧电脑变成了服务器!差点被女票拿去换洗脸盆,真香!
文章源自JAVA秀-https://www.javaxiu.com/21733.html

评论