1、简介
动态主机配置协议。TCP/IP协议想要运行正常的话,网络中的主机和路由器不可避免地需要配置一些信息(如接口的IP地址等)。有了这些配置信息主机/路由器才能提供/使用特定的网络服务。
主机信息的必要元素有:IP地址、子网掩码、DNS服务器IP地址
TCP/IP协议配置主机信息主要有三种方法:
1. 手动配置
2. 动态获取
3. 根据特定算法计算。
在网络中,我们把主机分为两大类,服务器主机和客户端主机,
+ 服务器主机: 一般采用手动配置
+ 客户端主机: 一般采用动态获取
服务器一般采用手动配置,而客户端一般动态获取。主要基于以下原因:
1. 客户主机比服务主机移动更频繁
2. 服务主机需要提供更可靠的服务,其配置信息应该减少对其他系统/主机的依赖
3. 客户主机比服务主机的数量要多得多。
4. 客户主机使用者的网络配置知识比服务主机的使用者低
DHCP有Bootp协议发展而来。Bootp协议提供了有限的主机信息配置,且主机信息已经配置就很难被修改。DHCP提供 几乎所有的主机信息的配置,且引入了租约等概念,使得主机信息能够动态发生变化。 DHCP向后兼容Bootp。DHCP基于UDP/IP传输。DHCP服务器使用端口号67,DHCP 客户端使用端口号68.
1.1、DHCP 协议内容
DHCP 主要分为两部分:地址的管理和配置信息的传递
+ 地址管理: 地址管理处理IP地址的动态分配、向客户端提供地址租约 。并使用key-value的格式保存IP地址与mac地址
+ 配置信息的传递: 包含DHCP报文格式、状态机
1.2、DHCP 地址管理
地址池与地址租约:
在IP地址的动态分配中,DHCP客户端向DHCP服务器发送IP地址请求。DHCP服务器会维护一个 IP地址池,DHCP从地址池从取出一个IP回应给DHCP客户端。在地址分配时,DHCP服务器也会指定回应给DHCP客户端的IP地址的租约期,该地址只有在该租约期内可用,不过DHCP客户端可用在租约期内请求延长租约(更新租约期)。
2、DHCP报文
2.1、DHCP 报文格式


Op: 报文类型,分为 两大类: Request(1) 和 Reply(2)
HW Type: 硬件类型,一般是以太网:1
HW Len: 硬件地址长度,单位字节。对应以太网:6(mac地址长度为6字节48bit)
hops:client设置为0,当通过relay agent时,relay agent可以考虑使用该值
Transaction ID(Xid):事务ID,随机数,有客户端生成,服务器Reply时,会把Request中的Transaction拷贝到Reply报文中。
Secs: 距离第一次发送IP请求或Renew请求过去的秒数
Flags:标志位,目前仅第一个bit有使用,置1 标明广播

Client IP Address(ciaddr):当前客户端的IP地址,如果当前客户端没有IP地址,则置0 。如果client处于BOUND,RENEW,REBINDING状态时添加
Your IP Address(yiaddr): 服务器想客户端提供IP地址时,会把IP地址填入本字段
Server IP Address(siaddr):客户端引导时需要的另一个服务器的IP地址
Gateway (Relay) IP Address(giaddr): 网关(中继)IP地址,有DHCP 中继器在转发DHCP报文的时候填入
Server Name(sname): Server名字,有64bytes,一般不使用,填充为0
Boot File name(file): boot file的路径,128bytes, 一般不使用,填充为0
Option: 选项,不定长度。 DHCP报文中比较重要的字段,后面会有比较详细的介绍。
2.1.1、flags的作用
对于使用DHCP进行初始配置的客户机(在客户机的TCP/IP软件完全配置之前),DHCP要求创造性地使用客户机的TCP/IP软件并对RFC 1122进行自由解释。在配置IP地址之前,TCP/IP软件应该接受并转发任何发送到客户端硬件地址的IP数据包到IP层;在配置TCP/IP软件之前,DHCP服务器和BOOTP中继代理可能无法将DHCP消息传递给无法接受硬件单播数据报的客户机。
为了解决一些客户端在配置TCP/IP软件之前无法接受IP单播数据报的问题,DHCP使用了“flags”字段。最左边的位定义为BROADCAST (B)标志。flags字段的其余部分保留给将来使用。客户机必须将它们设置为零,服务器和中继代理必须忽略它们。
2.2、DHCP Option
DHCP从Bootp(RFC951),DHCP报文也是有Bootp报文发展而来。但是DHCP在Bootp之上添加了许多功能,其报文也需要有一定的拓展。如果Bootp报文不能满足的内容,就以Option的形式存在于DHCP报文中。
DHCP协议其实就是携带许多Option的Bootp
DHCP有许多类型的Option,长度不一(但都是整数字节)。Option遵循以下格式
+ 如果Option没有值,则只有标志位之类的内容,则以一个字节表示
+ 如果Opiton有值,即Opiton是以下name-value对,则Opiton需要多个字节表示,其中第一个字节表示 option的名字,第二字节表示value的长度,第三个字节开始表示value。
DHCP支持大量的Option(Bootp也支持其中的部分),下面列举一些常用的
Option 名称 描述
0 Pad 填充位
1 Subnet Mask 子网 掩码
3 Router Address 路由器地址
6 DNS DNS server
15 DN 域名
50 Requested IP Address 请求的IP地址
51 Address Lease Time 地址租约时间
53 DHCP Message Type DHCP 消息类型,如Discover、Request、Offer、ACK等
54 Server Identifier 服务器标识
55 Parameter Request List 参数请求列表
56 DHCP Error Message DHCP 错误消息
58 Lease Renewal Time 租约续期时间
59 Lease Rebinding Time 租约重新设定的时间
61 Client Identifier 客户标识
119 Domain Search List 域名查找列表
255 End 结束
82 Relay agent information Option 用于relay agent与server交互
上面是常用的Option,DHCP报文以Option 255标识报文的结束。
2.2.1、DHCP message type option
DHCP Message Type(53)在每个DHCP message中必须存在,DHCP Message Type标识DHCP消息类型,主要有一下类型
DHCP 消息类型 对应的Option值
DHCPDISCOVER 1
DHCPOFFER 2
DHCPREQUEST 3
DHCPDECLINE 4
DHCPACK 5
DHCPNAK 6
DHCPRELEASE 7
DHCPINFORM 8
DHCPFORCERENEW 9
DHCPLEASEQUERY 10
DHCPLEASEUNASSIGNED 11
DHCPLEASEUNKNOWN 12
DHCPLEASEACTIVE 13
2.3、DHCP消息类型
discover:客户端广播给可用的DHCP servers
offer:server发送给client,作为discover的回复。
request:client 发送给server,请求IP地址(从选定的DHCP server的offer中选择的),并告知其他client,该地址被使用
ack:server发送给client,包含之前提交的网络地址
decline:client发送给server,通知该地址已被其他client使用
release:client发送给server,放弃网络地址,并放弃剩余租约
inform:client发送给server,只询问本地配置参数;client已经由外部配置网络地址
3、client-server交互
3.1、分配网络地址(client-server交互)

client新加入网络时,获取IP的流程
1. 新的client加入网络时,会使用0.0.0.0作为源地址,发送discover广播报文,
DHCPDISCOVER消息可能包含建议网络地址和租期值的选项.BOOTP relay agent将该报文发送转发给不同子网的DHCP servers
2. 接收到DHCPDISCOVER的DHCP servers,发送DHCPOFFER作为回应。yiaddr字段包含可用的网络地址;服务器不需要保留提供的网络地址,但是如果服务器避免将提供的网络地址分配给另一个客户机,那么协议的工作效率会更高。在分配新地址时,服务器应该检查提供的网络地址是否正确。如果必要,可能会使用BOOTP relay agent
3. client 根据收到一个或者多个的Offer报文,选择一个DHCP server,并选择它提供的IP地址。然后广播Request报文,向DHCP Server请求该IP地址,同时向本地网络(尤其是其他DHCP Server)公告自己已经选择了某个DHCP Server的某个IP地址。requested IP address option必须配置,值为offer中的yiaddr;request是由DHCP/BOOTP中继代理进行中继。为了确保,收到request的服务器与收到discover的服务器是同一组服务器,request的secs字段必须与discover消息的相同。如果客户端未接收到offer,client会超时,并重新发送discover消息
4. DHCP Server 接收到request消息,未被选择的服务器会将request消息作为client谢绝offer的通知。被request选择的服务器会将client由绑定到永久保存,并回应ack,将IP地址分配给Client端 (特殊情况:DHCP Server在发送Offer报文和接收到Request的短暂时间内把IP分配给了其他主机)
ack消息的yiaddr值为被选择的网络地址
server可能会把offer出去的地址,做成不可用的标记。如果没有从该client接受到request选定消息,则将标记回复未可用状态
5. client收到ack报文后,会针对获得的IP地址发送ARP Request,进行IP地址冲突检测。
如果IP地址已经被其他主机使用,则Client放弃该IP地址,向Server发送decline消息告诉Server该地址不能使用。然后一段时间后(一般10s)再此尝试获取IP地址 ,以避免出现循环。
如果client接受到nak消息而不是ack消息,则等待一段时间后再次进行获取IP地址过程
如果client未接收到nak或者ack,将会超时,并重新发送request消息。client可以重传四次request报文,总时长为60s。如果还是未收到消息,则重新初始化过程。
6. 如果Client仍然无法使用该IP地址,则发送DHCP RELEASE报文,放弃该地址。
3.2、更新租约(client-server交互)
主机已经有IP地址,只想更新租约

1. client在它的子网广播发送request消息。包含request IP address option,值为client的IP地址
2. server使用ack消息作为响应。server不需要检查该地址是否被使用。如果client的请求无效(例如,client已经移到一个新的子网),server应该响应一个nak消息。如果不能保证request的信息的准确性,则server不回复。
如果request的giaddr为0,client在相同子网。server必须广播nak消息,因为client 可能没有一个正确的地址和子网掩码,client可能不能回复arp报文。
否则,server必须发送nak消息给BOOTP relay agent,作为giaddr。relay agent转发给client的硬件地址,这样即使client移动到一个新的网络,也可以收
nak
3. client收到ack消息。会将报文中的参数进行校验(与之前配置的IP进行比对),然后关注租约。租约在chaddr中隐式提供。
如果client检测到ack消息中的IP已经被使用(ARP有回应),client必须向服务器发送decline消息。并重新进行3.2过程,获取IP地址。
如果client接收到nak消息,client将无法使用之前的IP地址。如果已使用,则发送decline消息,并重新获取IP地址
如果client既没收到nak,也没收到ack。则超时并发送request。重发四次request,总计时长60s,如果还是超时,重新启动初始化程序
如果使用重传request之后,还是没有收到ack或者nak,则client可以使用之前的租期未到期的配置
4. client可以发送release消息放弃租约;
注意,这种情况不常见,client不会在正常的关闭期间放弃租约。只有在明确需要放弃租约的时候才会发送release消息。例如,客户端即将移动到一个新的子网
3.3、时间值的解析与表示
client获取的租约是一个固定值(可能是永久)。在这个协议中,时间是以秒为单位。0xffffffff代表永久。因为client与server之间没有同步时钟。所以DHCP消息中的时间为相对时间。用无符号32位字以秒为单位表示相对时间。
如果两个时钟存在漂移,server可能在client之前就认为租约已经过期。为了弥补这一点,server返回的client的租期可能比提交本地信息数据库的租期短
3.4、获取外部配置的网络地址参数
如果client已经由其他方式获取IP地址,它可以发送inform消息获取其他的本地配置参数。server接收到inform消息后,构建一个带有其他本地参数的ack消息(单播)。
server应该检查inform消息的网络地址一致性,而不检查租约。然后将ack直接单播发送给client
3.5、DHCP中的client参数
有两种方法可以从server传输到client消息的参数的数量。
1、大部分的参数的在HOST REQUIREMENTs RFC中定义了默认的值。所以如果client没有接收到这些参数,就会使用默认值。
2、client可以在discover报文中携带一个specific parameters(parameter request list option)给server。在request中也必须包含这些参数
client应该包含最大的DHCP消息长度选项,以使server知道应该制作多大的DHCP消息
3.6、具有多个接口的client的DHCP使用
client必须为每个接口独立的使用DHCP,以获取IP地址
3.7、client什么时候使用DHCP
当本地网络参数发生改变时。如果client已经有之前配置的地址,并且无法连接server,则继续使用之前的地址,直至租约过期。如果到期,必须停止使用之前的地址,并通知用户

1988

被折叠的 条评论
为什么被折叠?



