Lwip可以移植到操作系统上,也可以在无操作系统的情况下独立运行。LwIP实现的
重点是在保持TCP/IP协议主要功能的基础上减少对RAM的占用,这使得LwIP协议栈很适合在嵌入式系统中使用。
以下是从网络上搜集并整理的一些资料,来说明Lwip的特点,看这个协议栈能否满足我们的应用。 Lwip协议栈的特点:
(1) 支持多网络接口下的IP转发
(2) 支持ICMP协议
(3) 包括实验性扩展的的UDP(用户数据报协议)
(4) 包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议)
(5) 提供专门的内部回调接口(Raw API)用于提高应用程序性能
(6) 可选择的Berkeley接口API(多线程情况下)
(7) 在最新的版本中支持ppp(这很适合我们的实际应用,避免重写PPP协议)
(8) 新版本中增加了的IP fragment的支持.
(9) 支持DHCP协议,动态分配IP地址.
Lwip的进程模式: 所有tcp/ip协议栈都在一个进程当中,这样tcp/ip协议栈就和操作系统内核分开了。而应用层程序既可以是单独的进程也可以驻留在tcp/ip进程中。如果应用程序是单独的进程可以通过操作系统的邮箱,消息队列等和tcp/ip进程进行通讯。如果应用层程序驻留tcp/ip进程中,那应用层程序就利用内部回调函数口(Raw API)和tcp/ip协议栈通讯.对于ucos-ii来说进程就是一个系统任务。lwip的整个tcp/ip协议栈都在同一个任务(tcpip_thread)中。应用层程序既可以是独立的任务(tftp_thread,tcpecho_thread),也可以在tcpip_thread中,利用
内部函数口(Raw API)和tcp/ip协议栈通讯。需要说明的一点是lwip会为每个网络连接动态分配一些信号量(semaphone)和消息队列(Message Queue),当连接断开时会删掉这些semaphone和Queue。
Lwip提供三种API:1)RAW API 2)lwip API 3)BSD API。
(1)RAW API把协议栈和应用程序放到一个进程里边,该接口基于函数回调技术,使用该接口的应用程序可以不用进行连续操作。不过,这会使应用程序编写难度加大且代码不易被理解。为了接收数据,应用程序会向协议栈注册一个回调函数。该回调函数与特定的连接相关联,当该关联的连接到达一个信息包,该回调函数就会被协议栈调用。这即有优点也有缺点。优点是既然应用程序和TCP/IP协议栈驻留在同一个进程中,那么发送和接收数据就不再产生进程切换。主要缺点是应用程序不能使自己陷入长期的连续运算中,这样会导致通讯性能下降,原因是TCP/IP处理与连续运算是不能并行发生的。这个缺点可以通过把应用程序分为两部分来克服,一部分处理通讯,一部分处理运算。
(2)Lwip API把接收与处理放在一个线程里面。这样只要处理流程稍微被延迟,接收就会被阻塞,直接造成频繁丢包、响应不及时等严重问题。因此,接收与协议处理必须分开。LwIP的作者显然已经考虑到了这一点,他为我们提供了tcpip_input()函数来处理这个问题,虽然他并没有在rawapi一文中说明。讲到这里,读者应该知道tcpip_input()函数投递的消息从哪里来的答案了吧
|