大家好,又见面了,我是你们的朋友全栈君。
1、LwIP简介
LwIP 全名为 Light weight IP,意思是轻量化的 TCP/IP 协议, 是瑞典计算机科学院(SICS)的 Adam Dunkels 开发的一个小型开源的 TCP/IP 协议栈。 LwIP 的设计初衷是:用少量的资源消耗(RAM)实现一个较为完整的 TCP/IP 协议栈,其中“完整”主要指的是 TCP 协议的完整性, 实现的重点是在保持 TCP 协议主要功能的基础上减少对 RAM 的占用。此外 LwIP既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。
LwIP有无操作系统的支持都可以运行。LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,它只需十几KB的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。
lwIP协议栈主要关注的是怎么样减少内存的使用和代码的大小,这样就可以让lwIP适用于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内存要求,lwIP对API进行了裁减,可以不需要复制一些数据。
2、LwIP的特性
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 和几十 KB 的RAM, 这让它非常适合用在内存资源受限的嵌入式设备中。
(2)支持的协议较为完整。 几乎支持 TCP/IP 中所有常见的协议,这在嵌入式设备中早已够用。
(3)实现了一些常见的应用程序: DHCP 客户端、 DNS 客户端、 HTTP 服务器、MQTT 客户端、 TFTP 服务器、 SNTP 客户端等等。
(4)同时提供了三种编程接口: RAW API、 NETCONN API(注: NETCONN API 即为 Sequential API, 为了统一,下文均采用 NETCONN API) 和 Socket API。 这三种 API 的执行效率、易用性、可移植性以及时空间的开销各不相同,用户可以根据实际需要,平衡利弊,选择合适的 API 进行网络应用程序的开发。
(5)高度可移植。其源代码全部用 C 实现,用户可以很方便地实现跨处理器、跨编译器的移植。另外,它对内核中会使用到操作系统功能的地方进行了抽象,使用了一套自定义的 API,用户可以通过自己实现这些 API,从而实现跨操作系统的移植工作。
(6)开源、免费,用户可以不用承担任何商业风险地使用它。
(7) 相比于嵌入式领域其它的 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 已经足够了。
3、LwIP模式
LwIP提供三种API:
(1)RAW API
RAW API把协议栈和应用程序放到一个进程里边,该接口基于函数回调技术,使用该接口的应用程序可以不用进行连续操作。不过,这会使应用程序编写难度加大且代 码不易被理解。为了接收数据,应用程序会向协议栈注册一个回调函数。该回调函数与特定的连接相关联,当该关联的连接到达一个信息包,该回调函数就会被协议 栈调用。这既有优点也有缺点。优点是既然应用程序和TCP/IP协议栈驻留在同一个进程中,那么发送和接收数据就不再产生进程切换。主要缺点是应用程序不 能使自己陷入长期的连续运算中,这样会导致通讯性能下降,原因是TCP/IP处理与连续运算是不能并行发生的。这个缺点可以通过把应用程序分为两部分来克 服,一部分处理通讯,一部分处理运算。
(2)LwIP API
LwIP API把接收与处理放在一个线程里面。这样只要处理流程稍微被延迟,接收就会被阻塞,直接造成频繁丢包、响应不及时等严重问题。因此,接收与协议处理必须 分开。LwIP的作者显然已经考虑到了这一点,他为我们提供了 tcpip_input() 函数来处理这个问题, 虽然他并没有在 rawapi 一文中说明。 讲到这里,读者应该知道tcpip_input()函数投递的消息从哪里来的答案了吧,没错,它们来自于由底层网络驱动组成的接收线程。我们在编写网络驱动时, 其接收部分以任务的形式创建。 数据包到达后, 去掉以太网包头得到IP包, 然后直接调用tcpip_input()函数将其 投递到mbox邮箱。投递结束,接收任务继续下一个数据包的接收,而被投递得IP包将由TCPIP线程继续处理。这样,即使某个IP包的处理时间过长也不 会造成频繁丢包现象的发生。这就是lwip API。
(3)BSD API
BSD API提供了基于open-read-write-close模型的UNIX标准API,它的最大特点是使应用程序移植到其它系统时比较容易,但用在嵌入式系统中效率比较低,占用资源多。这对于我们的嵌入式应用有时是不能容忍的。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154833.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...