OpenWrt之DHCP(动态主机配置协议)
DHCP简介
在TCP/IP网络上,每台主机在访问网络及其资源之前,都必须进行基本的网络信息配置,包含IP地址、子网掩码、默认网关和DNS等。在大型网络中,如果每台终端主机的地址的都有不同的使用者来分配,那么就很容易出现地址相同的情况。对于经常移动的终端,重新配置可能需要很长时间,并且容易出错,如果IP配置错误将会导致不能访问网络。因此需要一种机制来简化主机IP地址的配置。动态主机配置协议DHCP应运而生。
采用DHCP的好处在于减少了网络管理员和用户的的负担。这将可以减少手工配置IP的地址导致的地址冲突,以及网关地址或DNS地址错误导致的不能访问网络的问题。
DHCP原理
-
DHCP服务器拥有一个IP地址服务池,当任何启用DHCP的 客户机连接到网络时,可从服务器哪里租借一个IP地址。不再使用的IP地址自动回收到地址池中,供再次分配使用。
-
DHCP保证同一时刻的任何IP地址只能分给一个客户使用。当DHCP客户机重新启动时,应配置为相同的IP地址。在DHCP服务器重启的情况吓,也应当给每一个客户机分配不同的IP地址,并且和手动分配的IP地址共存。这就要求DHCP服务器对已分配的地址进行保存,并且在客户端不使用时进行回收。
-
DHCP是一种动态的向网络终端提供配置参数的协议。在终端提出申请之后,DHCP服务器可以向终端提供IP地址及子网掩码、网关和DNS服务器地址等参数。
-
DHCP协议基于UDP协议,客户端的端口号是68,服务器的端口号是67。这样可以非常方便地区分是请求还是响应。
DHCP报文
DHCP的请求和应答封装在UDP报文中。
IP层在请求IP地址时采用链路层广播,链路层广播地址为"FF:FF:FF:FF:FF:FF"。网络层目的IP使用广播地址"255:255:255:255",源地址采用0.0.0.0,这是因为请求时自身没有IP地址,并且不知道服务器的IP地址。
报文内容格式如下图:
报文类型
字段为1表示请求,为2表示应答。
硬件类型
为1表示以太网。
硬件地址长度
以太网的硬件地址长为6字节。
跳数
字段由客户端设置为0 ,如果和DHCP服务器 之间有中继活动的话将被修改。
事务ID
是一个由客户端设置并由服务器返回的4字节整数。客户机使用它对请求和应答进行匹配。对于每个请求客户端首先将该字段设置为一个随机数。
秒数
客户端段开始进行DHCP请求时,将秒数字段设置为一个时间值。服务器能够看到这个时间值,备用服务器在等待时间超过这个时间值后才会响应客户的请求,这意味着备用服务器接管DHCP服务。
flag
BOOTP 标志位。只使用第 0 比特位,是广播应答标识位,用来标识 DHCP 服务器应答报文是采用单播还是广播发送。其中,0 表示采用单播发送方式,1 表示采用广播发送方式。其余位保留。
客户端地址字段
填0,如果上次成功配置过IP地址,它将写到"客户端IP地址"字段。服务器返回应答时将客户的IP地址写入
你的(客户端)IP地址
字段。并将自身IP地址填写到
服务器IP地址
字段,在同一网络中继IP地址
填0。
客户端MAC地址
字段填写网卡硬件地址,不足部分填0。
服务器主机名
字段由服务器来填写,通常为0。
引导文件名
字段用于填充TFTP下载文件全路径,通常用于无盘启动工作站。选项字段用于扩展,但实际上有一些选项在终端接入互联网时是必须的。这些包含DNS地址、网关地址和子网掩码等。
可选字段
部分均以TLV(类型-长度-值)来表示。子网掩码选项用于指定客户端的子网掩码。子网掩码的类型码为1,长度为4字节。
路有选项指定了客户端子网的下一跳地址。如果有多个,路由器将按照优先顺序排列,一般为路由器自身IP地址。类型码为3,长度为4的倍数。
域名服务器选项用于将名字服务器提供给 客户端,并且以优先顺序给出,选项代码为6,最长度为4字节,并且是4的倍数。
DHCP工作流程
DHCP通常由客户端发起广播请求,服务器收到请求后在配置文件中查询,如果符合要求则向客户端提供服务。
DHCP配置IP服务的报文流程。
客户端在以太网上广播"DHCP Discover"报文来发现DHCP服务器。
IP为10.0.2.2的服务器收到广播请求后,向客户端回应请求,发出单播"DHCP Offer"报文,并且目的IP为10.0.2.15。
客户端再次以广播形式发出"DHCP Request"报文。这是因为客户端可能受到多个服务器"DHCP Offer"报文,客户端会根据报文的内容来选择一个给予响应,采用广播形式可以让多个服务器均可收到。
当服务器收到"DHCP Request"报文后,服务器在将客户端的MAC地址同分配的IP地址绑定后,将IP信息(IP、掩码、网关地址和DNS等)发送客户机。
客户机收到"DHCP ACK"报文后,将IP信息设置到主机系统上。这时IP设置就完成了,客户机就可以是用IP来访问网络了。