lwip之三:arp

三、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()

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

来自为知笔记(Wiz)

时间: 2024-12-09 21:00:01

lwip之三:arp的相关文章

关于ENC28J60在stm32上的应用的分析

前两天从晚上买了个enc28j60模块,准备做个以太网的测试,回来的时候稍微有点小激动,为什么呢,据我的经验看来,一个人面对新的未知的事物,总会有点害怕,然后又有种跃跃欲试之感,或许我就是这样的,然后我把小小的模块拿出来,用杜邦线链接好之后找了段代码少了进去,那时候不知道咋连,他们说如果和路由器连接的话用直连网线,和pc机连接的话用交叉网线,什么呀,现在的pc机都可以判断设备的端口类型了额,自动转换直连和交叉,不需要费那么多功夫了. 话说一开始怎么都连接不上,ping不通,什么玩意儿啊,弄半天了

LWIP协议栈:ARP协议

1. ARP协议简介 ARP(Address Resolution Protocol),地址解析协议.ARP协议处于网络层,其主要功能就是通过目标设备的 IP 地址,查询目标设备的 MAC 地址,从而进行网络通信. 网络层中,源主机和目标主机依赖于IP地址进行通信.而链路层又有自己的寻址寻址机制(如,以太网依赖于MAC地址进行通信).ARP的作用在于将IP地址转换为MAC地址,从而连接网络层与链路层,使得上层可以通过IP地址进行网络通信. ARP协议的基本运作过程如下: 2. ARP缓存表 2.

网络安全系列之三十四 预防ARP欺骗

预防ARP欺骗的有效方式是将网关IP地址与MAC地址进行绑定.比如网关的IP地址是10.49.6.254,MAC地址00-0f-e2-69-2c-d2,那么可以执行下面的命令将之绑定. arp –s 10.49.6.254 00-0f-e2-69-2c-d2 由于ARP表是动态更新的,系统每次重启之后,还需要重新执行命令进行绑定,因而可以将该命令设为开机脚本,在每次系统启动时自动运行. 我们先创建一个名为arp.bat的批处理文件 然后打开组策略编辑器,展开[计算机配置\Windows设置\脚本

三LWIP学习笔记之ARP协议

一.ARP协议简介 ARP,全称 Address Resolution Protocol,译作地址解析协议,ARP 协议与底层网络接口密切相关.TCP/IP 标准分层结构中,把 ARP 划分为了网络层的重要组成部分. 当一个主机上的应用程序要向目标主机发送数据时,它只知道目标主机的 IP 地址,而在协议栈底层接口发送数据包时,需要将该 IP 地址转换为目标主机对应的 MAC 地址,这样才能在数据链路上选择正确的通道将数据包传送出去,在整个转换过程中发挥关键作用的就是 ARP 协议了. 在本章中将

lwIP RAW_API

lwIP RAW TCP/IP接口 作者: Adam Dunkels, Leon Woestenberg, Christiaan Simons lwIP为使用TCP/IP协议通信的应用程序编程提供了两种接口接口(APIs): * 低层次的称之为"core" / "callback" 或者 "raw" API * 高层次的称之为"sequential" API lwIP "sequential" API为使用

LWIP总结

介绍 Lwip,light weight IP:是由Adam Dunkels 开发的一个小型开源的TCP/IP协议栈:目前已经为全球共同开发的开源协议:支持TCPIP协议族的核心协议:包括:ARP/ICMP/TCP/UDP/IPV4/IPV6/DHCP等:其核心特点是:功能齐全.运行需求的RAM和ROM少: 编程模型 所有的功能和性能都可进行裁剪和配置:相关文件为:lwipopts.h 内部实现支持带操作系统和不带操作系统:核心框架是:外部单线程驱动协议栈状态机:底层使用中断进行数据的接收: 其

LWIP裸机环境下实现TCP与UDP通讯

前面移植了LWIP,并且简单的实用了DHCP的功能,今天来使用一下实际的数据通讯的功能 首先是实现TCP客户端,我先上代码 #ifndef __TCP_CLIENT_H_ #define __TCP_CLIENT_H_ #include "network.h" //连接状态 enum tcp_client_states { ES_NONE = 0, ES_RECEIVED, //接收到了数据 ES_CLOSING //连接关闭 }; //TCP服务器状态 struct tcp_clie

stm32使用LWIP实现DHCP客户端

LWIP是一款开源的嵌入式网络协议栈,支持的功能很多,而且能在多任务环境下和单任务裸机环境下跑,今天说说他的移植过程,芯片为STM32,网卡为ENC28J60,无操作系统 首先下载LWIP的源代码,我下载的是1.4.1的源码,下载后解压,文件结构如图 将这四个目录中的文件全部拷贝到工程中,API是一些socket通讯的接口,需要在多任务的环境下实现,core里面存放的内核源码,我们主要使用IPV4,include目录下是需要包含的目录,lwip只要求我们包含include目录,里面的内层目录会自

LwIP学习笔记——STM32 ENC28J60移植与入门

0.前言 去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一详解个别部分只能点到为止. [本文要点] [1]不带操作系统的LwIP移植,LwIP版本为1.4.1. [2]MCU为STM32F103VE,网卡为ENC28J60. [3]移植过程重点描述ethernetif.c和LwIP宏配置等. [4]一个简单的TCP echo例子. [5]力求简单,没有DHCP功能,甚至没有