三、Arp
1.直观的arp
Wireshark中的arp。
先看下Comer的xinu中的概略图,可以看出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 ip为101,”我”所欲也。注意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 expired,etharp_free_entry()
lstill pending, resend an ARP query,etharp_request()
Ø大致流程图(非周期性)