lwip之三:arp

三、Arp

1.直观的arp

Wireshark中的arp

 

先看下Comerxinu中的概略图,可以看出arp进入ethernet layer(不再深入ip layer)就直接从ethernet layer出来了。从lwip的代码中也可以很清晰地看出。

 

 

2.arp作用

配对[mac, ip]Mac是固定的(绝大部分场景不会更改),但ip是会随机变动的。当连接一个新的ip(arp表项中不存在),本机会发送arp req,找寻和此ip吻合的mac

第一条是本机arp req,第二条是[192.168.1.168]arp reply。本机收到此reply后,就刷新到本机的arp表项中,然后就可以愉快地交流了。

 

3.arp发生时刻

Ø本机网卡up时,此时为gratuitious arp

其实就是一个签到,表明自己准备加入组织了,组织其他成员是否有用到想用的别名的,没人用就不要吭声(期望没人用),有人用的话就吭声(ip地址冲突了)

Frame_172:sendr ip为空,现在还没有别名;target ip101所欲也。注意src.ip = 0

 

Frame_363:哎,这个别名有这么贱么,竟然没人跟抢,就勉为其难了吧。注意dst.mac=0

 

lwip相关代码

 

意外:正常情况下,arp协议对不吻合自己ip的都不会reply的。但如果有机器乱reply呢。

本机[192.168.1.103] arp req [192.168.1.104],但[192.168.1.105]强行reply了。本机的arp表项就变成了

{[192.168.1.104]mac_104}--------->{[192.168.1.105]mac_105}本机发送给[192.168.1.104]的数据实际发送到了[192.168.1.105]

因为在ethernet layer中的Destination addr == mac_105

Ø连接一个新的ip(arp表项中不存在)

下图为ping 192.168.1.188,此ip不在本网络。

 

 

下图为ping 192.168.1.101,此ip在本网络。

 

 

[192.168.1.101]存在于arp表项中时,再次ping 101,是不会有发生对应的arp的。本机直接从arp表项中获取ip了。

arp -d 192.168.1.101删除后,再ping,就会发生了。

 

下图为完整的[192.168.1.100]ping[192.168.1.115]一次的抓包。Ok后双方都建立了对应的arp table

Frame_068:[192.168.1.100]req-->[192.168.1.115]

Frame_069:[192.168.1.100]resp<--[192.168.1.115]

Frame_194:[192.168.1.115]req-->[192.168.1.100]

Frame_195:[192.168.1.115]resp<--[192.168.1.100]

 

 

为什么[192.168.1.100]-->[192.168.1.115]42

原因:wireshark运行在[192.168.1.100],可能没有统计18字节的

Trailer   帧中填充的数据,为了保证帧最少有64(包括4字节CRC)个字节。

Ø周期性refresh

etharp_tmr():1S间隔执行一次,更新动态表项。

l非静态表项&& (state != ETHARP_STATE_STATIC)才执行refresh动态表项

lclean up entries that have just been expiredetharp_free_entry()

lstill pending, resend an ARP queryetharp_request()

Ø大致流程图(非周期性)

 





posted @ 2016-05-11 18:46  自由度  Views(1466)  Comments(0)    收藏  举报