DHCP报文分析及C/C++代码实现

动态主机配置协议 (DHCP) 是一种客户端/服务器协议,可自动向 Internet 协议 (IP) 主机提供其 IP 地址和其他相关配置信息,IP地址分配只是DHCP的基本功能。服务器使用UDP端口67,客户端使用UDP端口68。DHCP还能够为客户端配置多种TCP/IP相关设置参数,主要包括子网掩码、默认网关、DNSA服务器、域名等。

RFC 2131 和 2132 将 DHCP 定义为基于引导协议 (BOOTP) 的 Internet 工程任务组 (IETF) 标准,该协议与 DHCP 共享许多实施细节。 DHCP 允许主机从 DHCP 服务器获取所需的 TCP/IP 配置信息。

本篇主要对DHCP报文格式进行分析及协议解析。

为什么要使用 DHCP?

基于 TCP/IP 的网络上的每个设备都必须具有唯一的单播 IP 地址才能访问网络及其资源。 如果没有 DHCP,新计算机或从一个子网移动到另一个子网的计算机的 IP 地址必须手动配置; 从网络中删除的计算机的 IP 地址必须手动回收。

使用 DHCP,这整个过程是自动化和集中管理的。 DHCP 服务器维护一个 IP 地址池,并在网络上启动时将地址租给任何启用 DHCP 的客户端。 因为 IP 地址是动态的而不是静态的,不再使用的地址会自动返回到池中进行重新分配。

DHCP报文分析

DHCP客户端与服务器位于应用层,他们之间的传输的数据单位称为DHCP报文。DHCP报文封装在UDP数据报,然后封装在IP数据报中,最后封装成数据链路层中的帧。

在这里插入图片描述
DHCP报文格式:
在这里插入图片描述

  • 操作码(op):
    这个字段占1字节(8位),指明该报文类型,又称报文类型。值0x01表示DHCP请求,0x02表示DHCP应答。请求或应答类型的细节报文类型定义在DHCP选项字段中。

  • 硬件类型(htype):
    这个字段占1字节(8位),用于标识硬件地址类型,值与ARP报文硬件地址类型相同。

  • 硬件地址长度(hlen):
    这个字段占1字节(8位),用于指示硬件地址长度,以字节为单位,例如,以太网的硬件地址长度为6字节,ATM的值为16.

  • 跳数(hops):
    这个字段占1字节(8位),定义DHCP报文可以的最大次数。客户端将该字段设置为0,表示可以被中继代理使用,它们协助客户端获取IP地址或配置信息。

  • 事务ID(xid):
    这个字段占4字节(32位),包含了一个由客户端选择的随机数,用于匹配客户端与服务器之间的请求和应答,服务器在应答中返回同样的值。

  • 秒数(secs)
    这个字段占2字节(16位),指明从客户端开始请求新地址或从现有地址更新以来已经过去的时间。

  • 标志(Flags)
    这个字段占2字节(16位),目前只有第一位作为广播位被使用,其他位全部设置为0.当第一位设置为1时,客户端只接受服务器的广播应答,丢弃来自服务器的单播应答。

  • 客户端IP地址(ciaddr):
    这个字段占4个字节,当客户端首次引导时值为0.0.0.0;客户端位于绑定、更新和重新绑定状态,并且能够响应ARP请求时,将已分配的IP地址填充到这个字段中。

  • 你的IP地址(yiaddr):
    这个字段占4个字节,包含了DHCP服务器拟提供给客户端的IP地址。只有DHCP服务器应客户端请求在应答中能够填充这个字段。

  • 服务器IP地址(siaddr):
    这个字段占4个字节,包含了引导过程中使用的DHCP服务器的IP地址。如果使用BOOTP,引导程序所在的服务器IP地址将在应答报文中填入此字段。

  • 网关IP地址(giaddr):
    这个字段占4个字节,如果跨网使用DHCP中继代理。此字段包含DHCP中继代理的IP地址,否则,该字段值为0.

客户端硬件地址(chaddr):
这个字段占16个字节,包含客户端的硬件地址。

  • 服务器主机名称(sname):

这个字段占64个字节,是可选字段,由服务器在应答报文填入服务器主机名称,包含空字符结尾字符串。

  • 引导文件名(file):

这个字段占128个字节,它包含空字符结尾的字符串,其中包括引导文件的全路径名。客户端可以使用这个路径读取其他的引导信息。

  • 选项(options)
    这个字段提供DHCP选项参数,在应答报文中为携带更多的附加信息。该字段长度可变,最多达312字节。

Wireshark分析DHCP报文格式

这里使用Wireshark抓取一个DHCP客户端与服务器交互过程的数据报文,展开其中一个DHCP报文。

在这里插入图片描述

可对照前述说明的字段分析验证。由于DHCP以BOOTP为基础,Wireshark在解码窗口中依然使用 Bootstrap Protocol来表示DHCP协议,在封装UDP数据报中使用 Bootpc和Bootps分别表示DHCP客户端和服务器。

封装的UDP首部包含了源端口68和目的端口67.DHCP报文类型值为1,指明是请求报文。

DHCP选项分析

除了为DHCP客户端动态分配IP地址外,还可通过DHCP选项为客户端提供更多的TCP/IP参数,如默认开关、DNS服务器。DHCP报文中的选项字段提供一些附加信息,用于扩展包含在DHCP报文中的数据。

完整的DHCP选项,可以参考这个地址:http://www.iana.org/assignments/bootp-dhcp-parameters在这里插入图片描述
数字长度以字节为长度,N表示可变长度。

DHCP选项53(DHCP报文类型)

各种DHCP请求和应答报文具体类型定义在DHCP选项53中,这个选项必须在每个DHCP数据包中存在。该选项标记为53,数据长度为1字节。RFC2131规定了常见的8种报文类型。

在这里插入图片描述
在这里插入图片描述

将DHCP选项展开进一步解码分析各选项的详细内容。其中option给出选项的标记和名称,length给出选项值的长度,value给出具体选项值。

DHCP报文分析协议解析

int main(int argc, char* argv[])
{
    char errbuf[1024];
    pcap_t *desc = 0;

    char *filename = argv[1];
    if (argc != 2)
    {
        printf("usage: ./dissect_dhcp [pcap file]\n");
        return -1;
    }

    printf("ProcessFile: process file: %s\n", filename);
    if ((desc = pcap_open_offline(filename, errbuf)) == NULL)
    {   
        printf("pcap_open_offline: %s error!\n", filename);
        return -1; 
    }   

    //pcap_buff2user_loop(desc, 0, (pcap_handler)pcap_hand, 0);
    pcap_loop(desc, pkt_number, (pcap_handler)ace_pcap_hand, NULL);
    pcap_close(desc);
    return 0;
}

编译运行:

在这里插入图片描述

在这里插入图片描述

DHCP 提供以下好处

可靠的IP地址配置。 DHCP 最大限度地减少了由手动 IP 地址配置引起的配置错误,例如印刷错误,或同时将一个 IP 地址分配给多台计算机引起的地址冲突。

减少网络管理。 DHCP 包括以下功能以减少网络管理:

1、集中和自动化的 TCP/IP 配置。
2、从中心位置定义 TCP/IP 配置的能力。
3、能够通过 DHCP 选项分配完整范围的附加TCP/IP 配置值。
4、有效处理必须频繁更新的客户端的 IP 地址更改,例如移动到无线网络上不同位置的便携式设备的 IP 地址更改。
5、使用 DHCP 中继代理转发初始 DHCP 消息,从而无需在每个子网上都安装 DHCP 服务器。

使用 DHCP 的缺点是:

可能会发生 IP 冲突 。

总结

许多具有网络功能的新设备不断连接到现有网络。因此,在主要由动态主机配置协议 (DHCP) 提供的大型网络中,需要一种自动和动态的方法来为这些新节点提供关键网络设置。

欢迎关注微信公众号【程序猿编码】,需要DHCP完整源码报文请添加本人微信号(c17865354792)

参考:RFC2131、RFC1497、RFC2939

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值