简介
LwIP最先是由瑞典计算机科学院的Adam Dunkels等开发的用于嵌入式系统的开源TCP/IP(共分为四层,详见上一个博客)协议栈,LwIP的含义是Light Weight(轻型)IP协议。
LwIP最大的优势在于可以移植到操作系统上,也可以在无操作系统的情况下独立运行,且代码量小。
实现的协议
- ARP协议:以太网地址解析协议,用来实现主机以太网物理地址到IP地址的映射;
- IP协议:包括IPv4和IPv6,支持IP分片与重装,支持多网络接口下数据报转发,;
- ICMP协议:用于网络调试与维护;
- IGMP协议:用于网络组管理,可以实现多播数据的接收;
- UDP协议,用户数据报协议;
- TCP协议:支持TCP拥塞控制、RTT估计、快速恢复与重传等;
- 提供三种用户编程接口方式:Raw/CallbackAPI、SequentialAPI、BSD-styleSocketAPI;
- DNS:域名解析;
- SNMP:简单网络管理协议;
- DHCP:动态主机配置协议;
- AUTOIP:IP地址自动配置;
- PPP:点对点协议,支持PPPoE。
进程模型
协议的进程模型可以理解为协议实现时被划分在几个进程中,即实现具体协议栈时需要几个进程。
- LwIP采用的进程模型为:协议栈内核同操作系统内核相互隔离,而同时整个协议栈作为操作系统中的一个单独进程而存在。
- 用户应用程序可以驻留在协议栈内核的进程中,也可以实现为一个单独的进程。
- 当驻留在协议栈内核的进程中时,用户程序与协议栈之间的通信是通过回调函数(Raw/CallbackAPI)来实现的。
- 用户程序为一个单独的进程时,需要使用协议栈中的操作系统模拟层提供的信号量与邮箱机制,实现用户进程和协议栈内核的数据交互,也可以用SequentialAPI和SocketAPI进行编程。
协议栈编程接口
LwIP为用户应用程序的编写提供了三种编程接口,用户可以从自己的处理器特点及网络应用程序需求等多方面考虑,选择最佳的编程方式或组合。
Raw/Callback API
使用该API接口来实现LwIP网络编程时,协议栈与用户程序之间通信是通过回调函数来实现的,此时用户程序和协议栈内核运行于同一进程中。
- 用户通过回调的方式执行,致使用户程序和协议栈内核出现了相互制约的关系;
- 在大量数据发送和高速率状态下会使Raw/Callback API不适合在多任务、交互数据量大、数据处理时间开销长等场合下使用。
Sequential API
在操作系统环境中,可以使用该API进行网络应用程序的开发,它是基于操作系统的IPC机制(即信号量和邮箱机制)实现的,它的设计将lwip内核代码和网络应用程序分离成了独立的线程。
- 由此lwip内核线程就只负责数据包的TCP/IP封装和拆封,而不用进行数据应用层处理,大大提高系统对网络数据包的处理效率;
- 使用该API时,可以根据任务的重要性,分配不同的优先级给线程保证时效性,具体原则如下:
Socket API
- socket,即套接字,它对网络连接进行了高级的抽象,使得用户可以像操作文件一样操作网络连接;
- socket编写的网络应用程序具有很好的可移植性;
- lwip中的socket API是BSD Socket,但是并没有也没办法实现全部的BSD socket。