网络协议之DHCP request续约实现机制

DHCP client在获取到地址后,会在1/2租约时间和7/8租约时间,发送request报文。
本文主要讲如何利用定时器实现简化版的续约功能以及各状态之间的切换。

首先,了解DHCP客户端获取到地址后,服务器断开之后,客户端的状态变化

一、DHCP客户端状态
1、客户端发送discover报文, 进入INIT_SELECTING状态
2、客户端收到offer报文,    进入REQUESTING状态, 发送request报文
3、客户端收到leaseck报文,      进入BOUND状态
4、等待租约时间的一半,     进入RENEWING状态,并发送request报文
5、等待租约时间的7/8,      进入REBOUNDING状态

二、实现分析
2.1 当客户端收到leaseCK报文,客户端状态置为BOUND,
创建一个定时器,时间为租约时间leleasese的一半;

2.2 当leleasese/2时间之后,将客户端状态置为RENEWING,并发送request报文,
设置租约剩余时间leleasese*3/8=3lease/8,重传时间leleasese*3/8*1/2;
最后设置定时器函数时间为3lease/16。
(1)定时器时间到后,执行定时器函数,此时客户端状态为RENEWING;
然后设置租约剩余时间3lease/16,重传时间3lease/32
接着将客户端状态置为RENEWING,并发送request报文;
最后设置定时器函数时间为timeout=3lease/32。

(2)定时器时间到后,执行定时器函数,此时客户端状态为RENEWING;
然后设置租约剩余时间3lease/32,重传时间3lease/64
接着将客户端状态置为RENEWING,并发送request报文;
最后设置定时器函数时间为timeout=3lease/64。
      
(3)定时器时间到后,执行定时器函数,此时客户端状态为RENEWING;
然后设置租约剩余时间3lease/64,重传时间3lease/128
接着将客户端状态置为RENEWING,并发送request报文;
最后设置定时器函数时间为timeout=3lease/128。

(4)定时器时间到后,执行定时器函数,此时客户端状态为RENEWING;
然后设置租约剩余时间3lease/128;
最后设置定时器函数时间为timeout=3lease/128

2.3 此时租约时间一共走了lease/2+3lease/8+3lease/16+3lease/32+3lease/64+3lease/128+3lease/128=7lease/8
(这就是7lease/8租约时间还会发送request的原因),执行定时器函数,客户端的状态为RENEWING。
改变客户端状态为REBINDING,并发送request报文,
然后设置租约剩余时间lease/8,设置重传时间lease/16,
设置定时器时间为lease/16,当重传时间>=1时,就进入下面循环
    
    (1)定时器时间到后,执行定时器函数,此时定时器状态为REBINDING,
然后设置租约剩余时间lease/16,
当遗留时间的一半>=1时,
改变客户端状态为REBINDING,并发送request报文,
设置定时器函数时间为timeout=lease/32

(2)循环执行步骤一,直到lease/(16*2^n)< 1,结束上述循环,进入下面
 设置重传时间等于遗留时间=0;
 最后,设置定时器函数时间为0

2.4 执行定时器函数,此时客户端的状态为REBINDING;
 发送releleasese报文,释放IP;
发送discover报文,重新获取IP。

三、总结
(1)当时间为lease/2时,会发送一次request报文,然后间隔为3lease/16,3lease/32,3lease/64时,各发送一次request报文,共计4次;
(2)当时间为lease*7/8时,会发送一次request报文,然后每间隔lease/(16*2^n)时,发送一次request报文。其中n=0,1,2….,直到lease/(16*2^n)<1结束发送;
(3)接着发送release报文,和discover报文。

你可能感兴趣的:(网络协议,linux)