DHCP 全称Dynamic Host configuration protocol, 动态主机配置协议。 它可以为客户机自动分配IP地址、子网掩码以及缺省网关、DNS服务器的IP地址等TCP/IP参数, 简单来说, 就是在DHCP服务器上有一个数据库, 存放着IP地址、网关、DNS等参数。 当客户端请求使用时, 服务器则负责将相应的参数分配个客户端,避免客户端手动指定IP地址等。特别是在一些大规模的网络中。客户端数目较多,使用DHCP可以方便对这些机器进行管理,为客户机提供TCP/IP参数配置,如IP地址、网关地址和DNS服务器等,不仅效率高,而且不存在IP地址冲突的情况现在的无线路由器默认都带有DHCP功能,也就是说一个无线路由器同时也是一个DHCP服务器。
DHCP的大致流程为下图所示
当DHCP客户端第一次登录网络的时候或者是开机的时候, 此设备发现本机上没有任何IP设定,就会网络广播去寻找DHCP服务器。 由于客户端此时还不知道自己属于哪一个网路﹐所以封包的来源地址会为0.0.0.0, 目的地址则为255.255.255.255,然后再附上DHCP discover的信息﹐向网路进行广播。 网络上每一台安装了TCP/IP协议的主机都会接收到这种广播信息,但只有DHCP服务器才会做出响应。
当DHCP服务器监听到客户端发出的DHCP Discover广播后, 会针对这个客户端的硬件地址 (MAC)与本身的设定数据来进行下列工作:
1 到服务器的登录文件中寻找该用户之前是否曾经用过某个 IP ,若有且该 IP 目前无人使用,则提供此 IP 给客户机;
2若配置文件针对该 MAC 提供额外的固定 IP (static IP) 时,则提供该固定 IP 给客户机;
3若不符合上述两个条件, 则随机取用目前没有被使用的 IP 参数给客户端,并记录下来。回应给客户端一个DHCP OFFER封包,由于客户端在开始的时候还没有IP地址﹐所以在其DHCP Discover封包内会带有其MAC地址信息﹐并且有一个XID编号来辨别该封包﹐DHCP服务器回应的DHCP Offer封包则会根据这些资料传递给要求租约的客户。根据服务器端的设定﹐DHCP Offer封包会包含一个租约期限的信息。但这里仅仅是分配, 客户端还没有真正的使用
如果客户端收到网路上多台DHCP服务器的回应﹐只会挑选其中一个DHCP Offer(通常是最先抵达的那个)并且向网路发送一个DHCP Request广播封包,告诉所有DHCP服务器它将指定接受哪一台服务器提供的IP位址。之所以要以广播方式回答,是为了通知所有的DHCP服务器,他将选择某台DHCP服务器所提供的IP地址, 同时,客户端还会发送一个ARP封包, 查询网路上有没有其他机器使用该IP地址, 如果发现该IP被占用, 客户端会发送一个DHCP Decline封包给DHCP服务器, 拒绝接受其DHCP Offer,并重新开始发送DHCP Discover信息。
当DHCP服务器收到DHCP客户机回答的DHCP Request请求信息之后, 它便向DHCP客户机发送一个包含它所提供的IP地址和其他设置的DHCP Ack确认信息。以确认IP地址的正式生效。然后DHCP客户机便将其TCP/IP协议与网卡绑定,另外,除DHCP客户机选中的服务器外,其他的DHCP服务器都将收回曾提供的IP地址
当DHCP客户机分配到IP后,每次当DHCP客户机重新登录登录时, 则不需要发送DHCP Discover信息了,而是直接发送包含前一次所分配的IP地址的DHCP Request请求信息。当DHCP服务器收到这一信息后, 它会尝试DHCP客户机继续使用原来的IP地址, 并回答一个DHCP Ack确认信息。 如果此IP地址无法继续在分配给原来的DHCP客户机使用时(比如此IP地址以分配给其他DHCP客户机),则DHCP服务器给DHCP客户机回答一个DHCP NAck否认信息。 当原来的DHCP客户机收到此DHCP NAck否认信息后, 它必须重新发送DHCP Discover信息来重新请求信的IP地址
DHCP服务器向DHCP客户机出租的IP地址一般都有一个租借期限, 期满后DHCP服务器便会收回出租的IP地址,如果DHCP客户机要延长其IP租约, 则必须更新其IP租约。DHCP客户机启动时和IP租约期限过一半时, DHCP客户机都会自动向DHCP服务器发送其IP租约的信息。 DHCP客户机除了在开机的时候发出DHCP Request请求在外, 在使用租期超过50%时刻处,DHCP 客户机会以单播形式向DHCP Server发送DHCP Request报文来续租IP地址。如果DHCP 客户机成功收到DHCP 服务器发送的DHCP ACK报文,则按相应时间延长IP地址租期;如果没有收到DHCP 服务器发送的DHCP ACK报文,则DHCP 客户机继续使用这个IP地址。在使用租期超过87.5%时刻处,DHCP 客户机会以广播形式向DHCP Server发送DHCP Request报文来续租IP地址。如果DHCP 客户机成功收到DHCP 服务器发送的DHCP ACK报文,则按相应时间延长IP地址租期;如果没有收到DHCP 服务器发送的DHCP ACK报文,则DHCP 客户机继续使用这个IP地址,直到IP地址使用租期到期时,DHCP Client才会向DHCP Server发送DHCP Release报文来释放这个IP地址。 客户端想提前退租, 可以随时发送DHCP Release命令解约
OP: 若是客户端送给服务端的封包 设置为1 反方向为2
Htype: 硬件类型, ethernet为1
Hlen: 硬件长度, ethernet为6
Hops: 若数据包需要经过router发送 没站加1,若在同一网内为0
Transaction ID : 事物ID是个随机数,用于客户端和服务器之间匹配请求和相应信息
Seconeds: 由用户指定的时间,指开始地址获取和更新进行后的时间
Flags: 从0-15bits 最高位为1时表示server将以广播方式传递封包给client, 0 表示表示server将以单播方式传递封包给client,其余尚未使用。
Ciaddr : 用户IP地址
Siaddr: 用于bootsrtap过程中的IP地址(服务器的IP地址)
Chaddr: client的硬件地址
Sname: 可选的server的名称, 以0x00结尾
File: 启动文件名
Options: 厂商标识, 可选的蚕食字段
阶段 |
源MAC |
目标MAC |
源IP |
目标IP |
Discover |
PC机的MAC |
全FF |
0.0.0.0 |
255.255.255.255 |
Offer |
Dhcp服务器或者中继器路由的MAC |
Dhcp客户机的MAC |
Dhcp服务器或者中继路由器的IP地址 |
准备分配的IP地址 |
Request |
PC机的MAC |
全FF |
0.0.0.0 |
255.255.255.255 |
Ack |
Dhcp服务器或者中继器路由的MAC |
Dhcp客户机的MAC |
Dhcp服务器或者中继路由器的IP地址 |
准备分配的IP地址 |
3.DHCPTransaction ID是由客户机产生一个随机数获得,不同MAC地址产生的Transaction ID不同,Transaction ID是区分不同DHCP请求的标识
ARP 协定
这里我们要介绍的是 Address Resolution Protocol (ARP)。 ARP 是 TCP/IP 设计者利用乙太网的广播性质﹐设计出来的位址解释协定。它的主要特性和优点是它的位址对应关系是动态的﹐它以查询的方式来获得 IP 位址和实体位址的对应。它的工作原理非常简单﹕
1. 首先﹐每一台主机都会在 ARP 快取缓冲区 (ARP Cache)中建立一个 ARP 表格﹐用来记录 IP 位址和实体位址的对应关系。这个 Table 的每一笔资料会根据自身的存活时间递减而最终消失﹐以确保资料的真实性。
2. 当发送主机有一个封包要传送给目的主机的时候﹐并且获得目的主机的 IP 位址﹔那发送主机会先检查自己的 ARP 表格中有没有该 IP 位址的实体位址对应。如果有﹐就直接使用此位址来传送框包﹔如果没有﹐则向网路发出一个 ARP Request 广播封包﹐查询目的主机的实体位址。这个封包会包含发送端的 IP 位址和实体位址资料。
3. 这时﹐网路上所有的主机都会收到这个广播封包﹐会检查封包的 IP 栏位是否和自己的 IP 位址一致。如果不是则忽略﹔如果是则会先将发送端的实体位址和 IP 资料更新到自己的 ARP 表格去﹐如果已经有该 IP 的对应﹐则用新资料覆盖原来的﹔然后再回应一个 ARP Reply 封包给对方﹐告知发送主机关于自己的实体位址﹔
4. 当发送端接到 ARP Reply 之后﹐也会更新自己的 ARP 表格﹔然后就可以用此纪录进行传送了。
5. 如果发送端没有得到 ARP Reply ﹐则宣告查询失败。
ARP 的查询过程可参考下图﹕
ARP 的查询过程
前面说的 ARP 表格﹐只有在 TCP/IP 协定被载入核心之后才会建立﹐如果 TCP/IP 协定被卸载或关闭机器﹐那么表格就会被清空﹔到下次协定载入或开机的时候再重新建立﹐而同时会向网路发出一个 ARP 广播﹐告诉其它机器它的目前位址是什么﹐以便所有机器都能保持最正确的资料。
然而﹐ARP cache 的大小是有所限制的﹐如果超过了界限﹐那么越长时间没被使用过渡资料就必须清理掉﹐以腾出空间来储存更新的资料。所以﹐当机器收到 ARP equest 封包时﹐如果查询对象不是自己﹐则不会根据发送端位址资料来更新自己的 ARP 表格﹐而是完全忽略该封包。同时﹐每笔存在 cache 中的资料﹐都不是永久保存的﹕每笔资料再更新的时候﹐都会被赋予一个存活倒数计时值﹐如果在倒数时间到达的时候﹐该资料就会被清掉。然而﹐如果该资料在倒数时间到达之前被使用过﹐则计时值会被重新赋予。
当然了﹐ARP 尚有一套机制来处理当 ARP 表格资料不符合实际位址资料的状况(例如﹐在当前连线尚未结束前﹐收到目的端的位址资料更新讯息)﹔或是目的主机太忙碌而未能回答 ARP 请求等状况。