ARP 与 DHCP 协议详解与抓包分析
首先我们回顾下一个 http 请求的大致流程:
- 给 http 正文加一层 http 头
- 给上层报文加一层 tcp 头
- 给上层报文加一层 ip 头
- 给上层报文加一层 mac 头
先不思考为什么有这样的层次,以及每一层为什么要这么做,根据上述图片和描述,可以知道一个请求发出,需要添加 ip 地址头和 mac 地址头
,如果不添加,这个请求就无法发送出去。
ARP 协议
ARP 协议:Address Resolution Protocol 地址解析协议,既然是地址解析,解析的是什么呢?
答案是根据 IP 地址获取 MAC 地址,为什么需要有这样的协议呢,当我们访问一个域名,例如 www.baidu,com
,会由 DNS 服务器解析出对应的 ip 地址,并向对方发送一个请求,请求对应的界面,对方收到后,把界面返回,展示在了电脑上。
但是 DNS 服务只能根据域名解析出 ip 地址,我们在上面说过,一个包的发送一定要加上 mac 头呢,这个 mac 头该怎么获取呢,这里并不是直接靠的 ARP 协议;在获取到对方的 ip 后(假设 ip 是 110.110.110.110),本机会根据自己的 ip 地址和子网掩码与对方的 ip 进行运算(涉及到的概念:CIDR、子网掩码、同一网段),如果在同一网段,说明咱俩离得很近(逻辑上),没必要再发送到网关走路由器,直接在本地大吼一声(发一个包):谁的 IP 是 110.110.110.110,跟我说下你的 mac 地址,你可能会想:前面不是提到一个包必须有 mac 头才能发出吗,这是怎么发的,有一个特殊的 mac 地址,所有比特位全1(ff:ff:ff:ff:ff:ff)
是一个特殊的 mac 地址,局域网内所有的主机在收到后,都要取下 mac 地址看里面的内容。这时 ip 是 110.110.110.110 发现问的是自己,就回复说,这是我的 ip,我的 mac 地址是 aa:aa:aa:aa:aa:aa,主机获取到这个 mac 地址后,就可以加上 mac 头把包发送出去了。
上面有一些注意的点:
- 根据是否在同一网段走 ARP 协议或发送到网关(获取网关 mac 地址同理,网关 ip 静态配置好了)
- mac 地址全1(也叫广播地址,ip 全1同理),则局域网内所有主机要拆下来确认内容,注意是局域网,如果不是局域网,这个包转发出去后,所有的主机都要确认,会对网络造成非常大的影响
DHCP 协议
现在问题来了,我们主机的 ip 是怎么来的呢?如果你使用 linux 配置过静态 ip,你可能知道会去修改一个网卡的配置文件,手动配置为 static,写死 ip 和网关。但是我们打开电脑,连接 wifi 之后也可以上网了,这个时候的 ip 是怎么来的呢?
DHCP:动态主机配置协议(Dynamic Host Configuration Protocol),就是来做这个工作的。你的电脑会有网卡,这个网卡是生产商写死的,有全球唯一的一个 mac 地址,当你连接 wifi 之后,大概会发生以下几个步骤:
- 主机发送一个报文,内容大概是:有没有人啊,我刚来,没 ip,我的 mac 地址是***,给我分配个 ip 呗,重要字段如下:
源mac 目标mac 源ip 目标ip
主机网卡mac地址 ff:ff:ff:ff:ff:ff 00:00:00:00 255:255:255:255
注意这里的目标 mac 和目标 ip 是都是广播地址
,DHCP 服务器收到后,就知道了这个信息,这次请求称为 DHCP Discover
- DHCP 服务器收到包后,分出来一个 ip,给请求主机发过去,内容大概是:来,我给你分配一个ip,你用吧,重要字段如下:
源mac 目标mac 源ip 目标ip
DHCP服务器mac地址 主机网卡mac地址 DHCP服务器ip地址 欲分配的ip地址
这里其实有一个疑问,这只是我想给你分配的 ip,你还没有绑定到网卡上,为什么目标 ip 就可以写成这个 ip 了呢,这次回复称为 DHCP Offer
- 如果你在局域网里配置了多个 DHCP 服务器,主机有可能收到多个 offer,一般选择最先抵达的进行回复,内容大概是:我的mac地址是***,准备接收这个 offer 了,其它的你们留着给新来的吧,重要字段如下:
源mac 目标mac 源ip 目标ip
主机网卡mac地址 ff:ff:ff:ff:ff:ff 00:00:00:00 255:255:255:255
注意这里的目标 mac 和目标 ip 是都是广播地址
,因为需要通知到其他的 DHCP 服务器它接收的是哪个 offer,否则其他服务器不知道这个 ip 是否分配出去了,要等待,这次请求称为 DHCP Request
- DHCP 服务器收到后进行回复,大概内容:okok,这就是你的 ip 了,会把相关的一些配置信息也发送过来
源mac 目标mac 源ip 目标ip
DHCP服务器mac地址 主机网卡mac地址 DHCP服务器ip地址 欲分配的ip地址
这次请求称为 DHCP Ack
以上就是 DHCP 的主流程,其实中间还夹杂了一些 ARP 的报文,比如我的 ACK 发送出去后,如果在网络中丢失了怎么办,对方还能分配上吗?怎么确认呢?我给对方分配了一个 ip,万一这个 ip 已经有人静态配置过了呢?解决方式就是:在分配前和分配后都发 ARP 报文确认
,这一点在下面的报文分析中也有体现。
同时,DHCP 分配后肯定需要回收,不能说分出去了你下线了都不知道,在租用的 ip 达到一段时间后,一般在租期过去 50% 的时候,直接向为其提供 IP 地址的 DHCP Server 发送 DHCP Request 消息包。客户机接收到该服务器回应的 DHCP ACK 消息包,会根据包中所提供的新的租期以及其他已经更新的 TCP/IP 参数,更新自己的配置
DHCP 报文分析
抓包工具:wireShark
抓包方式:首先开启飞行模式,接着关闭飞行模式,打开 wifi,在拦截到的包中过滤出协议是 DHCP
和 ARP
的报文,如下:
DHCP Discover
与上述协议讲解中基本一致,但是默认情况下,不会直接请求希望分配的 ip,这里可能是我连上 wifi 后,开启了飞行模式,又重新连的,返回了之前租用的 ip(192.168.0.121)
我们看报文顺序可以注意到,序号 213 的 discover 报文后,发起了多个 arp 报文,目的 ip 是广播,内容是:有谁在用 192.168.0.121 的 ip,这里是要确认这个 ip 没有主机在使用
DHCP Offer
DHCP Request
注意:此时只是表达我想接受这个 offer,并没有将 ip 绑定到网卡上,因此依然需要广播通知
DHCP Ack
在 ACK 确认完后,DHCP Server 还会发 ARP,看看这个 ip 是否真的被绑定了
DHCP 协议就像租房子一样,首先我广播发送一个请求,说我新来的,没房子呀,中介(DHCP 服务器)回复说我给你推荐一个,这个时候可能有多个中介联系我,我选择一个最先找我的,广播说我要租你这个房子,其它中介收到后就知道你不要他们的房子,他们可以继续租给其他人了;你要租房子的这个中介收到你的租赁请求后,说没问题,给你确认一下,把租期之类的配置信息也发给你。你如果想续租,在租期接近一半的时候可以请求续租…