<RT1176系列13>LWIP概念介绍
LwIP官网源码:lwIP - A Lightweight TCP/IP stack - Summary [Savannah]
1、LWIP 概述
LWIP 由瑞典计算机科学院(SICS)的 Adam Dunkels 等人开发,其设计目标明确,旨在为资源受限的嵌入式系统提供高效的 TCP/IP 协议实现。与传统的 TCP/IP 协议栈相比,LWIP 通过一系列的技术手段,极大地减少了对系统资源的占用。例如,它对协议栈的代码结构进行了深度精简,摒弃了一些在嵌入式环境中不常用的复杂特性,保留了核心的网络协议功能,如对 IPv4、IPv6、ICMP、IGMP、MLD、ND 等网络协议的支持,以及 DHCP、AutoIP/APIPA、ACD 和 DHCPv6 等地址配置协议。这种精简设计使得 LWIP 能够在仅有几十 KB 可用 RAM 和大约 40KB 代码 ROM 空间的设备上稳定运行,为众多低端嵌入式设备实现网络通信打开了大门。
2、LWIP 的核心特性
- 轻量级设计:这是 LWIP 最显著的特点。它通过精简代码结构、优化数据结构等方式,最大限度地降低了对系统资源的需求,使得在资源受限的设备上也能轻松实现网络通信功能。
- 完整的协议支持:尽管是轻量级的,但 LWIP 支持 TCP、UDP、IP、ICMP、ARP 等多种常用的网络协议,能够满足大多数嵌入式设备的网络通信需求。例如,通过 TCP 协议可以实现可靠的数据传输,而 UDP 协议则适用于对实时性要求较高的场景。
- 可裁剪性强:LWIP 提供了丰富的配置选项,用户可以根据自己的实际需求对协议栈进行裁剪。不需要的协议模块可以被移除,从而进一步减少资源消耗。这种高度的可定制性让 LWIP 能够适应不同的应用场景。
- 高效的内存管理:LWIP 采用了独特的内存管理机制,能够有效地利用有限的内存资源。它支持内存池和动态内存分配两种方式,用户可以根据具体情况选择合适的内存管理策略,以提高内存的使用效率。
3、LWIP独特的内存管理机制
内存管理在嵌入式系统中至关重要,LWIP 为此提供了两种主要的内存管理策略:内存池和内存堆,以满足不同场景下的内存分配需求。
内存池采用固定长度的内存分配策略,主要用于分配固定大小的数据结构,如 UDP 控制块、TCP 控制块等。其工作原理基于链表结构,在 LWIP 内核初始化时,会为每种可能用到的数据结构类型预先初始化一定数量的内存池。这些内存池通过一系列全局变量和数据结构进行管理,例如,memp_t 作为枚举类型,用于给每个内存池取名;memp_tab 是全局指针数组,指向每类内存池的第一个内存块;memp_sizes 则是全局数组,记录每个内存池的大小。由于内存块大小固定,在分配和释放内存时,无需进行复杂的查找操作,直接从链表首部取出或插入内存块即可,这使得内存分配时间极短,效率大幅提高。同时,这种方式还能有效防止内存碎片的产生,保证了内存使用的稳定性。
内存堆则采用可变长分配策略,适用于分配任意大小的内存。其实现原理是从低地址空间往高地址空间查找,在找到合适大小的内存块后,将其切割出所需部分,并把剩余部分返回到动态内存堆中。这种策略的优点是内存浪费较小,且实现相对简单,在小内存管理场景中表现良好。然而,当内存分配和释放操作频繁时,容易产生内存碎片,并且分配和释放的效率会降低。为了缓解内存碎片问题,LWIP 在内存堆管理中采用了一些策略,如要求分配最小值、相邻的空闲块合并等,但这些操作也会带来一定的性能开销。在实际应用中,开发者需要根据具体场景,如数据接收、发送、用户调用以及接口控制块等不同情况,合理选择内存池或内存堆来申请内存,以达到最佳的内存使用效果。例如,MAC 内核的数据接收通常涉及固定大小的数据包,此时使用内存池可显著提高效率;而在调用 LWIP 的 API 接口发送数据时,由于数据大小可能不固定,一般选用内存堆申请内存。
4、LWIP 的协议栈组成
LWIP 的协议栈从上到下大致可以分为应用层、传输层、网络层和链路层。
应用层主要包含一些常用的应用协议,如 HTTP、FTP、DHCP 等,用户可以根据需要进行实现和扩展。
传输层负责提供端到端的数据传输服务,主要包括 TCP 和 UDP 协议。TCP 协议提供可靠的、面向连接的数据传输,而 UDP 协议则提供无连接的、不可靠的数据传输,但具有较高的传输效率。
网络层的核心是 IP 协议,负责实现数据包的路由和转发。同时,网络层还包括 ICMP 协议(用于网络诊断和控制)和 ARP 协议(用于将 IP 地址转换为 MAC 地址)。
链路层主要负责处理与物理网络的接口,实现数据帧的发送和接收。它通常与具体的硬件设备相关,需要根据不同的硬件平台进行适配。