LWIP协议栈可靠性配置分析研究
摘要:随着工业控制实时性要求提高,以太网接口通讯在工业的应用也越来越多,以太网技术的广泛使用,为自动化技术带来了深刻变革。工业嵌入式产品集成以太网接口,但由于嵌入式产品本身硬件资源有限,普遍移植占用资源较少的LWIP协议栈,在实际应用中会碰到通讯配置的问题,特别是大数据冲击的条件下的协议栈配置也会尤为关键。本文通过对LWIP协议栈的工作流程及大数据冲击机理分析,提出针对性的可靠性优化方案。
关键词:以太网;LWIP;大数据冲击
Abstract: With the improvement of real-time requirements of industrial control, the application of Ethernet interface communication in industry is increasing. The wide use of Ethernet technology has brought profound changes to automation technology. Industrial embedded products integrate Ethernet interfaces. However, due to the limited hardware resources of embedded products, it is common to transplant the LWIP protocol stack with less resources, which will meet the problem of communication configuration in practical application, especially the protocol stack co
nfiguration under the impact of big data will be particularly critical. Based on the analysis of LWIP protocol stack workflow and big data impact mechanism, this paper proposes a targeted reliability optimization scheme.
Key words: Ethernet; LWIP; Big Data Impact
一、引言
LwIP是一套用于嵌入式系统的开放源码的轻型TCP/IP协议栈,它实现了较为完备的IP、ICMP、 UDP、TCP协议,具有超时时间估计、快速恢复和重发、窗口调整等功能。LwIP在保持协议主要功能的基础上减少对RAM和ROM的占用,一般它只需要几十K的RAM和40K左右的ROM就可以运行。
在LwIP移植应用时,在总线数据报文量不多且数据帧长度少于512bytes时,保持协议栈原有通用配置就可以满足几个设备间正常通讯,但当众多设备同时接入交换机形成的局域网,由于总线数据包及数据帧长度增加,会导致嵌入式设备通讯响应受影响,其中在实际测试过程中并且存在以下两种数据状态时,将导致嵌入式以太网设备出现通讯失败:
①当总线数据达到4万包/分钟,数据单包协达到1472bytes/帧;
②当总线数据达到4万包/分钟,数据分包前达到4806bytes。
二、原因分析tcpip协议中基于tcp协议的应用程序
1、以太网接口工作过程如下:
空调机组采用LWIP TCP/IP协议栈和芯片自带以太网控制器进行上位机通讯,整个系统TCP/IP协议栈各层的报文封装与拆封如下图1所示,当设备的网卡接收到某个数据包后,它会将其放置在网卡的接收缓存中后产生一个中断,然后释放一个信号量通知网卡接收线程去处理这些接收的数据,然后将数据这些数据封装成消息,投递到tcpip_mbox邮箱中,LwIP内核线程得到这个消息,就对消息进行解析,根据消息中数据包类型进行处理:
在链路层,实际上是调用ethernet_input()函数决定是否递交到IP层,如果是ARP包,内核就不会递交给IP层,而是更新ARP缓存表,对于IP数据包则通过ip4_input()函数递交给IP层去处理。
在网络层,LwIP内核就会去处理这个IP报文,首先内核要确认这些数据是否是给自己的(通过判断ip地址,包括组播或者单播),并且还要保证这些数据的格式必须是正确的;如不是给本地的数据,IP层还要将这些数据进行转发或者丢弃,当然,如果对于分片的数据,IP 层还需要负责将其组装起来,并且校验组装完成的数据是否完整,如果不完整则丢弃它,当数据是正确的,对于UDP报文,IP层就会调用udp_input()函数将报文数据递交给传输层处理。
在传输层, LwIP内核会去处理这个UDP报文,UDP协议会对报文进行一些合法性的检测,如果确认了这个报文是合法的,那么就遍历UDP控制块链表,在这些控制块中到对应的端口,然后递交到应用层,首先要判断本地端口号、本地IP地址与报文中的目标端口号、目标IP地址是否匹配,如果匹配就说明这个报文是给本地的,然后调用用户的回调函数recv_udp()将受到的数据传递给上层应用。而如果不到对应的端口,内核将返回一个错误给源主机,然后丢弃报文。
根据以上的数据接收过程分析,如果空调机组在接收控制命令时,程序开辟的内存池大小与总线上的数据量匹配不合适时,就会造成新的数据到来时,内核无法申请到内存池,此时会出现空调无法控制的现象。
注:由于以太网协议规范规定单帧数据最大为1500byte,所以对于UDP协议的报文数据单帧最大长度为1500-20(IP报文头)-8(UDP报文头)=1472 byte。当应用层UDP单帧数据长度大于1472 byte时,内核会在网络层根据程序设置的最大分片数量将数据分片为多帧后,再通过链路层封包后发出去;同理,接收数据时,被拆分为多片的数据会在网络层进行重组后,再通过传输层解析后传递给应用层,当接收到的数据分片数量大于程序中设置的最大允许分片值时,内核会直接丢弃数据,释放对应内存池。
图1  TCP/IP 协议栈各层的报文封装与拆封
2、UDP控制命令接收过程分析如下:
(1)PBUF_POOL类型pbuf缓冲池在协议栈初始化时设置,在内存中申请一块静态存储区,初始化成pbuf链表。分配该类型pbuf时,从缓冲池首部根据申请的大小分配一个或多个pbuf。
图2  Pbuf空链表图
(2)链路层接收到总线上的UDP数据后,会产生中断信号通知内核,此时内核会按照帧数据大小从步骤(1)生成的单向链表中申请空间,用于存储通讯数据;
(3)然后内核会将链路层的数据按照以太网协议解析后传送到网络层使用IP协议进行解析,
此时网络层会对数据帧IP报文头进行解析:对于不是技术协议要求的IP地址的数据进行丢弃,释放内存;对于报文头格式不正确的数据进行丢弃,释放内存;对于需要合并的数据进行重组,重组失败的数据进行丢弃,释放内存,最后再将符合条件的数据传送到传输层;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。