• 常见协议基础知识总结--DHCP协议


    DHCP动态主机配置协议,简单点说,就是提供了自动获取ip地址的功能,基于四层的UDP协议;

    以下描述此协议的整个工作流程:

    (1) 客户端发送discovery报文,二三层广播报文,源ip地址全0;

    (2)服务器收到discovery报文之后,进行ip地址分配,找到ip地址,并且进行arp探测,当发现

    此ip地址空闲之后,组offer报文,发送给客户端,内部包含有ip地址,客户端mac地址,租约时间等信息;

    (3)客户端收到offer报文之后,会选择一个(一般是第一个)进行应答,并且发送request报文到服务器,同时也会进行

    ARP探测,当发现有ip地址冲突的时候,会发送decline报文到服务器终止使用该ip地址,然后重新发送discovery;

    (4)服务器发送ack报文确认地址,客户端收到ack之后,开始使用该ip地址;

    ---以上流程报文均为广播;

    (5)客户端会在租约时间的1/2和3/4时间开始尝试续租该ip地址,成功则继续使用,否则到达租期后

    不能继续使用,需要施放该ip地址,并且重新发discovery;

    (6)客户端可以发送release报文随时放弃该ip地址的使用;

    我们重点说下服务器的一些实现问题:

    1. 建立bit数组,在bit数组中将分配出去或者不能够分配的地址进行标记;

    比较烂的实现是每次收到discovery请求之后,先随机一个地址,然后每个地址都去lease链表中查找,

    看是否这个lease被分配出去;一开始性能还好,但是当分配的地址接近极限的时候,会出现n*n次遍历

    的情况,从而大大影响到性能;

    使用bit数组保存地址,每次直接以32个的方式遍历数组,找到不是0xffffffff的区间,然后按照bit查找空闲

    bit,从而确定空闲地址;最多只需要n/32次遍历;性能将会大大提升;

    2.使用最老租约:

    某些时候,客户端可能下线的时候并没有通知服务器,这时候如果服务器的地址池已经使用完,可以选择最早

    分配出去的的租约ip进行arp探测,如果已经不在使用,则分配该ip地址给新的客户端;此处涉及到的lease链表

    的维护,最好保证每次更新或者添加都使用尾插法,这样就保证了直接取第一个节点就一定是最老的租约,缩短

    了遍历的时间;

    3.arp防冲突:

    arp放冲突这里主要是要保存一些正在arp地址的缓存信息,首先可以防止探测同一个ip地址被多次发送arp;

    arp防冲突通常会使用一个定时器,如果超时仍然没有发现冲突,则发送offer报文;否则,需要继续查找下

    一个可用ip地址,注意下次查找的地址不能是以前探测冲突的,如果冲突需要在bit数组中打标记;

    4.offer包文和ack报文对lease的处理:

    offer发送时,会产生一个tmplease插入到lease链表,当发送ack的时候才变成正式的lease,即标记已分配;

    如果一个offer的ip地址是一个已经存在的地址,会将原有的lease删除,然后重新添加;在某些测试工具的异常

    场景下,ip地址已经分配出去,这时候来了discovery,并且没有检测到冲突,因为工具不回复arp,所以会删除

    掉lease,发送offer,但是工具发现自己已经有ip地址了,所以不予回应,导致lease被误删了;这会导致ha情况下

    某些同步上的异常情况出现;

    先简单的写这么多,后面想起来再写,思路有点乱了;

  • 相关阅读:
    #define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
    互联网地址处理例程
    Android系统工程模式启动过程详解
    知识填充
    git 本地回退
    理解JS中的Promise对象
    MySQL server version for the right syntax to use near 'identified
    尾递归要注意的点
    事件捕获和事件冒泡的理解
    v 2ra-y_build_a_sever_in_vltru
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/3588397.html
Copyright © 2020-2023  润新知