相关学习资料

http://www.rfc-editor.org/rfc/rfc2131.txt
http://baike.baidu.com/view/7992.htm?fromtitle=DHCP协议&fromid=1989741&type=syn
http://blog.chinaunix.net/uid-20530497-id-2203830.html
http://www.datacentersky.com/dhcp-message-format.html
http://www.datacentersky.com/dhcp-state-machine.html
http://blog.csdn.net/baidu20008/article/details/9952601

目录

. DHCP简介
. DHCP协议数据包格式
. DHCP服务器搭建
. DHCP协商交互过程

1. DHCP简介

DHCP是DynamicHostConfigurationProtocol之缩写﹐它的前身是BOOTP。DHCP可以说是BOOTP的增强版本﹐它分为两个部份(C/S架构): 一个是伺服器端,而另一个是客户端。所有的IP网路设定资料都由DHCP伺服器集中管理﹐并负责处理客户端的DHCP要求﹔而客户端则会使用从伺服器分配下来的IP环境资料。比较起BOOTP,DHCP透过"租约"的概念,有效且动态的分配客户端的TCP/IP设定,而且,作为兼容考量,DHCP也完全照顾了BOOTPClient的需求。

DHCP支持三种类型的地址分配:

. 自动分配方式:
DHCP给主机指定一个永久的IP地址,一旦DHCP客户端第一次成功的从DHCP伺服器端租用到IP位址之后﹐就永远使用这个位址
. 动态分配方式:
DHCP给主机指定一个有"时间限制(租约)"的IP地址,到时间(租约到期)或主机明确表示放弃这个地址(主机主动断开连接)时,这个地址可以被其他的主机使用,当然,客户端可以比其它主机更优先的延续(renew)租约,或是租用其它的IP位址
. 手工分配方式:
主机的IP地址是由网络管理员指定的,它可以按照MAC地址来固定的分配IP位址﹐DHCP只是把指定的IP地址告诉主机,相当于将某个MAC和IP进行了静态绑定

除了分配IP之外﹐DHCP还可以帮客户端指定IP环境:

. router(默认网关)
. netmask(默认子网掩码)
. DNSServer(DNS服务器IP)
. WINSServer﹑等等项目

您在客户端上面,除了将DHCP选项打勾之外,几乎无需做任何的IP环境设定

DHCP有3个端口,其中:

. UDP67: DHCP Server服务端口
. UDP68: DHCP Client服务端口
. UDP546: 用于DHCPv6 Client,而不用于DHCPv4,是为DHCP failover服务,这是需要特别开启的服务,DHCP failover是用来做"双机热备"的

DHCP协议主机配置的优缺点

. DHCP协议主机配置方式最重要的特征就是整个配置过程自动实现,而且所有配置信息在一个地方集中控制,这就是DHCP SERVER的作用。
. 最初的BOOTP/DHCP协议是在同一个物理子网中使用广播方式实现的,无法穿越路由器扩展到不同的物理子网中,也就是要使用DHCP协议的每一个网络(广播域)中必须配置一台DHCP服务器,为了克服这一缺陷,采用了DHCP RELAY(DHCP中继服务器)的方式使得BOOTP/DHCP协议能够穿越路由器实现。
. DHCP协议一般采用终端的硬件地址(如果是以太网,就是我们常说的MAC地址)来唯一标识一个终端设备。
. DHCP协议通过设置IP地址使用租期,可以达到IP地址的分时复用效果,解决IP地址资源短缺的问题。
. DHCP协议基本上是一个单向驱动协议,SERVER完全是被动的,其动作、行为基本完全由CLIENT的请求行为而激发,即SERVER端无法主动控制CLIENT端。因此其交互性和安全性就没有PPP协议那么完善,这是DHCP协议的一个安全风险点

2. DHCP协议数据包格式

0x1: DHCP协议的封装

学习DHCP协议不能单纯学习协议本身,还必须连带了解它的封包结构,之所以这么说,是因为DHCP是一个特殊的"服务发现"类型的协议,它用于客户端"获取某种资源",所以它的封包格式具有一定的特殊性

链路层头

IP头

UDP头

DHCP报文

其中:

. 链路层头: 承载报文的链路层信息头,常见的有Ethernet_II格式、.1Q格式、 IEEE802.3格式、令牌环链路层头格式等。
. IP头: 标准的IP协议头,IPV4中长度为20bytes,包括了SrcIp,DstIp等信息。
. UDP头: 8bytes,包括了SrcPort,DstPort,报文长度及UDP校验和等信息。
. DHCP报文:具体的DHCP报文内容。

由于DHCP协议是初始化协议,更简单的说,就是让终端获取IP地址的协议,既然终端连IP地址都没有,何以能够发出IP报文呢?SERVER给CLIENT回送的报文该怎么封装呢?带着这些疑问,继续学习
为了解决这个问题,DHCP报文的封装采取了如下措施:

. 首先链路层的封装必须是广播形式,即让在同一物理子网中的所有主机都能够收到这个报文
. 由于终端目前没有IP地址,IP头中的SrcIp规定填为全0。
、当终端发出DHCP请求报文,它并不知道DHCP SERVER的IP地址,因此IP头中的DstIp填为有限的子网广播IP——全1(广播),以保证DHCP SERVER的IP协议栈不丢弃这个报文
. 上面的措施保证了DHCP SERVER能够收到终端的请求报文,但仅凭链路层和IP层信息,DHCP SERVER无法区分出DHCP报文,因此终端发出的DHCP请求报文的UDP层中的SrcPort 为68,DstPort为67。即DHCP SERVER通过知名端口号67来判断一个报文是否是DHCP报文
. DHCP SERVER给终端的响应报文将会根据DHCP报文中的内容决定是广播还是单播,一般都是广播形式:
5.1 广播封装时:
5.1. 链路层的封装必须是广播形式
5.1. IP头中的DstIp填为有限的子网广播IP——全1(广播)
5.2 单播封装时
5.2. 链路层的封装是单播形式(因为客户端在发送DHCP数据包的时候在链路层帧头填写了sourceMAC)
5.2. IP头中的DstIp填为有限的子网广播IP(全1)、或者是即将分配给用户的IP地址(当终端能够接收这样的IP报文时)

两种封装方式中的UDP层都是相同的,SrcPort 为67,DstPort为68。终端通过知名端口号68来判断一个报文是否是DHCP SERVER的响应报文

0x2: DHCP协议本身的报文格式

接下来继续学习在DHCP交互过程中,DHCP数据包本身的报文格式

. OP:
1.1) client发送给server的封包,设为1
1.2) server发送给client的封包,设为2
. HTYPE: 硬件类别
2.1) 1表示10Mb/s的以太网(Ethernet)的硬件地址
. HLEN: 硬件地址长度、
3.1) Ethernet为6(字节)
. HOPS: 跳数,若封包需经过router传送,每站加 ,若在同一网内,为0(客户端的初始设置为0)
. XID: TRANSACTION ID(事务ID),DHCP REQUEST 时产生的数值,服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户端设置并由服务器返回,为32位整数。以作 DHCPREPLY 时的依据
. SECONDS: 由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数
. FLAGS:
从0到15共16 bits
6.1) 最左1Bit为1时表示 server将以广播方式传送封包给client
6.2) 最左1Bit为0时表示 server将以单播方式传送封包给client
其余尚未使用。
. ciaddr:
客户端的IP地址。只有客户端是Bound、Renew、Rebinding状态,并且能响应ARP请求时,才能被填充。即要是 client 端想继续使用之前取得的IP地址,则这个字段会被填充
. yiaddr: 从server送回client的DHCP OFFER与DHCPACK封包中,此栏填写分配给client的IP地址。
. siaddr:
表明DHCP协议流程的下一个阶段要使用的服务器的IP地址。
. giaddr:若需跨网域进行DHCP获取,此栏为 relay agent的地址,否则为0
. chaddr:
客户端硬件地址。客户端必须设置它的"chaddr"字段。UDP数据包中的以太网帧首部也有该字段,但通常通过查看UDP数据包来确定以太网帧首部中的该字段获取该值比较困难或者说不可能,而在UDP协议承载的DHCP报文中设置该字段,用户进程就可以很容易地获取该值。
. sname:
Server的名称字符串,由DHCP服务器填写,以0x00结尾。
. file:
启动文件名,是一个空结尾的字符串。DHCP Discover报文中是"generic"名字或空字符,DHCP Offer报文中提供有效的目录路径全名。
. options:
允许厂商定议选项(Vendor-Specific Area),以提供更多的设定信息。
格式为CODE(占1字节)+LEN(占1字节)+VALUE(长度由LEN而定)
) 、、Subnet Mask
) 、n*、Router(网关)
) 、n*、DNS Server
) 、n*、Log Server
) 、、Interface MTU
) 、n*、Static route
) 、、ARP cache timeout
) 、n*、NTP servers
) 、、IP address lease time
) 、、Message type
10.1) : DHCPDISCOVER
10.2) : DHCPOFFER
10.3) : DHCPREQUEST
10.4) : DHCPDECLINE
10.5) : DHCPACK
10.6) : DHCPNAK
10.7) : DHCPRELEASE
10.8) : DHCPINFORM
) 、、DHCP Server Identifier
) 、n、华为自定义: 可配置该终端设备在发起DHCP请求时,通过Option 60携带域信息。ME60收到DHCP报文时,可根据Option 60中携带的域信息来分配IP地址。
) 、n、华为自定义:ME60作为DHCP Relay,在中继用户DHCP报文时,可在Option 82中填写用户的物理位置信息,通知DHCP服务器按物理位置信息对为用户分配IP地址

从数据包格式的学习中我们可以看到,DHCP服务器除了进行IP分配之外,还会负责给客户端发送DNS服务器IP、默认网关IP、默认子网掩码之类的信息

0x3: DHCP报文类型

DHCP共有八种报文,不同报文之间的区别除了DHCP数据包本身之外,在封包上(UDP头,IP头、链路层头)也有一些差别

. DHCP Discover
DHCP客户端请求地址时,并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送请求报文,这个报文成为Discover报文,目的是发现网络中的DHCP服务器,所有收到Discover报文的DHCP服务器都会发送回应报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。
. DHCP Offer
DHCP服务器收到Discover报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个Offer报文,发送给用户(可以广播、也可以单播),告知用户本服务器可以为其提供IP地址。(注意,只是告诉client可以提供,是预分配,还需要client通过ARP检测该IP是否重复)
. DHCP Request
客户端会在两种情况下发送DHCP Request
) DHCP客户端可能会收到来自DHCP服务器的很多Offer,所以必须在这些回应中选择一个。Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器,并回应一个广播Request报文,通告选择的服务器。注意,"Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器"这里存在一个安全问题,如果我们的伪DHCP服务器能比原始DHCP服务器先发送Offer数据包,就能达到欺骗的目的,从而劫持目标用户的流量
) 获取DHCP客户端成功获取IP地址后,在地址使用租期过去1/2时,会向DHCP服务器发送单播Request报文续延租期,如果没有收到DHCP ACK报文,在租期过去3/4时,发送广播Request报文续延租期。
. DHCP ACK
DHCP服务器收到Request报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录(即之前的预分配过程中登记的那个MAC),如果有则发送ACK报文作为回应,通知用户可以使用分配的IP地址。
. DHCP NAK
如果DHCP服务器收到Request报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则发送NAK报文作为回应,通知用户无法分配合适的IP地址。
. DHCP Release
当用户不再需要使用分配IP地址时,就会"主动"向DHCP服务器发送Release报文,告知服务器用户不再需要分配IP地址,DHCP服务器会释放被绑定的租约(在数据库中清除某个MAC对某个IP的租约记录,这样,这个IP就可以分配给下一个请求租约的MAC)
. DHCP Decline
DHCP客户端收到DHCP服务器回应的ACK报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则发送Decline报文,通知服务器所分配的IP地址不可用,我们在手工设置静态IP、或者DHCP分配中有时会遇到"检测到IP冲突"的提示就是因为客户端利用ARP机制来在当前内网中确认当前指定的IP是否已经被占用
. DHCP Inform
DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,服务器收到该报文后,将根据租约进行查找,找到相应的配置信息后,发送ACK报文回应DHCP客户端

3. DHCP服务器搭建

1. 修改DHCP服务器网卡配置:

vim /etc/sysconfig/network-scripts/ifcfg-eth0

修改为:

DEVICE=eth0
BOOTPROTO=static
HWADDR=:0C:::BB:
ONBOOT=yes
IPADDR=192.168.159.128
NETMASK=255.255.255.0
BROADCAST=192.168.159.255
GATEWAY=192.168.159.2

重启网络服务

service network restart

2. 安装DHCP服务

yum -y install dhcp*

3. 配置DHCP服务

vim /etc/dhcpd.conf
cp /usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample /etc/dhcpd.conf
vim /etc/dhcpd.conf

ddns-update-style interim; #定义所支持的DNS动态更新类型(必选),一般我们设置成关闭,interim和none都是关闭的意思
ignore client-updates; #忽略客户机更新DNS记录 subnet 192.168.159.0 netmask 255.255.255.0 #设置子网声明
{
# --- default gateway
option routers 192.168.159.2; #设置缺省网关
option subnet-mask 255.255.255.0; #设置客户端的子网掩码 option nis-domain "domain.org"; #为客户设置NIS域
option domain-name "LittleHann.com"; #为客户设置域名
option domain-name-servers 192.168.159.128; #为客户设置域名服务器(DNS)IP地址 option time-offset -; # Eastern Standard Time
# option ntp-servers 192.168.1.1;
# option netbios-name-servers 192.168.1.1;
# --- Selects point-to-point node (default is hybrid). Don't change this unless
# -- you understand Netbios very well
# option netbios-node-type ; range dynamic-bootp 192.168.159.150 192.168.159.254; #设置动态的地址池
default-lease-time ; #设置缺省的地址租期
max-lease-time ; #设置客户端最长的地址租期 #这个域用于设置静态MAC-IP分配绑定,即我们前面说的管理员可以指定某些MAC静态分配一个IP,不变的
host target.host.com
{
hardware ethernet :0c::4b:5c:be; #指定dhcp客户的mac地址
fixed-address 192.168.63.130; #给指定的mac地址分配ip
option host-name "target.host.com";
}
}

启动DHCP服务:

service dhcpd start

重启网络:

service network restart

测试效果:

ifdown eth0
ifup eth0

可以看到,客户端成功从DHCP服务器获取到了IP地址

4. DHCP协商交互过程

这张有限状态机的转换图非常好的说明了DHCP的协商交互过程,我们用wireshark抓包软件来亲身实验一下DHCP的交互过程

0x1: DHCPDISCOVER

客户端在向内网中的DHCP服务器请求进行DHCP交互

0x2: DHCPOFFER

DHCP服务器对客户端的请求进行回应,在回应之前,DHCP会先对将要进行分配的IP进行ARP确认,确认当前子网没有客户端在使用这个IP

可以看到,DHCP的OFFER回应中包含了DNS服务器IP、默认网关等信息

0x3: DHCPREQUEST

客户端会选择"最先"接收到的OFFER数据包指示的IP地址,发起REQUEST请求,请求租约

0x4: DHCPASK

DHCP回应客户端的租约请求

同样,DHCP服务器的回应数据包中包含了DNS、子网掩码、网关、租约时间等信息

在确认租约之后,DHCP服务器还会发送一个PING包进行确认

以上就是客户端和DHCP服务器的租约交互过程,renew、lease过程原理类似,大家可以用wireshark抓包进行实验

Copyright (c) 2014 LittleHann All rights reserved

DHCP协议格式、DHCP服务搭建、DHCP协商交互过程入门学习的更多相关文章

  1. 反射实现Model修改前后的内容对比 【API调用】腾讯云短信 Windows操作系统下Redis服务安装图文详解 Redis入门学习

    反射实现Model修改前后的内容对比   在开发过程中,我们会遇到这样一个问题,编辑了一个对象之后,我们想要把这个对象修改了哪些内容保存下来,以便将来查看和追责. 首先我们要创建一个User类 1 p ...

  2. Linux 之dhcp服务搭建

    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议 dhcp服务器端监控端口67 涉及的配置文件:/etc/dhcp/dhcpd ...

  3. RouterOS安装以及搭建DHCP PPPoE PPTP L2TP服务

    1.安装routeros https://mikrotik.com/download 网站下载routeros镜像 vdi格式 :VirtualBox默认创建的硬盘文件格式 vmdk格式:VMware ...

  4. 协议分析 - DHCP协议解码详解

    协议分析 - DHCP协议解码详解 [DHCP协议简介]         DHCP,全称是 Dynamic Host Configuration Protocol﹐中文名为动态主机配置协议,它的前身是 ...

  5. Linux-ftp服务搭建

    云服务器ESC 部署vsftpd服务 记一次ftp服务搭建的采坑过程,这个坑一直卡了很久时间,都给忘记了.最近由于公司项目需要部署FTP,经过各种采坑,终于把这个坑给填上了.废话不多说,开干 环境说明 ...

  6. 搭建DHCP服务实现动态分配IP地址-NTP网络时间同步

    本节所讲内容: DHCP服务器工作原理 使用DHCP为局域网中的机器分配IP地址 使用DHCP为服务器分配固定IP地址 ntpdate加计划任务同步服务器时间   实验环境: 服务端:xuegod63 ...

  7. DHCP服务搭建

    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP ...

  8. centos DNS服务搭建 DNS原理 使用bind搭建DNS服务器 配置DNS转发 配置主从 安装dig工具 DHCP dhclient 各种域名解析记录 mydns DNS动态更新 第三十节课

    centos  DNS服务搭建  DNS原理  使用bind搭建DNS服务器 配置DNS转发 配置主从  安装dig工具  DHCP  dhclient  各种域名解析记录  mydns DNS动态更 ...

  9. 24、dhcp服务搭建

    1.dhcp介绍: DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,DHCP 协议主要是用来自动为局域网中的客户机分配 TCP/IP 信息的网络协 ...

随机推荐

  1. java9-5 修饰符

    1. 修饰符: 权限修饰符:private,默认的,protected,public 状态修饰符:static,final 抽象修饰符:abstract 类: 权限修饰符:默认修饰符,public 状 ...

  2. Android SQLite (五 ) 全面详解(三)

    SQLite约束 约束是在表的数据列上强制执行的规则.这些是用来限制可以插入到表中的数据类型.这确保了数据库中数据的准确性和可靠性.约束可以是列级或表级.列级约束仅适用于列,表级约束被应用到整个表. ...

  3. 【转】【C#】异常类 Exception 枚举所有类型的异常

    一.基础 在C# 里,异常处理就是C# 为处理错误情况提供的一种机制.它为每种错误情况提供了定制的处理方式,并且把标识错误的代码与处理错误的代码分离开来. 对.NET类来说,一般的 异常类System ...

  4. Linux 网络编程一(TCP/IP协议)

    以前我们讲过进程间通信,通过进程间通信可以实现同一台计算机上不同的进程之间通信. 通过网络编程可以实现在网络中的各个计算机之间的通信. 进程能够使用套接字实现和其他进程或者其他计算机通信. 同样的套接 ...

  5. [转]Windows网络编程学习-面向连接的编程方式

    直接附上原文链接:windows 网络编程学习-面向连接的编程方式

  6. RTX与SVN使用手册适用于新手

    一.RTX使用说明 1.下载 http://rtx.tencent.com/rtx/download/index.shtml rtx下载地址(可以只下载客户端) 2.使用方法 1)点击最下面的服务器设 ...

  7. sklearn分类

    近期的事务与sklearn有关,且主要用到了分类.在此做一点笔记 进行分类大概涉及三个知识点: 一. 分类器 二.特征选择 三.模型选择 一.分类器(Classification) 实例一:plot_ ...

  8. 第10章 系统级I/O

    第10章 系统级I/O 10.1 Unix I/O 一个Unix文件就是一个m个字节的序列:B0,B1,…,BK,…,Bm-1 Unix I/O:一种将设备优雅地映射为文件的方式,允许Unix内核引出 ...

  9. 20145324 20145325《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验

    实验五报告链接为:http://www.cnblogs.com/SJZGM10/p/6106668.html

  10. 招聘一个靠谱的ios

    1. 风格纠错题 修改方法有很多种,现给出一种做示例: 最终改为: 下面对具体修改的地方, 2. 什么情况使用 weak 关键字,相比 assign 有什么不同? 什么情况使用 weak 关键字? 1 ...