0x0 why we use DHCP

  • 静态配置ip的缺点,
    1. 由单一管理员配置过于繁琐
    2. 由用户自己配置容易产生冲突(两个用户配置了相同的IP地址)

0x1 what is DHCP

  • Dynamic Host Configuration Protocol(动态主机配置协议)
    1. 是一种能够为网络中的主机提供TCP/IP配置的应用层协议。
    2. DHCP基于C/S模型,Client能够从DHCP Server获取到IP地址及其他参数,从而降低手工配置带来的工作量和出错率。
    3. DHCP是从BOOTP(Bootstrap Protocol)协议发展而来.

0x2 how to DHCP

  • 分配方式
    1. 自动分配(获得永久的IP地址) (不常用)
    2. 动态分配(获得一个存在租期的IP地址) (常用)
    3. 手工分配(管理员分配一个固定的地址给某个终端) (偶尔使用比如给打印机分配一个固定的IP)
  • 协议报文
    1. DHCP discover:广播包,用于发现局域网内的所有DHCP服务器
    2. DHCP offer:单播或者广播包,dhcp服务器把可以分配给用户的IP地址放在其中发给用户
    3. DHCP request:广播包,回应第一个DHCP的Offer,拒绝其他的DHCP包
    4. DHCP ACK:模式与offer包一样,设备只有在收到ACK后才能的获得IP地址
  • 租期相关问题
    1. 一共有两次租期请求
    • 第一次在租期达到50%的时候使用单播包进行请求
    • 第二次在租期达到7/8的时候使用广播包进行请求
      1. 只有在用户收到了DHCP服务器的ACK请求后才能算是续租完成
      2. 当续租成功后,租期还原为一天(初始租期)

0x3 DHCP中继的一些补充

  • 背景:每个网段使用一个DHCP服务器不合理,应该多个网段的DHCP服务器使用同一个DHCP服务器
  • 将广播包变成单播包,单播包变成广播包

0x4 DHCP报文补充

0x4-1 DHCP报文详情

  • 以太网包头+IP包头+UDP包头+DHCP报文->DHCP工作在应用层
  • DHPC包为啥使用67和68号UDP端口?
    • DHCP在传输层被UPD封装,68为客户端端口,67为服务器端口

  • 报文结构分析
  • OP:表示报文的类型
    • 1表示客户端请求报文
    • 2表示服务器响应报文
  • htype:表示硬件地址的类型。对于以太网,该类型的值为“1”
  • hlen:表示硬件地址的长度,单位是字节。对于以太网,该值为6
  • Hops:跳数。客户端设置为0,每经过一个中继加一。
  • xid:事务ID,由客户端选择的一个随机数,被服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。
  • secs:获得IP地址或IP地址续借后所使用了的秒数。
  • bootp flags
    • 0:客户端请求服务器以单播形式发送响应报文
    • 1:客户端请求服务器以广播形式发送响应报文
  • ciadd:客户端的IP地址。。
  • yiaddr:(你自己的)或客户端的IP地址。
  • siaddr:表明DHCP协议流程的下一个阶段要使用的服务器的IP地址。
  • giaddr:该字段表示第一个DHCP中继的IP地址。
  • chaddr:该字段表示客户端的MAC地址。
  • sname:该字段表示客户端获取配置信息的服务器名字
  • file:该字段表示客户端的启动配置文件名。
  • options:该字段表示DHCP的选项字段,至少为312字节,格式为”代码+长度+数据”。DHCP通过此字段包含了服务器分配给终端的配置信息,如网关IP地址,DNS服务器的IP地址,客户端可以使用IP地址的有效租期等信息。

0x4-2 例子

  • DHCP_ACK包

0x5 冷知识

  • DHCP的request包和ack包一定是广播吗?
    • 不一定,是否为广播由bootp flags字段决定。这个字段在客户端发送discover包的时候就已经决定了

      bootp flags为0为单播 bootp flags为1为广播