第2章 LwIP概述

2.1 LwIP的优缺点

LwIP(Light weight IP)是轻量化的TCP/IP,是瑞典计算机科学院(SICS)的Adam Dunkels开发的一个小型开源的TCP/IP协议栈。设计LwIP的初衷是用少量的资源消耗实现一个较为完整的TCP/IP协议栈,其中“完整”主要是指TCP的完整性,实现的重点是,在保持TCP主要功能的基础上减少对RAM的占用。此外LwIP既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。

本书以LwIP 2.1.2为主要对象进行讲解LwIP 2.1.2版本的官方下载链接:http://savannah.nongnu.org/projects/lwip/。,后文中出现的LwIP如果没有特殊声明,均指2.1.2版本。编写本书时,LwIP 2.1.2为最新版本,可能当你读到本书时,LwIP又被更新了,对于学习而言,不必纠结于是否必须用最新的版本,因为2.1.2版本和它后面的版本在移植和应用方法上并不会有太大区别。

LwIP的主要特性:

1)支持ARP(地址解析协议)。

2)支持ICMP(因特网控制报文协议),用于网络的调试与维护。

3)支持IGMP(互联网组管理协议),可以实现多播数据的接收。

4)支持UDP(用户数据报协议)。

5)支持TCP(传输控制协议),包括阻塞控制、RTT估算、快速恢复和快速转发。

6)支持PPP(点对点通信协议),支持PPPoE。

7)支持DNS(域名解析)。

8)支持DHCP,动态分配IP地址。

9)支持IP,包括IPv4、IPv6,支持IP分片与重装功能以及多网络接口下的数据包转发。

10)支持SNMP(简单网络管理协议)。

11)支持AUTOIP,自动配置IP地址。

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

13)提供可选择的Socket API、Netconn API(在多线程情况下使用)。

在嵌入式中使用LwIP具有以下优点:

1)资源开销低,即轻量化。LwIP内核有自己的内存管理策略和数据包管理策略,使得内核处理数据包的效率很高。另外,LwIP高度可剪裁,一切不需要的功能都可以通过宏编译选项去掉。LwIP的流畅运行需要40KB的代码ROM和几十千字节的RAM,这让它非常适合用在内存资源受限的嵌入式设备中。

2)支持的协议较为完整。几乎支持TCP/IP中所有常见的协议,这在嵌入式设备中早已够用。

3)实现了一些常见的应用程序:DHCP客户端、DNS客户端、HTTP服务器、MQTT客户端、TFTP服务器、SNTP客户端等。

4)同时提供了3种编程接口:RAW API、Netconn APINetconn API即为Sequential API,为了统一,下文均采用Netconn API。和Socket API。这3种API的执行效率、易用性、可移植性以及空间的开销各不相同,用户可以根据实际需要,平衡利弊,选择合适的API进行网络应用程序的开发。

5)高度可移植。其源代码全部用C实现,用户可以很方便地实现跨处理器、跨编译器的移植。另外,它对内核中会使用到操作系统功能的地方进行了抽象,使用了一套自定义的API,用户可以自己实现这些API,从而实现跨操作系统的移植工作。

6)开源、免费。

7)相比于嵌入式领域其他的TCP/IP协议栈,比如μC-TCP/IP、FreeRTOS-TCP等,LwIP的发展历史要更悠久一些,得到了更多的验证和测试。LwIP被广泛用在嵌入式网络设备中,国内一些物联网公司推出的物联网操作系统,其TCP/IP核心就是LwIP;物联网领域知名的WiFi模块ESP8266,其TCP/IP固件使用的就是LwIP。

尽管LwIP有如此多的优点,但它毕竟是为嵌入式而生的,所以并没有很完整地实现TCP/IP协议栈。相比于Linux和Windows系统自带的TCP/IP协议栈,LwIP的功能不算完整和强大,但对于大多数物联网领域的网络应用程序,使用LwIP已经足够了。