DHCP回应报文广播还是单播方式深度探究

对DHCP服务器回应报文的抓包实验探究
对于DHCP报文中的offer报文和ack报文,到底是以广播还是单播的方式回复给主机,一直存在争议,现做如下抓包实验,具体的来分析DHCP报文出现的“可疑点”。
一、 猜想
对于DHCP的回复报文到底是广播还是单播的方式回复,这在之前的几次用wireshark抓包实验中都得到了验证,结果是既有单播也有广播,那么我们不妨先假定DHCP的回复方式是广播。
二、 实验设计
为了验证我们的猜想,肯定需要通过抓包软件抓取实际中的DHCP报文,但是仅仅抓取一次存在偶然性,那么这里先设计抓取报文3次,因为考虑到这跟连接的网络有关系,或者说可能会受到其他因素的影响,则只在很短一段时间内连续抓取三次,报文结果如下:
DHCP回应报文广播还是单播方式深度探究_第1张图片DHCP回应报文广播还是单播方式深度探究_第2张图片
DHCP回应报文广播还是单播方式深度探究_第3张图片

这三次报文抓取是在教学楼,连接校园无线网络抓取的,三次抓取的结果都是单播的方式,但是仅仅靠这个实验数据并不能下结论验证说最开始的猜想是错误的。
因为之前的确抓取到过广播的报文,报文的格式如下:
DHCP回应报文广播还是单播方式深度探究_第4张图片
这里可以看到回应的报文是广播的方式,但是这个报文不是连接的学校网络,是连接家中的路由器。到这里不得不思考的问题是,DHCP的回应方式是跟身处的环境有关,还是跟电脑本身有关?并且控制广播还是单播到底是由什么引起的,单播和广播的回复报文包到底有什么不同?
提出上面两个问题后,打开前后抓取到的不同的数据包进行观察,结果如下:
DHCP回应报文广播还是单播方式深度探究_第5张图片
DHCP回应报文广播还是单播方式深度探究_第6张图片
这里可以很明显的观察到bootp flags字段的值不一样,由此可以基本得到结论:DHCP服务器的回应报文跟bootstrap这层中的bootp flags字段的值有关,当bootp flags为0x8000时,是广播的方式;当bootp flags为0x0000时,是单播的方式。
同时,查询了思科给予的官方解释也是如此,这个结论是完全正确的。
但是,深入思考的话,不得不想到一个问题,广播还是单播到底是由什么决定的?是访问的DHCP服务器原本就是这么设置的还是跟自身的主机有关?
首先来假设跟访问的DHCP服务器有关,可以做这样的实验,同时用多台主机同时连接教学楼的无线网络,那么可以肯定的是访问的DHCP服务器肯定是学校搭建的服务器,不间断的抓取DHCP报文,试试看到底能不能抓取到广播的报文(之前抓取到的都是单播)。
注:这里用多台电脑的原因是提高抓取到的概率。
抓取后的结果如下:

这个就是实验主机抓到的在教学楼连接校园无线网的DHCP报文,是以广播的方式发送的,那么这就已经可以说明一个问题,那就是DHCP服务器回应报文的方式与DHCP服务器本身无关。
既然排除了这个可能,再验证是不是与获取IP地址的主机有关?因为在offer报文前,主机会广播发送一个discover报文给DHCP服务器,猜想可能问题出现在这个报文中,对比一下广播报文和单播报文的区别,发现了下面的问题:
DHCP回应报文广播还是单播方式深度探究_第7张图片
DHCP回应报文广播还是单播方式深度探究_第8张图片
从中可以发现同样在Bootstrap层中的Bootp flags字段,如果为0x8000则为广播,而为0x0000则为单播。由此可以得到结论:DHC服务器回应的方式与服务器本身无关,只与主机广播发送的discover报文中Bootp flags字段的值有关,也就是说主机决定了DHCP报文回应的方式。
DHCP回应报文是广播还是单播回应?这个问题已经得到了结论,但是继续往下深想,为什么有些主机抓取的是广播有些获取到的是单播?
为了解决这个问题,我查看了RFC的文献,得到了以一段的解说:
If the ‘giaddr’ field in a DHCP message from a client is non-zero,the server sends any return messages to the ‘DHCP server’ port on the BOOTP relay agent whose address appears in ‘giaddr’. If the ‘giaddr’ field is zero and the ‘ciaddr’ field is nonzero, then the server unicasts DHCPOFFER and DHCPACK messages to the address in ‘ciaddr’.If ‘giaddr’ is zero and ‘ciaddr’ is zero, and the broadcast bit is set, then the server broadcasts DHCPOFFER and DHCPACK messages to 0xffffffff. If the broadcast bit is not set and ‘giaddr’ is zero and ‘ciaddr’ is zero, then the server unicasts DHCPOFFER and DHCPACK messages to the client’s hardware address and ‘yiaddr’ address. In all cases, when ‘giaddr’ is zero, the server broadcasts any DHCPNAK messages to 0xffffffff.
翻译:如果来自客户机的DHCP消息中的“giaddr”字段是非零的,服务器会将任何返回消息发送到BOOTP中继代理的“DHCP服务器”端口,其地址出现在“giaddr”中。如果“giaddr”字段为零,“ciaddr”字段为非零,则服务器unicast DHCPOFFER和DHCPACK消息到“ciaddr”中的地址。如果“giaddr”为零,“ciaddr”为零,广播位被设置,则服务器将DHCPOFFER和DHCPACK消息广播到0xffffffff。如果广播位没有设置,而“giaddr”为零,“ciaddr”为零,则服务器unicast DHCPOFFER和DHCPACK消息到客户机的硬件地址和“yiaddr”地址。在所有情况下,当“giaddr”为零时,服务器将任何DHCPNAK消息广播到0xffffffff。

    当DHCP client启动并进行DHCP初始化时,她会在本地网络广播配置请求。
    如果本地网络存在DHCP server,则可以直接进行DHCP配置,不需要DHCP relay。
    如果本地网络没有DHCP server,则与本地网络相连的剧透DHCP relay功能的网络设备收到该广播包后,将进行适当处理并转发给指定的气态网络上的DHCP server。
    DHCP server根据DHCP client提高的信息进行相应的配置,并通过DHCP relay将配置信息发送给DHCP client,完成对DHCP client的动态配置。
    事实上,从开始到最终完成配置,需要多次这样报文的交互过程。DHCP relay设备修改DHCP消息中的相拥字段,把DHCP的广播包改为单播包,并负责在服务器与客户机之间转换。
    研究到这里基本弄清楚了为什么会出现单播的情况,同时还是有一个疑问没有解决,那就是广播的存在。如果还是解释为,因为IP地址没有分配采用广播的转发方式,这时候显然已经说不通了。通过查阅资料发现,当主机发送discover报文不经过DHCP relay(DHCP 中继器)时,主机将报文中的Bootp flags置为0x8000还是0x0000只要是根据以下的情况:
    在没有中继的情况下,首先看ciaddr域是否为零,如果不为零,就是单播,目的地址就是该ciaddr域中的地址;如果ciaddr域为零,再看其是否设置了broadcast bit位,如果设置了,就全F地址广播,如果没有设置,就是单播,目的地址是该client的硬件地址(L2)和yiaddr域中的地址(L3)。broadcast bit位是由client端决定的。
    到这里已经很清楚的了解了DHCP的转发方式,同时也清晰的明白了DHCP的转发方式跟主机发送的discover报文有关,而这个报文中的字段又是跟DHCP的中继器和broadcast bit位有关,不得不说这次的探究实验,真正明白了计算机网络庞大的复杂性。

你可能感兴趣的:(转载记录,网络编程)