当前位置:首页 > 物联网 > 网络协议
[导读]   1、LWIP的结构   lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对R

  1、LWIP的结构

  lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

  LWIP(Light weight internet protocol)的主要模块包括:配置模块、初始化模块、NeTIf模块、mem(memp)模块、netarp模块、ip模块、udp模块、icmp 模块、igmp模块、dhcp模块、tcp模块、snmp模块等。下面主要对我们需要关心的协议处理进行说明和梳理。

  配置模块:

  配置模块通过各种宏定义的方式对系统、子模块进行了配置。比如,通过宏,配置了mem管理模块的参数。该配置模块还通过宏,配置了协议栈所支持的协议簇,通过宏定制的方式,决定了支持那些协议。主要的文件是opt.h。

  初始化模块:

  初始化模块入口的文件为tcpip.c,其初始化入口函数为: void tcpip_init(void (* initfunc)(void *), void *arg)

  该入口通过调用lwip_init()函数,初始化了所有的子模块,并启动了协议栈管理进程。同时,该函数还带有回调钩子及其参数。可以在需要的地方进行调用。

  协议栈数据分发管理进程负责了输入报文的处理、超时处理、API函数以及回调的处理,原型如下:

  staTIc void tcpip_thread(void *arg)

  NeTIf模块:

  NeTIf模块为协议栈与底层驱动的接口模块,其将底层的一个网口设备描述成协议栈的一个接口设备(net interface)。该模块的主要文件为netif.c。其通过链表的方式描述了系统中的所有网口设备。

  Netif的数据结构描述了网口的参数,包括IP地址、MAC地址、link状态、网口号、收发函数等等参数。一个网口设备的数据收发主要通过该结构进行。

  Mem(memp)模块:

  Mem模块同一管理了协议栈使用的内容缓冲区,并管理pbuf结构以及报文的字段处理。主要的文件包括mem.c、memp.c、pbuf.c。

  netarp模块:

  netarp模块是处理arp协议的模块,主要源文件为etharp.c。其主要入口函数为: err_t ethernet_input(struct pbuf *p, struct netif *netif)

  该入口函数通过判断输入报文p的协议类型来决定是按照arp协议进行处理还是将该报文提交到IP协议。如果报文是arp报文,该接口则调用etharp_arp_input,进行arp请求处理。

  如果是ip报文,该接口就调用etharp_ip_input进行arp更新,并调用ip_input接口,将报文提交给ip层。

  在该模块中,创建了设备的地址映射arp表,并提供地址映射关系查询接口。同时还提供了arp报文的发送接口。如下

  err_t etharp_output(struct netif *netif, struct pbuf *q, struct ip_addr *ipaddr)

  该接口需要注册到netif的output字段,ip层在输出报文时,通过该接口获取目标机的MAC地址,组合最终报文后,由该接口调用底层设备的驱动接口发送数据。

  在etharp_output接口中,判断报文类型,如果是广播包或者组播包,就调用etharp_send_ip(组装目标mac和源mac)接口,etharp_send_ip调用netif结构中的设备驱动注册的linkoutput钩子函数发送最终报文。如果是单播包,etharp_output接口就调用etharp_query进行ip地址和MAC地址的映射,来获取到目标机的MAC地址。并在etharp_query中调用etharp_send_ip来发送最终组合报文。

  ip模块:

  ip模块实现了协议的ip层处理,主要文件为ip.c。其主要入口函数为: err_t ip_input(struct pbuf *p, struct netif *inp)

  该接口通过判断输入报文的协议类型,将其输入到相应的上层协议模块中去。比如,将udp报文送到udp_input。

  该模块另外一个接口是输入函数,原型如下:

  err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t

  tos, u8_t proto)

  该接口通过路由表或者传输ip后,调用netif的output字段函数钩子发送报文。

  udp模块:

  udp模块实现了udp协议层的协议处理,主要文件为udp.c。该模块通过PCB控制块将应用端口跟应用程序做了绑定。在接收到新报文时,分析其对应的PCB,找到对应的处理钩子,进行应用的处理。主要入口函数为:

  void udp_input(struct pbuf *p, struct netif *inp) 该模块负责输出的接口如下:

  err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)

  该模块负责将一个PCB跟一个本地端口进行绑定的接口如下:

  err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) 该模块负责将一个PCB跟一个远端端口绑定的接口如下:

  err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)

  igmp模块:

  igmp模块负责分组管理。其主要的接口函数如下:

  void igmp_input(struct pbuf *p, struct netif *inp, struct ip_addr *dest) 该接口负责IGMP协议报文的处理,比如分析当前报文是请求还是应答。 err_t igmp_joingroup(struct ip_addr *ifaddr, struct ip_addr *groupaddr) 该接口将一个网口加入一个组。

  err_t igmp_leavegroup(struct ip_addr *ifaddr, struct ip_addr *groupaddr) 该接口将一个网口从一个组中移出。

  dhcp模块:

  dhcp模块用于获取设备ip地址的相关信息。其处理入口主要有这么几个:dpch的启动、dpch的接收报文处理以及定时器模块的处理。

  主要的接口原型如下:

  err_t dhcp_start(struct netif *netif)

  该接口用于设备启动dhcp模块,主要是客户端的功能。该模块实现设备dhcp描述结构生成,并将dhcp的端口绑定到udp协议中,以及将本dhcp模块跟远端服务器端口进行绑定。最后启动dhcp申请。

  static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)

  该接口为一个注册接口,用于dhcp报文接收。在start dhcp时,该接口通过dhcp的udp pcb注册到udp协议层。Udp进行报文处理后,根据端口调用该注册接口。该接口中,实现dhcp报文的协议处理。

  Void dhcp_fine_tmr() Void dhcp_coarse_tmr()

  这两个函数接口实现了dhcp的相关超时处理监控。上面一个用于请求应答超时处理。下面一个用于地址租用情况的到期处理。

  从源码分析看,上述的接口在应用lwip的协议栈时,需要重点关注。对于小内存应用的场合,该协议栈的内存管理以及pbuf应用部分需要自行改写。

  2、lwip特征

  (1)支持多网络接口下的IP转发;

  (2)支持ICMP协议;

  (3)包括实验性扩展的UDP(用户数据报协议);

  (4)包括阻塞控制、RTT 估算、快速恢复和快速转发的TCP(传输控制协议);

  (5)提供专门的内部回调接口(Raw API),用于提高应用程序性能;

  (6)可选择的Berkeley接口API (在多线程情况下使用) 。

  (7)在最新的版本中支持ppp

  (8) 新版本中增加了的IP fragment的支持。

  (9) 支持DHCP协议,动态分配ip地址.

  3、LWIP的协议流程

  下面这张图比较清楚的描述了lwip的报文处理流程,呵呵,借用一下。不过,其对netif-》output描述不够。从代码看,该output实际是arp层的输出,最后通过arp层调用netif中的底层输出接口发送报文。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭