udhcp详解(七)——udhcp报文

   udhcp中,由serverpacket.c完成了服务器报文的发送,而clientpacket则完成了客户端报文的发送。它们最终调用的都是packet.c中的接口完成报文向网络中的发送。

struct dhcpMessage {
	u_int8_t op;
	u_int8_t htype;
	u_int8_t hlen;
	u_int8_t hops;
	u_int32_t xid;/*DHCPREQUEST 时产生的数据,以作为DHCPREPLY的数据*/
	u_int16_t secs;/*client端启动时间*/
	u_int16_t flags;
	u_int32_t ciaddr;/*要是client想继续使用之前取得地址,则列于这里*/
	u_int32_t yiaddr;/*在DHCPOFFER和DHCPACK中,这里表示client的ip地址*/
	u_int32_t siaddr;/*用于网络开机*/
	u_int32_t giaddr;/*跨网络的dhcp发放时,这里用来保存relayagent地址*/
	u_int8_t chaddr[16];/*client硬件地址*/
	u_int8_t sname[64];/*server之名称字窜*/
	u_int8_t file[128];
	u_int32_t cookie;
	u_int8_t options[308]; /* 312 - cookie */ 
};

packet.c里面定义了报文dhcp报文的格式,这个格式大部分和rfc2131中所定义的一致,其中rfc2131规定了报文最小长度为312字节,故这里udhcp所使用的是最小的报文格式。

 

值得注意的是packet.c中定义了两种发送报文的方式:raw_packet和kernel_packet。

intraw_packet(struct dhcpMessage *payload, u_int32_t source_ip, int source_port,

                      u_int32_t dest_ip, int dest_port, unsignedchar *dest_arp, int ifindex)

这个函数主要是在不知道客户端IP地址的情况下,凭借mac地址将dhcp报文从ifindex接口单播给客户端。

intkernel_packet(struct dhcpMessage *payload, u_int32_t source_ip, intsource_port,

                      u_int32_t dest_ip, int dest_port)

该函数则是使用ip地址发送报文,通常用于客户端向服务器发送的比如dhcprequest、dhcpinform报文。

当然packet.c函数也包括了报文头的封装和报文的读取和校验和工作。

 

serverpacket.c和clientpacket.c函数一看即明白就不细述了。

本人享有博客文章的版权,转载请标明出处http://blog.csdn.net/baidu20008


你可能感兴趣的:(udhcp详解(七)——udhcp报文)