当前位置: 首页 > 科技观察

物联网高手必备:网络协议栈LwIP(一)

时间:2023-03-22 14:38:04 科技观察

要求:在物联网设备中,TCP/IP网络协议栈是非常重要的软件组件。没有TCP/IP网络协议栈,物联网设备无法连接到互联网。TCP/IP网络协议协议本身就比较复杂。在物联网出现之前,TCP/IP的实现代码量非常大。但是对于物联网设备来说,内存是非常有限的,处理器的性能也非常有限,这就需要一个轻量级的TCP/IP网络协议栈来运行,使用非常小的内存,把一些不需要的功能丢弃,保留主要的功能。由于这些需求,产生了几种嵌入式TCP/IP协议栈,常见的有:μC/TCP-IP、LwIP、UIP。常见的嵌入式TCP/IP协议栈1、μC/TCP-IP:μC/TCP-IP是Micrium自家操作系统UC/OS的一个组件,同时支持IPv4和IPv6,支持BSDsocketAPI,拥有最流行的socket选项。该协议栈是为嵌入式系统优化的紧凑、可靠、高性能的TCP/IP协议栈。μC/TCP-IP完全自编码,具有高质量、可扩展性和可靠性,可以快速配置所需的网络选项,从而最大限度地缩短上市时间,MicriumμC/TCP-IP嵌入式协议栈允许根据设计要求进行调整内存使用情况。μC/TCP-IP可以配置为仅包含系统所需的那些网络组件。当一个组件不被使用时,它可以从协议栈中排除,节省宝贵的内存空间。2、LwIP网络协议栈:LwIP是由瑞典科学院的AdamDunkels开发的一小套TCP/IP协议组件。实现的主要目标是减少资源使用,同时仍然具有完整的TCP功能。这使得lwIP适用于具有10Kb字节空闲RAM的嵌入式系统,并且可以容纳大约40Kb的代码ROM。从发展之初到现在,LwIP已经移植到多个嵌入式操作系统,包括流行的FreeRTOS、阿里云物联网操作系统AliOSThings、华为物联网操作系统LiteOS等。3、uIP网络协议栈:uIP主要用作8位和16位微控制器的小型嵌入式网络协议栈。最初,uIP网络协议栈由瑞典计算机科学院的AdamDunkels开发,其源代码用C语言编写,完全开源。uIP协议栈最大的优点是短小紧凑,对Flash和RAM的要求小。它去除了完整的TCP/IP中不常用的功能,简化了通信过程,但保留了网络通信必须使用的协议,重点介绍IP/TCP。/ICMP/UDP/ARP这些网络层和传输层协议保证了代码的通用性和结构的稳定性。LwIP协议栈功能IP协议(Internet协议,支持IPv4和IPv6),支持多个网络接口的数据包转发。支持ICMP(InternetControlMessageProtocol)进行网络维护和调试。支持IGMP(互联网组管理协议),用于组播流量管理。支持MLD(IPv6的多播侦听器发现)。参考RFC2710标准,不支持MLDv2。IPv6支持邻居发现(ND)和无状态地址自动配置。请参考标准RFC4861(邻居发现)和RFC4862(地址自动配置)。支持DHCP、AutoIP/APIPA(Zeroconf)和(无状态)DHCPv6。支持UDP(UserDatagramProtocol),包括最新的UDP-lite扩展协议(errorinsensitiveUDP)支持TCP协议,包括拥塞控制、RTT估计和快速恢复和快速转发。提供原有的更高性能的API,当用户需要更高性能时使用该接口。可选的Berkeley-socketAPI,最常见的网络编程接口。支持TLS。PPPoS和PPPoE(串行/以太网上的点对点协议)。支持DNS(DomainNameResolver),包括mDNS(MulticastDNS)。6LoWPAN,基于IPv6的IEEE802.15.4,物理层为低功耗蓝牙(BLE)或ZigBee。从这一点来看,LwIP支持的功能非常多。除了传统的TCPIP,它还支持很多最新的协议(如mDNS、UDP-lite、6LoWPAN等)。/IP的分层分为链路层、网络层、传输层和应用层4层。协议栈的数据处理流程主要有以下三种:每一层都是一个独立的进程,链路层是一个进程,IP层也是一个进程,传输层是一个进程。这样设计的好处是每一层都非常清晰,代码通俗易懂,调试起来也比较方便。但这种处理方式的缺点是在层与层之间传输数据时,需要进行上下文切换和内存拷贝。对于操作系统来说,进程之间的切换和内存复制都是需要时间的。当传输大量数据包时,会发生频繁的切换和内存复制,导致转发效率低下。TCPIP协议栈位于操作系统的内核中,应用程序通过系统调用与协议栈进行通信。该方法必须实现对各种功能的系统调用,比较复杂。TCP/IP协议的所有处理都在一个进程中,每一层之间没有明显的界限,每一层都可以访问共享内存空间,因为每一层都可以访问共享内存,避免了各层之间的性能差距内存间拷贝造成的丢失,lwIP协议就是这样实现的,目的是为了提高传输速度和资源利用率。数据包的发送和接收需要基于邮箱和信号量的支持。如果是基于操作系统,操作系统可以提供这些机制。对于移植,只需要封装基于邮箱和信号的功能即可。如果是没有操作系统的裸机移植需要使用中断或者轮询来收发数据,工作量相对于没有操作系统的要大一些。源代码结构LwIP协议栈主目录下面以最新的2.1版本为例。LwIP主要有三个文件夹,doc、src和test。Doc是存储的帮助文档,区别于之前1.4版本的帮助文档是文本文件。它使用doxygen工具根据源代码注释生成HTML格式的帮助文档。src是LwIP的主要源代码目录,test目录是测试脚本和一些测试协议栈的程序。LwIP协议栈的src目录src目录是协议栈的源代码目录,包括api、core、include、netif四个文件夹,其中core是协议栈的核心,include是头文件目录,而netif提供了网络接口层的驱动代码,api目录提供了socket、tcp、内存管理的API接口。(待续)