LWIP协议栈解析(一)——概述
1 概述
lwip是瑞典计算机科学院的Adam Dunkels开发的一个小型开源TCP/IP协议栈,其实现重点是在保持TCP协议主要功能的基础上减少对RAM的占用,因此适用于嵌入式开发板这类存储资源较小的设备。
lwip提供了三种API:
(1)RAW API。它将协议栈与应用程序放在一个进程里,该接口基于函数回调技术,适合在无操作系统环境,对比于其他两种API,可提高应用程序的效率、节省内存开销。但代码可读性差,容易出现丢包现象。
(2)NETCONN API。它基于操作系统的 IPC 机制(即信号量和邮箱机制) 实现, 它的设计将 LwIP 内核代码和网络应用程序分离成了独立的线程。它相较于RAW API,简化了编程工作,使用户用户可以像操作文件一样操作网络连接(打开/关闭、读/写数据),避免了内核程序与应用程序之间的数据拷贝,提高了数据递交的效率。但它需要耗费更多的时间和内存,且需要用户对lwip使用的数据结构有所了解。
(3)SOCKET API。即套接字编程,它对网络连接进行了高级的抽象,使得用户可以像操作文件一样操作网络连接。lwip中的SOCKET API采用BSD SOCKET。相较于 NETCONN API, SOCKET API 具有更好的易用性。使用 Socket API 编写的程序可读性好,便于维护,也便于移植到其它的系统中。 SOCKET API在内核程序和应用程序之间存在数据的拷贝,这会降低数据递交的效率。另外,SOCKET API 是基于NETCONN API 实现的,所以效率要比NETCONN API更低。
2 lwip1.4.1文件夹文件组织
lwip1.4.1版本是最广为应用的版本,其文件夹文件组织如图1所示。
![]() 图1 lwip1.4.1文件夹文件组织 |
(1)doc:该文件夹是供给用户使用的移植说明文档。
(2)src:该文件夹包含了LwIP的源码。
(3)test:该文件夹是官方提供的测试程序。
(4)CHANGELOG:该文档记录了版本的新特性和改动。
(5)COPYING:该文档是作者的版权说明文档。
(6)FILES:该文档讲述了doc、src文件夹的用途。
(7)UPGRADING:该文档记录了版本间的改动,为旧版本的升级提供说明。
2.1 doc目录下的文件
doc目录下的文件结构如图2所示,每个文件的作用在FILES文件中已给出具体说明。
图2 doc目录下的文件结构 |
文件FILES内容如图3所示。
图3 doc目录下文件FILES内容 |
(1)savannah.txt,说明如何获得当前lwip开发版本的源码。
(2)contrib.txt,说明如何作为开发者为lwip贡献。
(3)rawapi.txt,说明lwip RAW/Callback API编程中的核心API,同时也提供其他API编程方式和多线程的概述。
(4)snmp_agent.txt,说明lwip SNMP代理方法。
(5)sys_arch.txt,说明lwip的系统抽象层接口。
2.2 src目录下的文件
src目录是整个lwip的核心部分,其目录结构如图4所示。
图4 src文件夹目录结构 |
通过查看FILES文档,可知各文件夹包含内容如图5所示。
图5 src目录下文件FILES内容 |
(1)api,包含高级API源码,即NETCONN API和SOCKET API,若用户使用RAW/Callback API编程,则无需该文件夹。
(2)core,包含TCP/IP协议栈的核心源码,协议应用、内存管理以及RAW/Callback API编程。
(3)include,包含lwip头文件。
(4)netif,包含通用网络接口文件以及ARP相关文件。
更多内容详见下一节:LWIP协议栈解析(二)——网络数据包管理