当遇到L2层之上的连接性问题时,需要抓取tcpdump查看相关协议是否正常。
结合协议工作原理定位问题。
其中,涉及到ip地址相关的协议主要有:DHCP,ARP
DHCP是动态主机配置协议,用于动态分配ip地址。
ARP是地址解析协议,用于ip地址和mac地址映射。
1. DHCP
DHCP过程中,涉及两个主体:DHCP_Client, DHCP_server。client首次申请ip地址时的交互过程中涉及到四次握手,如下图
Client Server
| 广播dhcp discover |
| ---------------------------------> |
| |
| DHCP offer (ip) |
| <----------------------------- |
| |
| DHCP request |
| ------------------------------> |
| |
| ACK |
| <-------------------------- |
另一种情况是,server已经提供给client ip地址,在网络重新连接时,client只需发送dhcp request帧请求使用之前的ip地址,
如果server回复ACK帧,则client可使用之前申请的ip地址,无需重新申请;如果server回复NAK,则client需要重新走DHCP流程。
client Server
| DHCP request |
| ------------------------------> |
| |
| ACK / NAK |
| <-------------------------- |
除了上述4中报文(discover、offer、request、ACK/NAK),DHCP还有一种报文:DHCP decline,这个报文用来告诉路由器"当前IP不想再用,请将我的这个MAC和这个IP的对应关系从你的ARP cache中删除"。
这个报文一般不会出现,但是ip冲突时有很大的作用。
2. ip冲突时,arp的表现。
假如当前有设备A、B,其对应的mac分别为MAC-A,MAC-B,在连接路由时:
设备A先连接路由,获得ip地址IP-addr,此时,路由的arp cache会记录A的ip及其对应的mac:IP-addr----MAC-A;
然后,B将自己的ip设置为IP-addr,并去连接路由,路由arp cache相应的记录会更新为:IP-addr---MAC-B;
现象来了,后来的B可以和路由通信,但是A好像链路是通的,但是无法通信。
接下来,B断开与路由的连接,A仍然无法与路由获得通信,因为路由的arp cache不会主动更新。那么A如何才能重新连接路由呢?
DHCP decline报文就有用武之地了,A发送DHCP decline报文让路由清除其对应的arp cache,并重新DHCP流程,就ok了。
3. ip冲突的可能性:
DHCP server不会重复分配ip,但不保证别的设备不主动使用ip池外的ip、或这DHCP server已经分配的ip。