声明:本文关于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

1 1 6 0
0x0fe29f3b
0 0x000
0,0,0,0
0,0,0,0
0,0,0,0
0,0,0,0
IntelCor_83:C1:88(d0:7e:35:83:c1:81)

没有填进表格的内容:

2)Offer

2 1 6 0
0x0fe29f3b
0 0x000
0,0,0,0
192.168.1.102
0,0,0,0
0,0,0,0
IntelCor_83:C1:88(d0:7e:35:83:c1:81)

没有填进表格的内容:

3)Request

1 1 6 0
0x0fe29f3b
0 0x000
0,0,0,0
0,0,0,0
0,0,0,0
0,0,0,0
IntelCor_83:C1:88(d0:7e:35:83:c1:81)

4)Ack

2 1 6 0
0x0fe29f3b
0 0x000
0,0,0,0
192.168.1.102
0,0,0,0
0,0,0,0
IntelCor_83:C1:88(d0:7e:35:83:c1:81)

结合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地址了。

wareshark网络协议分析之DHCP的更多相关文章

  1. wareshark网络协议分析之ARP

    一.ARP协议简介 简单的说ARP协议就是实现ip地址到物理地址的映射.当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48bit的以太网地址(物理地址)来确定网络接口的. ARP ...

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

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

  3. PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析

    Python黑帽编程1.5  使用Wireshark练习网络协议分析 1.5.0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks At ...

  4. linux 网络协议分析---3

    本章节主要介绍linxu网络模型.以及常用的网络协议分析以太网协议.IP协议.TCP协议.UDP协议 一.网络模型 TCP/IP分层模型的四个协议层分别完成以下的功能: 第一层 网络接口层 网络接口层 ...

  5. TFTP网络协议分析---15

    TFTP网络协议分析 周学伟 文档说明:所有函数都依托与两个出口,发送和接收. 1:作为发送时,要完成基于TFTP协议下的文件传输,但前提是知道木的PC机的MAC地址,因为当发送TFTP请求包时必须提 ...

  6. 网络协议分析之wireshark---抓包使用

    Wireshark基本介绍和学习TCP三次握手 之前写过一篇博客:用 Fiddler 来调试HTTP,HTTPS. 这篇文章介绍另一个好用的抓包工具wireshark, 用来获取网络数据封包,包括ht ...

  7. linux网络协议

    网络协议 本章节主要介绍linxu网络模型.以及常用的网络协议分析以太网协议.IP协议.TCP协议.UDP协议 一.网络模型 TCP/IP分层模型的四个协议层分别完成以下的功能: 第一层 网络接口层 ...

  8. Wireshark数据抓包分析——网络协议篇

                   Wireshark数据抓包分析--网络协议篇     watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF4dWViYQ==/ ...

  9. UNIX网络编程——分析一帧基于UDP的TFTP协议帧

    下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...

随机推荐

  1. TCP和UDP 协议发送数据包的大小

    在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,这里仅对像ICQ一类的发送聊天消息的情况作分 ...

  2. 七牛上传ipa后自动生成plist文件

    1.利用模板技术动态生成plist文件的内容:(模板内容和data替换为plist需要的内容) //artTemplate <script src="js/template.js&qu ...

  3. SharpZIP Lib

    Home:http://www.icsharpcode.net/opensource/sharpziplib/   转至:https://github.com/leowangzi/DanielLib/ ...

  4. 普通摄像机也能做互联网HLS(m3u8)、RTMP、HTTP-FLV直播?是的,采用基于GBT28181协议的EasyGBS流媒体服务

    在之前的一篇博客<EasyNVR和EasyDSS云平台联手都不能解决的事情,只有国标GB28181能解决了>我们介绍了很多应用场景里面,RTSP和RTMP直播协议都无法满足应用需求时,国标 ...

  5. 记录-java(jxl) Excel导入数据库

    本内容主要包括(文件上传.excel2003数据导入数据库)excel导入数据库功能需要jxl  jar包支持 下面是文件上传的前端测试代码 <%@ page language="ja ...

  6. sparse matrix

    w https://en.wikipedia.org/wiki/Sparse_matrix 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB - Bin的专栏 - 博客园ht ...

  7. 初学习-python打印乘法表、正方形、三角形

    for x in range(1,4): for o in range(0,x-1): print('*',end='') pass pass print('*') print('\n')print( ...

  8. js实现还可输入多少个字

    // 还可输入的字数个数 function checkLength(obj, len) { var maxChars = len; if (obj.value.length <= maxChar ...

  9. Windows系统Python 安装第三方模块时,提示pip版本有问题

    如果按照提示输入python -m pip install --upgrade pip 还不行, 那么执行easy_install --upgrade pip 即可 参考:https://stacko ...

  10. 实现对第三方应用任意SO注入

    实现对第三方应用任意SO注入 0x01 应用在Android中运行,从外部对该进程可以进行任意SO文件动态注入,就是应用动态运行我们的SO文件 0x02 基本的逻辑是: 1.    获取目标进程的pi ...