声明:本文关于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. php中使用curl来post一段json数据

    场景:在调用第三方接口时经常需要使用到curl进行数据交互,在初次使用时遇到一些小问题,记录下来随时查阅. 封装curl相关方法便于使用,方法如下: /** * @param $url * @para ...

  2. 面试十大常见Java String问题

    本文介绍Java中关于String最常见的10个问题: 1. 字符串比较,使用 "==" 还是 equals() ?简单来说, "==" 判断两个引用的是不是同 ...

  3. 【BZOJ4817】[Sdoi2017]树点涂色 LCT+线段树

    [BZOJ4817][Sdoi2017]树点涂色 Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路 ...

  4. mysql 日期加减天数

    MySQL 为日期增加一个时间间隔:date_add() now()       //now函数为获取当前时间 select date_add(now(), interval 1 day); - 加1 ...

  5. 数字雨(Javascript使用canvas绘制Matrix,效果很赞哦)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 0x09 Python连接MySQL数据库

    本文介绍Python3连接MySQL的第三方库--PyMySQL的基本使用. PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中 ...

  7. 实验一中的OOP思想

    子类继承父类    父类中声明了接口变量   接口AB中声明了抽象方法 ab 在子类中 可以用这样通俗的语句写程序: while (!(this.termination.shouldTerminate ...

  8. F110的几个功能

    1.F-59, 没有找到函数, 使用BDC BAPI_ACC_DOCUMENT_POST 必须创建有借贷2 line 的凭证,需求要参考原始的SA类型凭证, 创建一个单条的 科目 = 供应商 的凭证, ...

  9. LeetCode:数据库技术【175-178】

    LeetCode:数据库技术[175-178] LeetCode已经刷完200道题目,但这只是开始,下一段时间,仍然把刷题作为重点,争取再次完成200道,本篇博客将会带大家熟悉一些数据库面试题,从简单 ...

  10. Python学习进程(12)模块

        模块让你能够有逻辑地组织你的Python代码段.     (1)python模块: 模块化的好处: 1.把相关的代码分配到一个模块里能让你的代码更好用,更易懂. 2.模块也是Python对象, ...