最新要闻
- 天天热文:开办以来首位!跨性别演员柏林电影节获奖
- 微速讯:长城放出王炸?长城水平对置八缸发动机摩托曝光 真猛兽
- 环球热头条丨可以两天一充的骁龙8 Gen2手机:出现了
- 每日热讯!马里肯涅巴地区发生武装抢劫 中使馆提醒关注当地安全情况
- 威马汽车再发内部信:部分员工复工 其余人员无薪休假
- 【全球热闻】视觉四边等宽!魅族20系列边框仅1.57mm:比iPhone 14 Pro都窄
- 《使命召唤》前景动荡
- 世界新资讯:上海一高校推出高启强同款猪脚面:师生直呼“舌尖上的《狂飙》”
- 乌苏啤酒大促:立减64元 折合3元/瓶到手
- 信息:女子考研期间生娃初试395分 回应外界好奇:多亏家人替自己分担很多
- 每日焦点!高德、百度地图红绿灯读秒很神奇 接入交管平台?真相并非如此
- 【天天新要闻】《我们的日子》里,不要忽视这些法律问题
- 天天资讯:俄州“毒火车”引发环境灾难后 美国又一货运列车脱轨
- 中兴通
- 世界动态:你昨晚关注的那个福利姬 可能是假的
- 世界即时看!国产新能源疯狂内卷!哈弗H6 PHEV官降1.5万 配置全系顶配
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
LWIP学习记录------ARP协议(1)
关于LWIP网络协议在嵌入式设备使用越来越广泛,还是要好好学习一下,之前也看过一些资料,总是学了又忘(可能实践的太少了吧!!)。所以本文重新整理一下笔记。共同进步!
(资料图片)
(一)ARP基础知识
(1)ARP协议的本质:
ARP协议的基本功能是使用目标主机的IP地址,查询其对应的MAC地址,来进行底层链路上数据包的通信工作。其中,ARP表的功能就是 记录IP地址与 MAC地址的对应关系的表格。
在以太网中,ARP数据包与IP数据包是两个独立的部分,他们都是封装在以太网中进行传送的。ARP数据包分为两类一个是ARP请求包,另一个是arp应答包。
所谓ARP请求包:就是它是通过 广播的方式在以太网中进行传输,然后希望能得到目标主机的相应。已知IP地址,请求MAC地址。
显然,ARP应答包的功能,就是收到ARP请求包的主机,会解析请求包的IP地址与本机IP地址做比较,若符号,则返回一个APR应答包,包含了请求的IP地址与对应的MAC地址。这样,源主机就知道目标主机的MAC地址了,并把它加入到自己的ARP表中。
(2)ARP表的建立过程:
阶段一:当系统初始化时,ARP表为空。主机会广播自己的
,这个数据包叫 无汇报 ARP请求包。其他主机收到后,会把这个数据加入到自己的ARP表中。 阶段二:当主机要发送一个IP数据包时,要先检查自己的ARP表有没有目标主机的MAC地址?要有,好,直接发送。要没有,就要广播一个ARP请求包,然后其他主机接收后,若和自己匹配,则返回一个ARP应答包。源主机就得到了这个IP对应的MAC地址。 如果该表项的缓冲队列上有未发送的数据,相应的数据会被发送出去(后面结合代码详解)
阶段三:由于网络硬件状态可能随时改变,所以ARP还需要采用一定的定时机制来保证 缓存表中地址的 有效性。要有定时机制。
(二)lwip中关于ARP的数据结构
etharp.c/h 文件中 实现了ARP协议的全部数据结构和函数定义。主要是ARP缓存表和ARP报文。
(1)ARP表
ARP表是由缓存表项(entry)组成。LWIP只描述缓存表项的数据结构叫做 etharp_entry 。单个缓存表项的结构如下:
struct etharp_entry { struct etharp_q_entry *q; //**数据包缓冲队列指针**; struct pbuf *q; // ip_addr_t ipaddr; //目标IP地址 struct netif *netif; //对应的网络接口信息 struct eth_addr ethaddr; //目标MAC地址 u8_t state; //该entry 表项的状态 u8_t ctime; //该entry的时间信息};
- 第一个成员:"*q" 指向缓存表项的数据包缓存队列。因为当主机发送一个IP数据包时候,发现缓存表中并没有对应的MAC地址,那该怎么办呢?于是在得到对应的MAC地址之前,主机会新建立一个缓存表项,然后把要发送的数据 挂在这个缓存队列指针上。当接收到ARP应答包后,再发送出去。
struct etharp_q_entry结构是一个链表,包含一个*next 指针和一个 指向pbuf 数据包的指针。系统为 etharp_q_entry 结构开辟了一些 MEMP_APR_QUEUE类型的内存池。
state有四种状态,分别为empty 状态、Pending状态、stable状态、stable状态且发送了一个ARP请求。
初始时,是以数组形式定义了10条ARP表项。这都是空的,没有记录任何信息。
enum etharp_state { ETHARP_STATE_EMPTY = 0, //empty状态 ETHARP_STATE_PENDING, ETHARP_STATE_STABLE, ETHARP_STATE_STABLE_REREQUESTING};
pending状态:不稳定状态,此时只是找到了IP地址,正在寻找MAC地址;
stable状态:当Pending状态的表项接收到ARP应答后,就会变成stable稳定状态
stabl_rerequesting状态:系统定时更新ARP表项,当时间到了之后,会向目标主机发送一个ARP请求,来验证表项的有效性,在验证期间就会变成 stable_rerequesting状态。
ctime 成员:用来计时,系统会删除到时的 ARP表项。内核每5秒一次调用eth_tmr()函数,他会为每个 ARP表项 的ctime 值加1,当改值大于系统规定的值时,就会产生相应的动作。
void etharp_tmr(void){ u8_t i; for (i = 0; i < ARP_TABLE_SIZE; ++i) { u8_t state = arp_table[i].state; if (state != ETHARP_STATE_EMPTY) //表项不为空,说明被使用。 { arp_table[i].ctime++; if ((arp_table[i].ctime >= ARP_MAXAGE) || //表项大于生存时间20分钟 ((arp_table[i].state == ETHARP_STATE_PENDING) && //达到pending 最大时间10s (arp_table[i].ctime >= ARP_MAXPENDING))) { etharp_free_entry(i); //删除表项 } else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING) { /* Reset state to stable, so that the next transmitted packet will re-send an ARP request. */ arp_table[i].state = ETHARP_STATE_STABLE; } } }}
(2)ARP报文
1. 前面提到的ARP请求和应答是组装在一个ARP数据包中发送的。如下图所示是一个APR包的组成;
以太网目的地址(MAC) 以太网源地址(MAC) 帧类型 硬件协议 协议类型 硬件地址长度 协议地址长度 OP 发送方以太网地址 发送方IP 接收方以太网地址 接收方IP 6字节 6 2 2 2 1 1 2 6 4 6 4 前面 14个字节是以太网首部,后面28个字节是ARP数据包。
帧类型:对于ARP包是0X806,对于IP包是0X0800。
硬件协议:发送方想要知道的硬件接口类型,对于以太网是 1
协议类型:表示要映射的协议地址类型,为0X0800,代表映射为IP地址
操作字段op:表示数据包类型。ARP请求包为 1,ARP应答包为2.
后面字段含义较为明显,不再赘述。
以太网首部用结构eth_hdr表示
struct eth_hdr { PACK_STRUCT_FIELD(struct eth_addr dest); //以太网目的地址,6字节 PACK_STRUCT_FIELD(struct eth_addr src); //以太网源地址,6字节。 PACK_STRUCT_FIELD(u16_t type); //帧类型} PACK_STRUCT_STRUCT;
(PACK_STRUCT_FIELD宏定义来禁止编译器自动对齐)
ARP数据包部分用结构etharp_hdr 表示:
struct etharp_hdr { PACK_STRUCT_FIELD(u16_t hwtype); PACK_STRUCT_FIELD(u16_t proto); PACK_STRUCT_FIELD(u8_t hwlen); PACK_STRUCT_FIELD(u8_t protolen); PACK_STRUCT_FIELD(u16_t opcode); PACK_STRUCT_FIELD(struct eth_addr shwaddr); PACK_STRUCT_FIELD(struct ip_addr2 sipaddr); PACK_STRUCT_FIELD(struct eth_addr dhwaddr); PACK_STRUCT_FIELD(struct ip_addr2 dipaddr);} PACK_STRUCT_STRUCT;
结合源码,来看看ARP请求包是怎么发送出去的。ARP请求包是 调用etharp_requeset()实现。
etharp_request(struct netif *netif, ip_addr_t *ipaddr){ return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, (struct eth_addr *)netif->hwaddr, &netif->ip_addr, ðzero, ipaddr, ARP_REQUEST);}
好家伙,里面原来是调用是了etharp_raw()。那我们看看etharp_raw()具体实现。
重头戏来了!
/** * @param netif the lwip network interface on which to send the ARP packet * @param ethsrc_addr the source MAC address for the ethernet header * @param ethdst_addr the destination MAC address for the ethernet header * @param hwsrc_addr the source MAC address for the ARP protocol header * @param ipsrc_addr the source IP address for the ARP protocol header * @param hwdst_addr the destination MAC address for the ARP protocol header * @param ipdst_addr the destination IP address for the ARP protocol header * @param opcode the type of the ARP packet * @return ERR_OK if the ARP packet has been sent * ERR_MEM if the ARP packet couldn"t be allocated * any other err_t on failure */err_t etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, const struct eth_addr *ethdst_addr, const struct eth_addr *hwsrc_addr, const ip_addr_t *ipsrc_addr, const struct eth_addr *hwdst_addr, const ip_addr_t *ipdst_addr, const u16_t opcode){ struct pbuf *p; err_t result = ERR_OK; struct eth_hdr *ethhdr; //以太网帧首部结构体指针 struct etharp_hdr *hdr; //ARP数据包结构体指针 /* 先在内存堆中,为ARP包分配空间 */ p = pbuf_alloc(PBUF_RAW, SIZEOF_ETHARP_PACKET, PBUF_RAM); //14+28个字节 /* 若分配失败,返回err */ if (p == NULL) { return ERR_MEM; } ethhdr = (struct eth_hdr *)p->payload; //ethhdr指向以太网帧首部区域 hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR); //hdr 指向arp数据包首部区域 hdr->opcode = htons(opcode); //填写op字段。 下面是继续填写数据包中字段: /* Write the ARP MAC-Addresses */ ETHADDR16_COPY(&hdr->shwaddr, hwsrc_addr); ETHADDR16_COPY(&hdr->dhwaddr, hwdst_addr); /* Write the Ethernet MAC-Addresses */ ETHADDR16_COPY(ðhdr->src, ethsrc_addr); IPADDR2_COPY(&hdr->sipaddr, ipsrc_addr); IPADDR2_COPY(&hdr->dipaddr, ipdst_addr); hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET); hdr->proto = PP_HTONS(ETHTYPE_IP); /* set hwlen and protolen */ hdr->hwlen = ETHARP_HWADDR_LEN; hdr->protolen = sizeof(ip_addr_t); ethhdr->type = PP_HTONS(ETHTYPE_ARP); //以太网帧类型ARP包 /* 发送!!send ARP query */ result = netif->linkoutput(netif, p); /* 释放!free ARP query packet */ pbuf_free(p); p = NULL; return result;}
到此为止,总结就是 先分配内存,然后填充这个内存中各个字段的数据信息(保存在pbuf 中),然后再调用netif->linkoutput()底层数据包发送函数,最后再释放掉pbuf。
LWIP学习记录------ARP协议(1)
天天热文:开办以来首位!跨性别演员柏林电影节获奖
微速讯:长城放出王炸?长城水平对置八缸发动机摩托曝光 真猛兽
环球热头条丨可以两天一充的骁龙8 Gen2手机:出现了
每日热讯!马里肯涅巴地区发生武装抢劫 中使馆提醒关注当地安全情况
威马汽车再发内部信:部分员工复工 其余人员无薪休假
【全球热闻】视觉四边等宽!魅族20系列边框仅1.57mm:比iPhone 14 Pro都窄
全球热点!Go编程实战:博客备份
Markdown简明教程
《使命召唤》前景动荡
世界新资讯:上海一高校推出高启强同款猪脚面:师生直呼“舌尖上的《狂飙》”
乌苏啤酒大促:立减64元 折合3元/瓶到手
信息:女子考研期间生娃初试395分 回应外界好奇:多亏家人替自己分担很多
每日焦点!高德、百度地图红绿灯读秒很神奇 接入交管平台?真相并非如此
【天天新要闻】《我们的日子》里,不要忽视这些法律问题
天天资讯:俄州“毒火车”引发环境灾难后 美国又一货运列车脱轨
中兴通
全球热讯:读Java性能权威指南(第2版)笔记02_ Java SE API技巧上
世界动态:你昨晚关注的那个福利姬 可能是假的
世界即时看!国产新能源疯狂内卷!哈弗H6 PHEV官降1.5万 配置全系顶配
【世界报资讯】iPhone 15 Pro Max渲染图出炉:对比14 Pro Max边框更窄、机身更厚
对接水仙后台(支持AndLua+、FA、FA2、AIDE lua、Simple Lua等)
【全球报资讯】Golang基于Mysql分布式锁实现集群主备
世界观热点:薪资4K-5K!公司招聘财务要求做饭被吐槽像保姆
天天百事通!男子长期高血糖导致视网膜病变:不可逆
热头条丨不愧是万元机皇!酷安网友给三星Galaxy S23 Ultra打最高分
当前聚焦:《蚁人3》上映9天中国内地票房破2亿 网友:回到小众也挺好
世界微资讯!如何给公众号投稿赚钱_怎样给公众号投稿赚钱
双亲委派机制
天天微动态丨中国教师队伍建设研究/京师教师教育论丛
当前视讯!即将让核污水倒入大海!日本港口大量有毒海胆聚集 或出现爆发式增长
三星降低QD-OLED面板成本!让电视更具竞争力
世界关注:努比亚Z50新版下周首销:骁龙8 Gen2旗舰焊门员 性价比无敌
最新:python实现客户端和服务端的UDP相互通信
【报资讯】hbuilderx打正式包所需的私钥证书的创建方法
全球新动态:2.【go-kit教程】go-kit启动http服务
室内单目深度估计-4
最新:kaggle中训练得到的output太大该怎么下载?
世界热消息:2消息,中超新贵签约32岁国脚,5中超外援上诉国际足联
环球新动态:超市宣称1元纸币将退出历史引热议 网友直呼太突然:官方回应不属实
视点!女子患异食癖3年吃上百块粉饼:体检身体无异常
天天热点!刷题疑问
环球速读:史上最好的真全面屏手机!努比亚Z50 Ultra上架接受预约
天天精选!禁止自带食材 关停300家店 海底捞从巨亏41亿到盈利13亿
天天讯息:day04-原生的API&注解方式
【环球新要闻】Git使用
美食博主三亚买3888元海鲜被好心人提醒多花1700:当事人心累
热消息:秋裤先别着急脱!“春捂”到底该“捂”哪儿?
前沿资讯!2023年安卓之光!小米13 Ultra手机壳曝光:背部造型抢眼
餐馆接到网吧10个外卖订单 结果被刷9个差评 店主:下次亲自送餐
天天微速讯:门店2299元 GXG男士羊毛大衣0.8折清仓大促:实付199元!
世界热资讯!乐堡苏打气泡酒12罐到手19.9元:低糖0脂无负担
威马员工在线讨薪:被恶心到了、恶心的事还有更多
广州塞车登“热搜”?“甜蜜的烦恼”重回一线城市,中国经济活力加快恢复
【Tire树】高效统计字符串
80、90后泪目 国产暗黑《赵云传重制版》试玩
1岁男童误食降糖药成植物人:愿康复顺利
环球速看:中央人民广播电台民族节目中心
Ubuntu安装Zabbix6.0
秒睡令人羡慕?医生提醒:可能是种睡眠障碍
《流浪地球2》科幻成真?武汉国博用特效“加建”太空电梯
今头条!【element UI】在 el-select 与 el-tree 结合组件
环球热文:python教程:模块的搜索路径
Python中模块的四种方式
《原子之心》种族主义漫画引争议:涉嫌歧视黑人!官方道歉
世界速读:我国载人航天将对国际开放 多国航天员希望参与中国空间站
每日热讯!驱动拖后腿 Intel显卡被低估:2000元档A770理论可刚RTX 3070
受贿、泄露内幕信息!湖北原副省长曹广晶被公诉
天天快看点丨下周发售!《卧龙:苍天陨落》新预告发布:PC/主机通吃
最新消息:EQ电动车中国表现欠佳 奔驰CEO:打价格战不是好事
环球热点!101岁老人每天赶2场麻将 医生:身体状态70岁
What's past is prologue
全球新资讯:车商不收特斯拉 新车一个月亏7万:新能源二手车都不受待见 厂商频降价
H5N1禽流感致死事件引世卫关注:事发柬埔寨、9年来首次
环球热点评!下单就送鲜蔬汤 海福盛冻干粥5杯大促:券后仅20.9元!
“真香定律”稳定发挥 迈凯伦全新SUV效果图曝光:预计售价282万
世界今日讯!关于修订《中国高尔夫球协会赛事活动管理办法》的通知
环球微头条丨中越边境民族文化艺术考察研究
每日热点:女子在门缝发现针头 是大妈拿注射器推大量不明液体:整栋楼遭殃 网友气愤
地球中心到底有什么?科学家发现竟是一个超大铁球 跟书里讲得不一样
NET6接口项目基础框架项目
Java 8 Lambda 方法引用 简记
全球看热讯:(数据库系统概论|王珊)第七章数据库设计-第三节:概念结构设计
Blender插件:水滴生成器(Droplet Generator)
环球速递!《分布式技术原理与算法解析》学习笔记Day22
消炎止血、除口臭!中药黄芩牙膏大促:3支不到20块(送牙刷)
【世界聚看点】《博德之门3》Xbox版遭遇技术难题
天天快看点丨激光溶脂和吸脂的区别_激光溶脂和吸脂怎么区分
每人1600元!北京要发消费券了:买手机、PC、无人机等都能用
为博流量 女子与前夫摆拍家暴并直播谎称报警:结果被官方通报
当前快看:吸水好干得快:洁丽雅新疆棉毛巾4.98元发车
【Java】ArrayList线程不安全的坑
世界观察:不点拍照按键也能拍照!荣耀Magic 5全新技术曝光:堪比变魔术
全球观热点:自信满满!萌娃觉得自己掌握了英语的窍门 张口让网友沉默
当前播报:电动车里什么最耗电?13类电器功率排名来了!出乎意料
当前关注:义乌市百货有限责任公司
【新要闻】饰组词语接龙_饰组词语
运算符重载
世界要闻:猛男专属 吉利几何E超吸粉特别版上市:9.98万元
全球热点评!《三体》被改编成剧本杀 三体宇宙索赔300万