0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于LWIP协议栈对路由缓存数据结构实现改进设计

电子设计 来源:单片机与嵌入式系统应用 作者:杨高峰 , 顾春华 2020-09-16 17:58 次阅读

LWIP(Light Weight Internet Protoco1)是瑞士计算机科学院(Swedish Institute of Computer Science)AdamDunkels等人开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LWIP的含义是Light Weight(轻型)IP协议。LWIP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。LWIP TCP/IP实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用。一般它只需要几十KB的RAM和40 KB左右的ROM就可以运行,这使LWIP协议栈适合在小型嵌入式系统中使用。比如,武汉大学的陈杰等把LWIP移植到了一个车辆监控终端系统当中,它可以实时采集车辆信息,在GIS地图上显示出车辆的位置,并根据需要对车辆进行调度;南京大学的方怀东等将LWIP移植到了DSP系统中,这个嵌入式系统用于视频的采集、处理与通信;Astechnix研究院的Jani Monoses将LWIP移植到了RedHats eCos;F1orian Schtdze则宣称他将LWIP移植到了DJGPP/MS—DOS系统以及Visual C++6.O/Win32平台。

1 LWIP设计思路

与许多其他的TCP/IP实现一样,LWIP也是以分层的协议为参照来设计实现TCP/IP。大部分的TCP/IP实现在应用层和底层协议层之间进行了严格的划分,底层协议之间可以进行或多或少的交叉存取;而LWIP在应用层与低层协议则使用了内存共享这种比较松散的通信机制。每一个协议作为一个模块被实现。LWIP采取将所有协议驻留在同一个进程的方式,以便独立于操作系统内核之外。应用程序既可以驻留在LWIP的进程中,也可以使用一个单独的进程。应用程序与TCP/IP协议栈通信可以采用两种方法:一种是函数调用,适用于应用程序与LWIP使用同一个进程的情况;另一种是使用更抽象的API。整个协议栈框图如图1所示。

基于LWIP协议栈对路由缓存数据结构实现改进设计

由于在传输层UDP比TCP协议要简单得多,故仅以TCP为例。

在接收数据方面,链路层的ethernetifinpuIt()函数在收到数据包后,将IP包交付ip_input()函数,ARP包交付 etharp_arp_input()函数处理。ip_input()则负责拆解IP包,将ICMP包交付icmp_input()函数处理,将TCP包交付tcp_input处理。tcp_input()负责收到的TCP包,完成TCP头部验证,放入相应的状态链,并交付tcp_process()处理。tcp_process完成TCP无限状态机的处理。tcp_receive()将收到的包放在接收队列中,这些接收队列中的数据最终被应用程序使用。

在发送数据方面,tcp_write()检查是否允许发送数据,当允许发送时,就调用tcp_enqueue()进行发送。tcp_enqueue()将数据放入发送队列。tcp_output()发送数据并在可能时捎带确认。ip_output_if()在接到数据后,填充IP头,交付netif 一》output,即etharp_output()处理。etharp_output()判断是单播地址后,交付etharp_query()。 etharp_query()填入源、目标mac地址,并最终交付low_level_output()发送。

2 ICMP层的不足

LWIP在ICMP层的处理流程如图2所示。

ICMP模块仅实现了echo_reply包的回应处理,显得过于简单。对小型的协议栈而言,其所在的网络环境相对简单,因而在大多数情况下都是适用的。

LWIP一般使用在终端设备上。终端设备所在的情形可作如下的划分:一是单网卡、单网关的情形;二是单网卡、多网关的情形;三是多网卡、多网关的情形。单网卡、单网关的情形是LWIP最适合的情形。因为LWIP本身没有实现路由缓存,单网关的情形恰好不需要路由缓存,因为此情形下网关总是唯一的,下一跳总是不变的。多网卡、多网关的情形可以看成是单网卡、多网关的特殊情形。

在单网卡、多网关的情形下,如果默认网关的下一跳不是最优下一跳,那么终端会收到一个路由重定向ICMP消息,告诉终端去往这个方向上,这个下一跳不是最优的,并给出最优下一跳。这就是所谓的路由重定向。如果终端一直不采用这个最优下一跳,那么每一个发出的非最优下一跳IP包都会收到路由器发来的一个重定向包。LWIP由于没有实现路由缓存,不能记录下网关发来的最优下一跳,故对此消息的处理是忽略。忽略的结果是LWIP源源不断地收到重定向包,这个包会经过数据链路层、IP层,最终在ICMP层被丢弃,引起不必要的开销。

3 改进思路

改进的思路是在多网关情况下,处理ICMP包;但LWIP并没有路由缓存功能,所以需要引入路由缓存功能,将此重定向的路由记录下来,以使得下次可使用。为降低内存开销,可以在收到ICMP重定向包的情况下(此时表明是多网关情形,下一跳非最优),再开启缓存,缓存这个下一跳地址。如果一段时间不用这个缓存,则清理出去。当最后一条缓存也被清理后,就关闭缓存功能。这相当于一个自适应功能的路由缓存。在没有重定向消息时,使用原有的LWIP工作方式,不会引起额外的开销;在收到重定向消息时,开启这个缓存功能,以避免重定向消息引起的额

对路由缓存的更新,可采用一种类似于LFU(LeastFrequently Used)的算法。为此引入一个计数器,跟踪当前条目被使用的情况,定义MAX_CA_COUNT表示已经过期,O~MAX_CA_COUNT之间的数字表示当前计数值,同时每隔一段时间增加这个计数值。当这个计数值增至MAx_CA_COUNT时,认为这个条目已经过时。同时在插入条目时,可利用这个计数器,总是选用这个数值最大的条目作为被替换对象(LFU算法)。

考虑到LWIP是个小型协议栈,不应设置过于复杂的数据结构及针对此种数据结构的操作,把路由缓存的数据结构定义为结构体数组。数组的条目也不宜过多,以免占用过多资源;另外作为终端设备,在一小段既定的时间内,与其通信的对端具有一定的确定性,一般来说比较少,重定向的条目也比较少,这也为使用较小的数组提供了一个理由。

4 实现

对ICMP层改进的实现代码主要集中于3处。

第一处位于ICMP模块的icmp_input()函数,针对ICMP的消息处理机制,增加了路由重定向的处理。整个函数的处理流程如图3所示。其中虚线框起来的部分为我们增加的功能。首先检查是不是重定向包,然后检验包的完整性和有效性。在这些检查都通过以后,判断缓存功能是否启用。启用与否由一个全局变量控制,默认是关闭的。如果没有启用缓存,则对重定向包进行计数,当达到上限后,启用缓存功能。重定向计数器应当定时归零,这样在一段时间内没有收到足够的重定向包,缓存功能仍然不会开启。这可以把这个重定向计数器加入其他需要定时执行的函数中来实现(比如arp_timer()函数)。开启缓存后,初始化缓存表,将每个条目的老化计数器置为最大,表示已过期,即所有条目都是空闲可用状态。然后启用定时老化功能。LWIP提供 sys_timeout(interval,func_handler,arg)函数,用于每隔interval时间后,执行函数 func_handler(arg)。定向老化功能可以将函数实现后,向这个sys_timeout()注册来实现。如果缓存已经开启,那么缓存这个收到的重定向包,总是把它插入老化计数器最大的条目,以实现LFU算法。

第二处改进仍然位于ICMP模块,但添加了一个函数rou_cache_timer()。它是一个定时老化路由缓存的函数,用于老化、清理缓存条目,并再次向sys_timeout()注册自己。其函数流程如图4所示。

在所有缓存条目都已过图4定时老化、清理路由缓存期后,应当关闭缓存功能,同时注销定时老化函数。这些功能由rou_cache_timer()来完成。

第三处改进位于数据链路层的etharp_output()函数内。这个函数负责将下一跳的IP地址对应的MAC地址填入。

显然,路由缓存的使用正在于此。在它使用默认网关地址前,应当查询一下缓存中是否已将此路由重定向了。如果确实重定向了,那么在此下一跳IP被使用前,应该替换已重定向的IP。整个函数的流程如图5所示。虚线框起来的部分是加入的功能。

结语

本设计针对LWIP在多网关情况下不处理重定向IC—MP消息而作出了改进。这种改进包括接收这个ICMP消息并缓存路由信息,为此加入了自适应路由缓存的功能,即只在有重定向消息的时候自动开启缓存,在缓存全部老化后又自动关闭缓存。路由缓存在比较完整的TCP/IP协议栈上都得到实现,但复杂度较高。这里使用一种较简单的路由缓存结构以降低代码量及资源使用开销。本文提出的思路不仅适用于LWIP,在其他的小型协议栈上也适用。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5072

    文章

    19026

    浏览量

    303524
  • 计算机
    +关注

    关注

    19

    文章

    7430

    浏览量

    87734
  • 协议栈
    +关注

    关注

    2

    文章

    140

    浏览量

    33613
收藏 人收藏

    评论

    相关推荐

    lwip协议代码分析

    lwIP(Lightweight IP)是一个为嵌入式系统设计的轻量级TCP/IP协议
    的头像 发表于 10-29 17:37 1890次阅读
    <b class='flag-5'>lwip</b><b class='flag-5'>协议</b><b class='flag-5'>栈</b>代码分析

    LwIP协议的设计与实现_中文译稿

    LwIP协议的设计与实现_中文译稿
    发表于 08-20 08:18

    LwIP协议的设计与实现资料分享!

    LwIP协议的设计与实现_中文译稿LwIP协议
    发表于 07-31 23:47

    数据结构之链式介绍

    数据结构之链式链式链式的定义链式操作的实现链式
    发表于 12-17 08:11

    嵌入式TCPIP协议LWIP的内部结构

    分析了嵌入式 TCPIP协议主要对LWIP的基本结构,介绍了嵌入式TCPIP协议
    发表于 02-17 15:55 76次下载
    嵌入式TCPIP<b class='flag-5'>协议</b><b class='flag-5'>栈</b><b class='flag-5'>LWIP</b>的内部<b class='flag-5'>结构</b>

    Lwip协议的设计方案

    LWIP是TCP/IP协议的一种实现LWIP的主要目的是减少存储器利用量和代码尺寸,使LWIP
    发表于 09-16 15:18 33次下载
    <b class='flag-5'>Lwip</b><b class='flag-5'>协议</b><b class='flag-5'>栈</b>的设计方案

    基于ARM的LwIP协议研究与移植

    提出基于ARM的LwIP协议研究与移植
    发表于 10-14 17:50 65次下载
    基于ARM的<b class='flag-5'>LwIP</b><b class='flag-5'>协议</b><b class='flag-5'>栈</b>研究与移植

    uCOS-II下实现lwip协议实现Ping功能

    uCOS-II下实现lwip协议实现Ping功能
    发表于 03-26 15:51 143次下载

    TCPIP协议实现lwip

    TCPIP协议实现lwip方便初学者刚开始接触lwip,有个大概的了解与认识。
    发表于 03-14 15:40 13次下载

    lwip协议源码详解说明

    lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议实现的重点是在保持TCP协议主要功
    发表于 12-11 15:27 3.7w次阅读
    <b class='flag-5'>lwip</b><b class='flag-5'>协议</b><b class='flag-5'>栈</b>源码详解说明

    什么是?数据结构如何实现

    今天放松一下,我们来看看数据结构中的,这节的知识点可以说是数据结构中最容易上手的知识点了,其实比起链表,其实链表也有和队列的模型,链表的头插其实就是后进先出,链表的尾插其实就是先进
    发表于 04-29 18:25 0次下载
    什么是<b class='flag-5'>栈</b>?<b class='flag-5'>数据结构</b>中<b class='flag-5'>栈</b>如何<b class='flag-5'>实现</b>

    如何解决数据结构设计最大频率问题?

    。 力扣第 895 题要求我们实现一个特殊的数据结构「最大频率」,比较有意思,让我们实现下面这两个 API: class FreqStack { // 在
    的头像 发表于 03-02 11:02 1403次阅读

    redis数据结构的底层实现

    Redis是一种内存键值数据库,常用于缓存、消息队列、实时数据分析等场景。它的高性能得益于其精心设计的数据结构和底层实现。本文将详细介绍Re
    的头像 发表于 12-05 10:14 597次阅读

    使用LwIP协议浅析实战分析(i.MX RT)

    LWIP协议与网络分层 LwIP(Light weight IP),是一种轻量化且开源的TCP/IP协议,它可以在有限的RAM和ROM条件
    的头像 发表于 02-02 17:05 1625次阅读
    使用<b class='flag-5'>LwIP</b><b class='flag-5'>协议</b><b class='flag-5'>栈</b>浅析实战分析(i.MX RT)

    LwIP协议源码详解—TCP/IP协议实现

    电子发烧友网站提供《LwIP协议源码详解—TCP/IP协议实现.pdf》资料免费下载
    发表于 07-03 11:22 3次下载