DHCP协议
# 1. 介绍
电脑通常都是通过 DHCP 动态获取 IP 地址,大大省去了配 IP 信息繁琐的过程。
# 2. 电脑通过DHCP获取IP的四个步骤
DHCP 客户端进程监听的是 68 端口号,DHCP 服务端进程监听的是 67 端口号。
- 客户端首先发起 DHCP 发现报文(DHCP DISCOVER) 的 IP 数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的地址,所以使用的是 UDP 广播通信,其使用的广播目的地址是 255.255.255.255(端口 67) 并且使用 0.0.0.0(端口 68) 作为源 IP 地址。DHCP 客户端将该 IP 数据报传递给链路层,链路层然后将帧广播到所有的网络中设备。
- DHCP 服务器收到 DHCP 发现报文时,用 DHCP 提供报文(DHCP OFFER) 向客户端做出响应。该报文仍然使用 IP 广播地址 255.255.255.255,该报文信息携带服务器提供可租约的 IP 地址、子网掩码、默认网关、DNS 服务器以及 IP 地址租用期。
- 客户端收到一个或多个服务器的 DHCP 提供报文后,从中选择一个服务器,并向选中的服务器发送 DHCP 请求报文(DHCP REQUEST进行响应,回显配置的参数。
- 最后,服务端用 DHCP ACK 报文对 DHCP 请求报文进行响应,应答所要求的参数。
一旦客户端收到 DHCP ACK 后,交互便完成了,并且客户端能够在租用期内使用 DHCP 服务器分配的 IP 地址。
如果租约的 DHCP IP 地址快期后,客户端会向服务器发送 DHCP 请求报文:
- 服务器如果同意继续租用,则用 DHCP ACK 报文进行应答,客户端就会延长租期。
- 服务器如果不同意继续租用,则用 DHCP NACK 报文,客户端就要停止使用租约的 IP 地址。
# 3. 特点
DHCP 交互中,全程都是使用 UDP 广播通信。
但是广播的话,只能在某个网段中进行传播,如果DHCP不在同一个网段该怎么办呢?
这个时候就会使用 DHCP 中继代理
# 4. DHCP 中继代理
有了 DHCP 中继代理以后,对不同网段的 IP 地址分配也可以由一个 DHCP 服务器统一进行管理。
- DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到这个广播包以后,再以单播的形式发给 DHCP 服务器。
- 服务器端收到该包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包广播给 DHCP 客户端 。
因此,DHCP 服务器即使不在同一个链路上也可以实现统一分配和管理IP地址。
# 5. 我们自己的电脑有设置相应的DHCP服务器吗?我们自己的电脑是怎么获取ip地址的
电脑不需要自己手动设置DHCP服务器,电脑会先通过DHCP DISCOVERY去当前网络内广播DHCP发现包,所以电脑会自动根据上面的协议去获取DHCP的服务器,并从DHCP那里去获取对应的数据。
# 6. 家庭中的DHCP
其实我们连接的路由器就包含了DHCP服务,我们可以在路由器上配置相应的ip地址池、子网等,如图所示,是家用路由器的一个配置页面:
参考:https://cloud.tencent.com/developer/article/1443040 (opens new window)
# . 抓包实战
抓包需要明确的几个点:
- 在哪个网卡上抓包。
- 抓什么包?DHCP。
# ①明确网卡
一般我们电脑连接wifi,会有一个专门的网卡
网卡为en0
# ②抓包
方法一:使用wireshark监控
方法二: 使用命令监控
tcpdump -i en0 -w capture.pcap
# ③释放DHCP 分配的ip
window: ifconfig /release
linux: sudo ipconfig set en0 DHCP
# ④重新DHCP分配
window: ifconfig /renew
linux: sudo ipconfig set en0 BOOTP
# ⑤wireshark条件过滤
# ⑥逐条分析
- DHCP Discovery
DHCP使用的是UDP协议,目标地址为广播地址,本地地址为0.0.0.0
,向该网络内发送discovery包
- DHCP offer
注意上面的Dst应该为255.255.255.255 ,这里应该是网卡地址没有释放掉,或者做了优化
- DHCP request
- DHCP Ack