DHCP服务器的设计
介绍
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
DHCP协议采用客户端/服务器模式。客户机登录服务器时可以自动获得DHCP服务器分配的IP地址和子网掩码,这也是现在接入网技术中供应商给用户(账号)提供IP地址的手段。
原理
端口
首先DHCP是基于UDP的两个端口实现的,DHCP提供服务时,客户端以68号端口进行数据传输,服务器端以67号端口进行数据传输。
DHCP报文类型
DHCP一共有8中报文,分别为DHCP Discover、DHCP Offer、DHCP Request、DHCP ACK、DHCP NAK、DHCP Release、DHCP Decline、DHCP Inform。
DHCP Discover: DHCP客户端在请求IP地址时并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送Discover请求报文,以发现网络中的DHCP服务器。所有收到Discover报文的DHCP服务器都会发送应答报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。
DHCP Offer:DHCP服务器收到Discover报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个Offer报文,发送给DHCP客户端,告知用户本服务器可以为其提供IP地址。但这个报文只是告诉DHCP客户端可以提供IP地址,最终还需要客户端通过ARP来检测该IP地址是否重复。
DHCP Request:DHCP客户端可能会收到很多Offer请求报文,所以必须在这些应答中选择一个。通常是选择第一个Offer应答报文的服务器作为自己的目标服务器,并向该服务器发送一个广播的Request请求报文,通告选择的服务器,希望获得所分配的IP地址。另外,DHCP客户端在成功获取IP地址后,在地址使用租期达到50%时,会向DHCP服务器发送单播Request请求报文请求续延租约,如果没有收到ACK报文,在租期达到87.5%时,会再次发送广播的Request请求报文以请求续延租约。
DHCP ACK:DHCP服务器收到Request请求报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录,如果有则发送ACK应答报文,通知用户可以使用分配的IP地址。
DHCP NAK:如果DHCP服务器收到Request请求报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则向DHCP客户端发送NAK应答报文,通知用户无法分配合适的IP地址。
DHCP Release:当DHCP客户端不再需要使用分配IP地址时,就会主动向DHCP服务器发送RELEASE请求报文,告知服务器用户不再需要分配IP地址,请求DHCP服务器释放对应的IP地址。
DHCP Decline:DHCP客户端收到DHCP服务器ACK应答报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则会向DHCP服务器发送Decline请求报文,通知服务器所分配的IP地址不可用,以期获得新的IP地址。
DHCP Inform:DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则向DHCP服务器发送Inform请求报文;DHCP服务器在收到该报文后,将根据租约进行查找到相应的配置信息后,向DHCP客户端发送ACK应答报文。目前基本上不用了。
DHCP报文格式
我们通过抓包看一下DHCP的报文:
1.Message type:Boot Request(1)当为1时表示是client的请求,为2时是server的应答
2.Hardware type是网络硬件地址类型
3.Hardware address length表示网络硬件地址长度(6Bytes表示是以太网类型的MAC地址)
4.HOPS表示跳数,是当前的DHCP报文经过的DHCP RELAY的数目,每经过一个DHCP中继,此字段就会加1;当这个字段大于4时,DHCP报文直接丢弃。
5.Transaction id:事务ID,是DHCP请求报文时选择的随机数
6.Elapsed boot time描述,表示client开始DHCP请求后的时间流逝秒数
7.flags标志
8.Client self-assigned IP address:客户机IP地址
9.Client IP address:分配给client的IP地址
10.Next Server IP address:服务器IP地址
11.Relay AgentDHCP:中继代理IP地址
12.Client Hardware address客户机硬件地址MAC
13.Client Hardware address padding:客户机硬件MAC填充地址
14.Host Name:服务器的主机名
15.Boot File name:是client的启动配置文件名
16.Magic cookie是服务器可以根据这个cookie直到该用户是否需要重新登录。
之后的字段会根据报文类型而有不同的改变:
17.DHCP Message Type:此字段表示DHCP报文类型
18.DHCP Server Identifier是DHCP Server的报文类型
19.Client identifier:客户端报文类型
交互过程
通过观察抓包顺序可以知道是,客户端首先从68端口发出广播(UDP报文)即discover报文寻找DHCP服务器,请求租用IP地址。该广播包中的源IP地址为0.0.0.0,目标IP地址由于是广播所以为255.255.255.255,报文中还包含客户机的MAC地址和计算机名。DHCP服务器会将67端口开启,收到客户端的discover报文后会回应一个offer报文,此报文的源IP地址为服务器的IP,目标IP地址为255.255.255.255,数据报中还包含着提供的IP地址、子网掩码、网关、DNS及租期等信息。
然后客户端就会广播一个request报文,表示自己已经接受了一个DHCP服务器提供的IP地址,广播包中包含所接受的IP地址和服务器的IP地址。服务器在接收到request广播后,会广播返回给客户机一个ACK消息包,表示已经接受了客户机的选择,并将这一IP地址的合法租用以及其他的配置信息都放入该广播包发给客户。此客户此时就已经获得一个可用的IP地址。整体流程如下图:
代码设计
首先工程的结构如下:
---dhcpserver||--DHCPOptionEnum.h|--maker.h--parser.h|--stdafx.h|--Mystruct.h||--DHCPserver.cpp
代码是基于DHCP的原理、报文以及DavidAnson的DHCPLite0的代码逻辑框架。下面将逐一分析一下代码:
main函数
逻辑是首先获取运行环境下的网络设备所有网卡信息,然后以"链表"的形式存储在PIP_ADAPTER_INFO
结构体所声明的AdapterWalker
对象中,然后将需要选择的网卡信息作为输入与bindInterfaceAddress
进行绑定。以上都是初始化信息,主要是为了让用户选择需要进行绑定的网络设备。
然后m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
与setsockopt(m_socket, SOL_SOCKET, SO_BROADCAST, (char*)&optval, sizeof(bool))
将套接字设置为UDP格式,同时通过setsockopt
对套接字的功能进行设置,是套接字是符合我们想做为DHCP的广播环境的。之后创建一个线程thread mThread(ClientListen, bindInterfaceAddress)
用来模拟客户端进行广播消息的交互。
接下来就是服务端与客户端的报文交互了,我们需要处理好的就是报文格式以及相应的判断就行了。主要就是在客户端发来报文后,服务端进行解析(parse),解析完成后再回应一个报文,需要先制作(make)一个报文。通过这样完成报文的交互。
ClientListen
这个函数是在新线程下用来模拟客户端的,所以逻辑是与主函数相同的。由于是线程,可以模拟多个客户。
GetIpFromTable
在这里利用了一个unordered_map的存储方式,因为利用map存储数据不论是插入还是查询的速度都是非常快的。在这个结构里我们将已经申请了IP地址的客户放入这个结构中,如果有就返回信息;如果没有这个客户,则加入这个用户的IP地址及信息。
MyStruct.h
在这里定义了DHCP报文格式的结构体
struct DHCP_PACKET {byte OP;byte HTYPE;byte HLEN;byte HOPS;UINT32 TRANSACTION_ID;UINT16 SECONDS;UINT16 FLAGS;byte ciaddr[4];byte yiaddr[4];byte siaddr[4];byte giaddr[4];byte chaddr[16];byte sname[64];byte file[128];UINT32 magicCode;byte Options[308];
};
同时定义了Packet_Information的结构体:
struct Packet_Information {char HostName[256];USHORT BootFileSize;char MeritDumpFile[256];byte DHCPMessageType;int IPLeaseTime; // clientbyte ServerIdentifier[4]; // clientbyte ClientIdentifier[4];byte ParameterRequestList[256];byte VendorClassIdentifier[256];byte RequestedIPAddress[4];byte Unsupport[256];bool OptionToReplay[256];
};
parser.h与maker.h
这里直接调用了解析与封包的相关函数,主要是对IP地址、端口以及相应数据报格式字段信息的转换,判断与赋值。
DHCPOptionEnum.h
这个头文件定义了DHCP Option的所有情况,利用enum结构进行存储;在主函数中调用时就可以通过数字进行表示与区分。
结果
项目请见:Github
转载于:https://www.cnblogs.com/yunlambert/p/9297358.html
DHCP服务器的设计相关推荐
- 防火墙双机热备,DHCP服务器,核心交换机负载分担及冗余设计
文章目录 目录: 一.防火墙双机热备技术概念 二.配合使用的相关技术指导 三.设计要求及拓扑图 四:配置过程及相应命令 总结 一.防火墙热备概述: 一般而言,防火墙部署于公司网络的出口 ...
- 51CTO第2本书样章曝光:DHCP服务器规划与应用案例
痛苦(手疼)并快乐的写书过程,51CTO博友们对第一本书的关注超出了我的预期,[url]http://blog.51cto.com/book/[/url]第2本书定位在Windows ...
- 鸟哥的Linux私房菜(服务器)- 第十二章、网络参数控管者: DHCP 服务器
第十二章.网络参数控管者: DHCP 服务器 最近更新日期:2011/07/27 想象两种情况:(1)如果你在工作单位使用的是笔记本电脑,而且常常要带着你的笔记本电脑到处跑, 那么由第四章.连上 In ...
- IPIP地址、ipv4ipv6、子网掩码、网段计算、网络广播ID计算、默认网关、DNS服务器、DHCP服务器
文章是学习各方知识的总结,力求言简意赅. IP和IP地址: IP(Internet Protocol)网络之间互连的协议(网协). 网络之间互连的协议:为计算机网络相互连接进行通信而设计的协议.在因特 ...
- WINDOWS SERVER 2003 DHCP服务器全攻略
DHCP服务器全攻略 WINDOWS SERVER 2003从入门到精通之配置DHCP服务器 DHCP(Dynamic Hoat Configure Protocol)动态主机配置协议简称,首先我们先 ...
- DHCP服务器 出现的故障
系统版本:Windows Server 2008 R2 Standard 故障现象:近段时间,我们核心网络DHCP服务器,总是发现有掉线重起现象,大约每10分钟至30分钟不定时会重起. 故障代码:关键 ...
- Windows 网络服务架构系列课程详解(一) ----DHCP服务器的搭建与配置
Windows 网络服务架构系列课程详解(一) ---------DHCP服务器的搭建与配置 实验背景: 企业网络环境中在没有配置DHCP服务器时,经常会遇到这样的情况,用户不懂怎么去配置IP地址 ...
- 搭建ipv6有状态dhcp服务器,思科IPv6技术 IPv6有状态自动配置地址
IPv6支持有状态自动配置获得地址的方式,这涉及到RA消息中的两个bit,M bit和O bit.如图所以为RA消息的格式: M是管理地址的配置标记.如果设置了该位,始发路由器就会利用DHCPv6协议 ...
- 分分钟带你学会DNS、WEB、DHCP服务器的搭建
DNS 一.DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器. 1.dns是一个域名系统,是万 ...
最新文章
- 从CTO到创始人 孙元浩基础软件破局之路
- java 实现 DES加密 解密算法
- Android 开发 Activity里获取View的宽度和高度 转载
- Docker端口映射错误的解决方法
- BAPI_SALESORDER_CREATEFROMDAT2 条件 定价元素
- ORACLE数据加载加本,使用oracle sqlldr加载数据
- 身份证号有效性检验代码 (python)
- DG - 物理Standby角色转换
- C语言SM4算法实现(基于GMSSL)
- ILSVRC2012(ImageNet2012)数据集的下载及ILSVRC2012_img_val数据集的分类
- oracle 逗号连接表是相当于什么
- 基于单片机原理的暖风机控制系统设计-毕设课设资料
- 概率论—期末复习速成笔记(自用)
- 《富爸爸穷爸爸》读书笔记 -- 第一章
- 计算机和工业设计哪个就业前景大,工业设计就业前景女生
- IDEA buid Web项目直接报错,Error:Abnormal build process termination:
- python中噪音是什么意思_Perlin噪声和Python的ctypes
- ThinkPHP3.2/ThinkPHP5对比
- 想做社群营销,没有流量怎么办?流量增长,微信粉丝裂变倍增方法在这里!
- 概率波和杨氏双缝干涉
热门文章
- 【 Grey Hack 】万金油脚本:在路由器上获取shell
- Find the Kth number(找第K大数)
- bash删除文件中含指定内容的行
- linux中fstab文件详解
- React开发(119):代码原因
- 前端学习(3103):vue+element今日头条管理-hello-react案例
- [vue] 在vue事件中传入$event,使用e.target和e.currentTarget有什么区别?
- 前端学习(2704):重读vue电商网站25之保存token
- “约见”面试官系列之常见面试题之第八十九篇之vue生命周期作用(建议收藏)
- 前端学习(2344):高阶组件和函数子组件