首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

DHCP offer 报文到底是单播还是广播?

斜体部分为读者提问:

client 广播 discover ,DHCP服务器收到后发送 offer 报文,这时候 client 还没有 IP 地址,按理说 offer 应该是广播。TCP/IP 详解一的示例截图里,offer 报文的目标IP 也是 255.255.255.255。

可是我自己抓包发现,offer 报文的目标 IP 不是255.255.255.255,变成了单播?另外如果是单播,目的 IP 填将要分配的 10.0.0.51,但是DHCP 服务器上的 ARP 缓存上没有 (10.0.0.51 - 我的 Mac 地址)的条目,发送了一条 ARP 请求,可是得不到回应,但是如何得到我的 Mac 地址的呢?

正文

DHCP在设计之初,充分考虑到TCP/IP协议实现的多样性,具体和DHCP有关的多样性体现在:TCP/IP协议栈没有完成IP地址配置前,是否可以接受单播(Unicast)报文?

有些IP协议栈在完成IP地址的配置前,可以接收Destination IP = Any的IP报文,只要该IP报文能够被硬件网卡接收并过滤给IP协议栈。

而有些IP协议栈在完成IP地址的配置前,是不会接收任何单播IP报文的,只会接收广播IP报文,即Destination IP = 255.255.255.255。

无论是哪种IP协议栈,都是可以接收广播报文的,对吗?

DHCP为了增强协议的健壮性(Robustness),是这样规定的:

如果协议栈在初始化时,不接收单播IP报文,请在DHCP Discovery / Request报文的Flags里明确告知服务器,通过设置“BROADCAST flag = 1”,那么服务器就使用广播来和客户端通信。

如果协议栈在初始化时,可以接收单播IP报文,请在DHCP Discovery / Request报文的Flags里明确告知服务器,通过设置“BROADCAST flag = 0”,那么服务器就使用单播来和客户端通信。

既然广播方式通信适合所有的协议栈,统统使用广播不就ok了,为何要有这个Flags,岂不是多此一举?

单播最大的优点:通信是点对点方式,不会影响到广播域的其它主机。

广播的特点:通信是点对所有点的方式,会影响到广播域里其它所有主机。

同学们可能没有充分理解这里的“影响”二字。

当主机收到广播报文时,网卡会产生一次硬件中断CPU,CPU会暂停手头的工作来处理这个中断,处理完中断,CPU继续工作。IP协议栈取走数据,一检查和自己无关,丢了。废了那么多功夫,最后的报文和自己无关,这不是资源浪费吗?

如果广播域里的广播报文满天飞,主机们会疲于处理无关的广播报文,不仅浪费网络资源,同时也浪费主机的CPU资源。所以在协议的设计中,要尽可能地避免使用广播。

解释完为单播和广播,现在来回答这个问题。

问题一:DHCP Offer为何是单播?

题主的DHCP Discovery里设置了“BROADCAST flag = 0”,所以DHCP服务器使用单播来发送自己的回应报文,即DHCP Offer报文,避免打扰其它主机。

问题二:服务器是通过ARP请求得到客户端的MAC地址的吗?

不是,此时客户端还没有获得任何IP地址,客户端如何回应ARP呢?这点从图中可以清晰看出,ARP请求没有获得回应。

是通过下图中DHCP协议字段“chaddr”获得的,chaddr“Client Hardware Address”缩写,客户端硬件地址,由客户端填入,通常为网卡的MAC地址,这里chaddr = 7c:04:d0:d6:c6:54

服务器端给客户端分配的IP地址则填充在“yiaddr”(Your IP Address),这里yiaddr = 10.0.0.51。

DHCP服务器有了客户端的IP、MAC地址,就可以完成整个IP报文的封装,将DHCP Offer发给客户端了。客户端接收一点问题没有,在四次消息交互之后,最终完成IP协议栈的配置工作。

题主的捕获截图对于充分理解DHCP工作过程非常有帮助,再分析一下。

序号7、21间隔2秒产生了2个offer报文的原因是,第一个offer报文可能丢失,2秒之后重传。

序号23报文是ARP广播请求客户端的MAC地址,此时offer报文已经抵达服务器,大约500毫秒没有等来回应,服务器决定使用chaddr = 7c:04:d0:d6:c6:54来填充二层目的MAC。

完成四次消息交互,序号26(offer)、27(request)、28(ack)。

问题来了,客户端收到ACK,IP地址就可以配置到接口上去?

此时还不能,需要探测广播域上“10.0.0.51”IP地址是否已经被使用。

连续发送三个ARP请求“10.0.0.51”的MAC地址,在没有收到任何回应的情况下,客户端可以放心使用,此时完成了IP地址的配置工作。报文序号为29、30、31。

为了刷存在感,使得别的主机意识到自己的存在,该主机发送三个连续的Gratuitous ARP请求。

Gratuitous ARP

正常的ARP请求,在ARP消息体里,通常MAC地址是空的,由响应方填入自己的MAC地址。

Gratuitous ARP请求,在ARP消息体里,既有IP地址,这里为IP = 10.0.0.51,又填入了自己的MAC地址,这里为MAC =7c:04:d0:d6:c6:54。

广播域内的主机都可以接收到Gratuitous ARP(广播),提取出IP、MAC地址,并缓存在ARP Cache里,留待通信时使用。

这样做的好处是,当别的主机需要和IP = 10.0.0.51主机通信时,在ARP Cache里已经有该机的MAC地址,无需再次发送ARP请求。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180710G0X2JX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券