前言
Light weight IP,意思是轻量化的TCP/IP协议,是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。LwIP的设计初衷是:用少量的资源消耗实现一个较为完整的TCP/IP协议栈,其中“完整”主要指的是TCP协议的完整性,实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。此外LwIP既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行
特点:
-
支持ARP协议(以太网地址解析协议)。
-
支持ICMP协议(控制报文协议),用于网络的调试与维护。
-
支持IGMP协议(互联网组管理协议),可以实现多播数据的接收。
-
支持UDP协议(用户数据报协议)。
-
支持TCP协议(传输控制协议),包括阻塞控制、RTT 估算、快速恢复和快速转发。
-
支持PPP协议(点对点通信协议),支持PPPoE。
-
支持DNS(域名解析)。
-
支持DHCP协议,动态分配IP地址。
-
支持IP协议,包括IPv4、IPv6协议,支持IP分片与重装功能,多网络接口下的数据包转发。
-
支持SNMP协议(简单网络管理协议)。
-
支持AUTOIP,自动IP地址配置。
-
提供专门的内部回调接口(Raw API),用于提高应用程序性能。
-
提供可选择的Berkeley接口API,即 Socket套接字 (在多线程情况下使用) 。
优点:
-
资源开销低,即轻量化。LwIP内核有自己的内存管理策略和数据包管理策略,使得内核处理数据包的效率很高。另外,LwIP高度可剪裁,一切不需要的功能都可以通过宏编译选项去掉。LwIP的流畅运行需要40KB的代码ROM和几十KB的RAM,这让它非常适合用在内存资源受限的嵌入式设备中。
-
所支持的协议较为完整。几乎支持TCP/IP中所有常见的协议,这在嵌入式设备中早已够用。
-
实现了一些常见的应用程序:DHCP客户端、DNS客户端、HTTP服务器、MQTT客户端、TFTP服务器、SNTP客户端等等。
-
同时提供了三种编程接口:RAW API、NETCONN API(注:NETCONN API即为Sequential API,为了统一,下文均采用NETCONN API)和Socket API。这三种API的执行效率、易用性、可移植性以及时空间的开销各不相同,用户可以根据实际需要,平衡利弊,选择合适的API进行网络应用程序的开发。
-
高度可移植。其源代码全部用C实现,用户可以很方便地实现跨处理器、跨编译器的移植。另外,它对内核中会使用到操作系统功能的地方进行了抽象,使用了一套自定义的API,用户可以通过自己实现这些API,从而实现跨操作系统的移植工作。
-
开源、免费,用户可以不用承担任何商业风险地使用它。
-
相比于嵌入式领域其它的TCP/IP协议栈,比如uC-TCP/IP、FreeRTOS-TCP等,LwIP的发展历史要更悠久一些,得到了更多的验证和测试。LwIP被广泛用在嵌入式网络设备中,国内一些物联网公司推出的物联网操作系统,其TCP/IP核心就是LwIP;物联网知名的WiFi模块ESP8266,其TCP/IP固件,使用的就是LwIP。
LwIP尽管有如此多的优点,但它毕竟是为嵌入式而生,所以并没有很完整地实现TCP/IP协议栈。相比于Linux和Windows系统自带的TCP/IP协议栈,LwIP的功能不算完整和强大。但对于大多数物联网领域的网络应用程序,LwIP已经足够了。