[普通]DHCP协议详解

作者(passion) 阅读(1122次) 评论(0) 分类( c++)

---------------------------------------------写在前面的废话--------------------------------------------
本文绝大部分内容翻译自rfc 2131,部分内容参考了华为dhcp技术白皮书,并抓包分析了诸多细节。
文中有翻译不准确或是理解有误的地方欢迎指正,拍砖。
CU用户名即是我的QQ号,欢迎交流讨论。

-------------------------------------------------基本概念-------------------------------------------- 
DHCP是Dynamic Host Configuration Protocol的缩写,它的前身是BOOTP,DHCP可以说是BOOTP的增强版本,它分为两个部分:一个是server端,而另一个是client端。它允许主机在连接internet时自动的从server端获取ip地址,路由,子网掩码,dns服务器等信息。
像rfc一样,文章开头我们先介绍一些名词的定义。
        1. DHCP client
DHCP client 指的是一台能利用DHCP协议去获取像ip地址,子网掩码等配置参数的internet主机。
        2. DHCP server
DHCP server指的是一台能提供给DHCP clinet配置参数的internet 主机.
        3. BOOTP relay agent
BOOTP  中继代理或者中继代理是一个在DHCP server和DHCP client之间传递DHCP messages的internet主机或router。DHCP 协议中定义的中继代理的行为和BOOTP 协议中定义的一样,未做改变.

-------------------------------------------------报文格式--------------------------------------------
DHCP 报文利用 UDP协议传输,server监听67端口,client监听68端口。报文格式如下图(摘自rfc2131):

顺便附上wireshark抓的包,这个是client发的discover类型的包,关于包的类型,后面会有介绍。

op :    message type,占1个字节,只能取值1和2,1 = BOOTPREQUEST,2 = BOOTPREPLY.
htype:    Hardware address type。硬件类型代码,占1个字节,1 = 10mb ethernet,即千兆以太网。
hlen:    Hardware address length。硬件地址长度,占1个字节,当htype为1时,值为6。
hops:    跳数。占1个字节,dhcp跨网段使用时由relay agent使用。dhcp client发出的包此字段清零。
xid:    transaction id,占4个字节,值为dhcp client发送数据包时填充的一个随机数,用来在client和server之间表示一组request和reply。
secs:    秒数,占2个字节,由客户端填充,表示从客户端开始请求分配ip或请求更新ip租期所经历的时间。
flags:    标志字段,占2个字节,目前只使用左边最高位的bit,其他bit必须有client发包时清零,并且server必须忽略除了最高位的其他位。被client用来表示自己想从server或是reply agent那里得到的回复是unicast类型还是broadcast类型。
ciaddr:    client的ip address,占4个字节,只有在client拥有ip,能够响应arp请求时,并且client端处于BOUND,RENEW 或者 REBINDING 状态时才会被client填充
yiaddr:    dhcp server分配给client的ip地址。占4个字节。
siaddr:    dhcp流程的下一个服务器地址,占4个字节,由dhcp server在DHCPOFFER 和 DHCPACK保证返回。一个使用的例子是:无盘中,客户机获得ip后,通常需要去ftp服务器下载启动镜像,ftp服务器的的ip地址就是在此处保存的。
giaddr:    dhcp中继的地址,占4个字节,当跨网端使用dhcp时,该字段由第一个relay agent填充,并且每一个agent都将hops加一,通常hops值有一个限制,超过此限制后,该dhcp包将被丢弃。
chaddr:    client的硬件地址。占16个字节。
sname:    可选的dhcp server的hostname。占64个字节,是一个以null结尾的字符串。
file:    启动文件名,占128个字节,是一个以null结尾的字符串。当主机从网络启动时会使用。
options:    可选的参数列表。长度不固定。后面会有介绍。
rfc 1533 列出了一个完整的option 类型集合。在这些option中,有一个特殊的option----"DHCP message type" option 必须被包含在每一个DHCP报文中,用于指定每个报文的报文类型。

-------------------------------------------------报文种类--------------------------------------------
DHCPDISCOVER:    dhcp client 获取ip时,向本地网络广播此类型的包。
DHCPOFFER:     dhcp server 回复dhcp client 发出的 DHCPDISCOVER,DHCPOFFER包里包含了dhcp server 将要提供给client的一些配置参数。
DHCPREQUEST:    dhcp client 在以下情况下发送给dhcp server的包:(a) client请求一个特定的server发送的DHCPOFFER中提供的配置信息,同时暗示的拒绝其他所有server的DHCPOFFER。(b) client在某些时候确认之前分配给自己的配置信息的正确性,比如client操作系统重启后,短暂的线路物理故障后。(c) client 延续他已经获得的明确的ip address的租期。  
DHCPACK:    dhcp server 回复 dhcp client发送的DHCPREQUEST包或者DHCPINFORM包,里面包含了server分配给client的配置信息。
DHCPNAK:    dhcp server  告诉 dhcp client他所请求的配置信息是不正确或不合法的。或者告诉client他的ip 租约已经过期。
DHCPDECLINE:    dhcp client 通知 dhcp server他所分配给自己的network address 已经有其他机子在使用了。
DHCPRELEASE:    dhcp client 发送给 dhcp server,用以归还server分配给自己的ip,并取消已经有的租约。
DHCPINFORM:    已经从dhcp server获得ip等配置信息的dhcp client需要获取更为详细的配置信息时,向server发送此类型的报文,server将根据租约进行查找,找到相应的配置信息后,发送DHCPACK报文给client。

-------------------------------------------------server 和 client的交互模式--------------------------------------------
server和client的交互模式一开始分配网络地址。
当client第一次上网时,会向server请求一个网络地址,这时的交互模式就是这种模式,步骤、流程如下所示:

client 发送DHCPDISCOVER: client广播一个DHCPDISCOVER类型的数据包到本地子网。这个包可能包含了client暗示给服务器自己想要的网络地址和租约时间。relay agent能将这个报文转发到和client不同的子网.之后client便等候server发来的DHCPOFFER数据包,如果直到超时client还没有收到server发来的DHCPOFFER数据包,client会重新发送DHCPDISCOVER类型数据包。
这个类型的DHCP message 链路层是广播的,网络层也是广播的。wireshark的抓包显示如下:

server 发送DHCPOFFER:  每一个server都会通过广播回复client一个包含了server将要分配给该client的地址信息和其他配置信息的DHCPOFFER报文。这个数据包的src ip是server的ip地址,并且server在这个message的option的DHCP Server Identifier字段记录了自己的ip地址作为身份标识.在需要的时候,报文的yiaddr字段的值就是将要分配给client的网络地址。relay agent会转发这个报文.DHCP协议能有效的工作以防止server在重叠的时间段把同一个网络地址分配给两个不同的client.
这个类型的DHCP messages链路层是广播的,网络层也是广播的。wireshark抓包显示如下:

client 发送DHCPREQUEST:  client可能会接收到来自同一个server的一个或多个DHCPOFFER报文,也可能接收到来自多个主机的多个DHCPOFFER报文,client也可以选择去等待多个DHCPOFFER的到来。client会依据DHCPOFFER中提供的配置信息选择一个server,向其广播发送类型为DHCPREQUEST的数据包,并在DHCP Server Identifier选项字段表示一个server,以此来告诉该server被选中,同时暗示拒绝其他server。并且client的request数据包的requested ip address 选项字段必须设置为server在DHCPOFFER报文中yiaddr字段的值。
这个类型的DHCP messages链路层是广播的,网络层也是广播的。wireshark抓包显示如下:

server 发送DHCPACK: 已经发送过DHCPOFFER的server接收到广播的DHCPQEQUEST后,检测DHCP Server Identifier选项的值是不是自己,如果不是,那就表示该client没有选择自己。如果DHCP Server Identifier选项的值是自己,那就说明自己被该client选中。然后检查client所请求的配置信息是否合法,合法就发送DHCPACK报文给client。
这个类型的DHCP messages链路层是广播的,网络层也是广播的,wireshark抓包显示如下:

client收到DHCPACK之后,首先通过arp协议查看是否已经有人在使用这个ip,如果有,就发送DHCPDECLINE类型的数据包给server,然后重新启动上述流程。如果没有,client就使用这个配置信息。通常在这个时候,client还会发送单播的DHCPINFORM来向server获取这个配置的详细信息。wireshark抓包显示DHCPINFORM类型的包的信息如下:

在地址使用的过程中,client可以选择给server发送一个类型为DHCPRELEASE的message去让出(relinquish)这个地址的使用权。该类型的报文细节如下:

这中交互模式可以用下面的图来表示,下图摘选自rfc 2131.


server和client的交互模式二client 请求重新使用之前已经分配给他的ip地址。
当已经从server获得过ip等配置信息的client 在重启后,或是短暂的线路物理故障后(可用插拔往下来模拟),client和server之间的交互模式就属于这种。

client 发送DHCPREQUEST: client  广播发送DHCPREQUEST message 到其本地子网,这个message在Requested Ip address 选项字段包含了自己的网络地址。下面是这种类型的数据包的详细结构,注意此处的DHCPREQUEST包和上面的交互模式中该类型的包格式有细微区别,此处没有DHCP Server Identifier字段:

server 回复DHCPACK或DHCPNACK:清楚该client配置信息的server 接收到这个类型的报文后,会发送DHCPACK报文给这个client。(Servers with knowledge of the client’s configuration parameters respond with a DHCPACK message to the client.)。如果server发现client所请求的信息是非法的,比如该client已经被移动到另一个子网内。server就会发送给该client一个DHCPNACK报文,这个client就会重新按照本文所描述的交互一的方式请求配置。
注:client接收到server的DHCPACK报文后,检查本地子网是否已经有其他人在使用这个ip,那么就会给server发送DHCPDECLINE message给server。然后启动本文所描述的模式一重新获取配置.

这种交互模式可以用下图来表示,下图同样摘自rfc 2131.

-------------------------------------------The behavior of DHCP server and client--------------------------------------------

« 上一篇:wifi共享上网(至尊版wifi)
« 下一篇:ASP.NET附加数据库文件的方式,如何发布到IIS7而不导致SQLServer出错
在这里写下您精彩的评论
  • 微信

  • QQ

  • 支付宝

返回首页
返回首页 img
返回顶部~
返回顶部 img