wareshark网络协议分析之DHCP

声明:本文关于DHCP协议介绍部分摘自百度百科

一、DHCP协议介绍:

    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。DHCP有3个端口,其中UDP67和UDP68为正常的DHCP服务端口,分别作为DHCP Server和DHCP Client的服务端口;546号端口用于DHCPv6 Client。

    作用:

    1、 保证任何IP地址在同一时刻只能由一台DHCP客户机所使用。

    2、 DHCP应当可以给用户分配永久固定的IP地址。

    3、 DHCP应当可以同用其他方法获得IP地址的主机共存(如手工配置IP地址的主机)。

    4、 DHCP服务器应当向现有的BOOTP客户端提供服务。

交互过程如下图所示:

    其工作流程为:

    1、DHCP Client以广播的方式发出DHCP Discover报文。

    2、所有的DHCP Server都能够接收到DHCP Client发送的DHCP Discover报文,所有的DHCP Server都会给出响应,向DHCP Client发送一个DHCP Offer报文。

DHCP Offer报文中“Your(Client) IP Address”字段就是DHCP Server能够提供给DHCP Client使用的IP地址,且DHCP Server会将自己的IP地址放在“option”字段中以便DHCP Client区分不同的DHCP Server。DHCP Server在发出此报文后会存在一个已分配IP地址的纪录。

    3、DHCP Client只能处理其中的一个DHCP Offer报文,一般的原则是DHCP Client处理最先收到的DHCP Offer报文。DHCP Client会发出一个广播的DHCP Request报文,在选项字段中会加入选中的DHCP Server的IP地址和需要的IP地址。

    4、DHCP Server收到DHCP Request报文后,判断选项字段中的IP地址是否与自己的地址相同。如果不相同,DHCP Server不做任何处理只清除相应IP地址分配记录;如果相同,DHCP Server就会向DHCP Client响应一个DHCP ACK报文,并在选项字段中增加IP地址的使用租期信息。

   5、DHCP Client接收到DHCP ACK报文后,检查DHCP Server分配的IP地址是否能够使用。如果可以使用,则DHCP Client成功获得IP地址并根据IP地址使用租期自动启动续延过程;如果DHCP Client发现分配的IP地址已经被使用,则DHCP Client向DHCPServer发出DHCP Decline报文,通知DHCP Server禁用这个IP地址,然后DHCP Client开始新的地址申请过程。

   6、DHCP Client在成功获取IP地址后,随时可以通过发送DHCP Release报文释放自己的IP地址,DHCP Server收到DHCP Release报文后,会回收相应的IP地址并重新分配。

二、wareshark网络抓包分析

(1)抓包过程:

运行环境:win10

说明:DHCP协议是在开始网络连接,动态分配ip地址阶段使用的,所以需要在wareshark抓包的过程中,需要让主机先释放,然后再获取一次ip。

步骤:

1)进入命令行cmd,然后执行命令 ipconfig /release  ,释放主机当前的ip。

2)打开wareshark,开始抓包,显示过滤器中输入bootp,然后回车,用来只显示DHCP协议包。

3)进入命令行cmd,然后执行命令 ipconfig /renew     ,让主机重新获得一个网络配置,包括新的ip。

正常情况下,应该已经抓到DHCP包了,结果如下:

(2)协议分析

 DHCP报文格式:

字段含义:

OP:若是 client 送给 server 的封包,设为 1 ,反向为 2。

HTYPE:硬件类别,Ethernet(以太网) 为 1。

HLEN:硬件地址长度, Ethernet 为 6。

HOPS:若封包需经过 router (路由器)传送,每站加 1 ,若在同一网内,为 0。

xid:事务ID,由客户端选择的一个随机数,被服务器和客户端用来交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户端设置,由服务器返回,为32位整数。

SECONDS:由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数。

FLAGS:从 0 到 15 共 16 bits ,最左一 bit 为 1 时表示 server 将以广播方式传送封包给 client(为0时表示以单播的形式传输),其余尚未使用。

ciaddr:要是 client 端想继续使用之前取得之 IP 地址,则列于这里。

yiaddr:从 server 送回 client 之 DHCP OFFER 与 DHCPACK封包中,此栏填写分配给 client 的 IP 地址。

siaddr:若 client 需要透过网络开机,从 server 送出之 DHCP OFFER、DHCPACK、DHCPNACK封包中,此栏填写开机程序代码所在 server 之地址。

giaddr:若需跨网域进行 DHCP 发放,此栏为 relay agent 的地址,否则为 0。

chaddr:Client 之硬件地址。

sname:Server 之名称字符串,以 0x00 结尾。

file:若 client 需要透过网络开机,此栏将指出开机程序名称,稍后以 TFTP 传送。

options:可选参数域,格式为"代码+长度+数据"。

可以按照下图的方式查看抓包的数据:

整理wareshark收到的4个包:

1)Discover

没有填进表格的内容:

 2)Offer

没有填进表格的内容:

3)Request

4)Ack

结合DHCP报文含义和上述抓包结果可知:DHCP服务器这次给我的PC分配的动态ip是192.168.1.102,在命令行中查了一下,果然是的,其他结果自己对着报文格式体验了一下。

另外根据下面4个包大概可以验证DHCP协议的建立流程:

1)客户端发送给DHCP服务器,请求请求一个ip,由于此时客户端还没有IP地址,所以为ip为0,0,0,0,而客户端也不知道服务器的地址,所以以广播形式发送。报文中还包括客户端的mac地址,主机名字等(应该是用于在服务器中进行区分,以便可以依据客户端要求分配上一次使用的ip等)

2)周围的DHCP服务器收到客户端请求之后,拿出一个没有使用的ip地址放给客户端(很多DHCP服务器都会受到请求也都会发送这个包),根据抓包结果目的地址192.168.1.102,也就是字段中yiaddr的值,这意思是以单播的形式发送的(好像与很多资料不符),不过根据协议字段的含义,如果flags的最左边一bit是1的话,以广播形式发送,为0的话,以单播的形式发送,所以根据之前flags的值为0x000,所以这里以单播形式发送也对的上,只是不清楚明明DHCP协议是客户端用来索取ip的,这里还没有分配完,怎么就可以用了。。。(可能是根据客户端提供的mac地址来的?这里作为一个小菜鸟还是有点不清楚)。

3)客户端给DHCP发送一个确认信息,这里面包括想要的ip地址(从上一步多个CHCP服务器中提供的ip地址选一个,一般选第一个收到的),这里还以广播的形式发送,被接收ip地址的dhcp服务器要再发送一个ack包,没被接受的dhcp服务器撤销刚刚给出的ip地址,以便给其他客户机使用。

4)发出ip地址被接收的dhcp服务器发送一个确认包,这回客户端接收到确认包就可以正式使用这个ip地址了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

linux下DHCP服务原理总结

DHCP(全称Dynamic host configuration protocol):动态主机配置协议 DHCP工作在OSI的应用层,可以帮助计算机从指定的D...

3256
来自专栏Hadoop实操

11.如何为CDSW集成RedHat7的OpenLDAP认证

在前面的文章中Fayson介绍了CDH各个组件与OpenLDAP的集成,具体可以看Fayson更新的《从入门到精通 - Fayson带你玩转CDH》文章里面包含...

1223
来自专栏zhisheng

Spring Boot 2.0系列文章(四):Spring Boot 2.0 源码阅读环境搭建

转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/

1921
来自专栏别先生

creating server tcp listening socket 127.0.0.1:6379: bind No error

参考链接:https://blog.csdn.net/n_fly/article/details/52692480

1631
来自专栏大魏分享(微信公众号:david-share)

本地&远程访问一个EJB | 从开发角度看应用架构4

1722
来自专栏DevOps时代的专栏

Jenkins 在 Tomcat 中的部署及代码静态检查工具集成

在安装了 Jenkins 运行所需的依赖(主要是 JDK)之后,可以通过如下步骤简单快速地部署 Jenkins:

1532
来自专栏Java技术栈

Spring Boot核心配置

启动类 在包根目录下添加启动类,必须包含main方法,再添加Spring Boot启动方法: SpringApplication.run(SampleContr...

3536
来自专栏一个会写诗的程序员的博客

Springboot使用velocity模板引擎第五章 使用velocity模板引擎

最爽的Web组合开发就是Intellij IDEA + Maven + Spring Boot + Scala + Velocity + Boostrap + ...

2643
来自专栏世界第一语言是java

springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

6653
来自专栏Core Net

Ios8之后, 定位的delegate不能触发的问题

2998

扫码关注云+社区

领取腾讯云代金券