admin 管理员组

文章数量: 1086019


2024年4月12日发(作者:贝尔摩德为什么是新一的干妈)

uIP 一个免费的TCP/IP栈

原文:

Adam Dunkels

adam@

2002年2月15日

翻译:陈建宏 2008年11月11日

7727160@

摘要

这个文档描述uIP TCP/IP栈。 uIP TCP/IP栈是使用于低至8位或16位微处理器的嵌入式系统

的一个可实现的极小的TCP/IP协议栈。现时,uIP代码的大小和RAM的需求比其它一般的TCP/IP

栈要小。

uIP栈使用一个基于编程模块事件去减少代码的大小和RAM的使用量。基于系统的底层和uIP

之间的接口的回应会在文档里描述。系统的底层和uIP之间的接口是隐蔽的。文档后面包含了一

些uIP应用编程例子。

uIP 的代码和这个文档的新版本可以在uIP的主页下载 /adam/uip/。

这个文档描述了uIP的0.6版。

1 引言

新近这些年里,人们对连接一个甚至只是小装置到一个现有的IP网络例如全球因特网的兴趣

增加了。为了可以通过因特网通讯,一个可实现的TCP/IP协议栈是必须的。uIP是一个可实现的

TCP/IP协议组件的一个非常重要的部分。uIP的实现目标是保持代码大小和储存器使用量最小。

现时,uIP代码的大小和RAM的需求比其它一般的TCP/IP栈要小。

uIP使用C编程语言,它可以自用分发

和使用于商业和非商业目的。

其它的TCP/IP栈,储存器经常用于数据缓存,等待一个数据已经成功送达的确应信号。 事实上,

数据包丢失了,数据必须重发。有特色的是,数据是缓存在RAM里,如果需要重发数据,应用

程序可以快速重生数据。例如,一个HTTP服务器服务的大部分是ROM里的静态和半静态页,不

需要在RAM里缓存静态内容。所以,如果一个包丢失了,HTTP服务器可以容易地从ROM里重

生数据。数据简单地从原先的位置读回来。uIP的优越性是允许应用程序参加数据重发。

这个文档由以下部分组成,第2节描述在系统和应用的立场上怎样使用uIP。第3节详细讨论

协议实现细节。第4 节覆盖了uIP的配置,第5节描述uIP的结构部分。最后,第6节提供一些uIP

的应用编程实例。

2 uIP的接口技术

uIP可以看作是一个代码库为系统提供确定的函数。图 1 展示了uIP,系统底层和应用程序

之间的关系。uIP提供三个函数到系统底层, uip_init(), uip_input(),和uip_periodic()。应用程

序必须提供一个回应函数给uIP。当网络或定时事件发生时,调用回应函数。 uIP提供许多函数

和堆栈交互。

要注意的就是uIP提供的大部分函数是作为C的宏命令实现的,主要是为了速度,代码大小,

效率和堆栈的使用。

图 1 uIP就好像一个库

2.1 uIP应用接口

BSD套节字接口使用于大部分的操作系统,它不适合微系统,因为在应用设计里,它逼使一

个线程基于编程模块。一个多线程环境代价重大,因为,不但在线程管理里涉及增加代码的复杂

性,而且保存每线程堆栈需要额外的储存器,还有执行任务切换的时间开销也摊派在这里。微型

系统不会有足够的资源去实现一个多线程环境,因此需要这个环境的应用接口不适合uIP。

相反,uIP使用一个基于编程模块的事件,模块是实现应用程序作为一个C函数被uIP调用的

地方,uIP响应一定的事件。uIP调用应用在,当接收数据时,当数据成功送达另一方中止连接时,

当一个新的连接建立时,或者当数据需要重发时。 应用程序也周期性地循环等待新数据。应用

程序只提供一个回应函数;它提升了应用程序处理不同的网络服务的不同的端口和连接的映射

uIP与其它TCP/IP栈不同的是,当正在重发工作,它需要应用程序的帮助。其它TCP/IP栈缓

存传输数据在储存器里,直到在连接的最后数据确应成功发送。如果数据需要重传,堆栈在没有

通知应用程序下监视着重传工作。通过这种方法,当要等待一个确应,数据必须缓存在储存器里,

如果产生一个重发,应用程序可以快速重新生成数据。为了减少储存器的使用量,uIP利用的论

据是应用程序可以重新生成发送的数据和让应用程序参加重发。

2.1.1 uIP应用事件

应用程序必须作为C函数去实现,uIP在任何一个事件发生时调用UIP_APPCALL()。表 1 列

出可能的事件和每个事件的对应测试函数。测试函数用于区别不同的事件。函数是作为C宏命令

实现的,将会是零值或非零值。注意的是某些函数可以在互相连接时发生(也就是新数据可以在

数据确应的同时到达)。

表 1: uIP应用事件和对应的测试参数

一个数据包到达,确应先前发送到数据

应用程序的新数据包已经到达

一个远程主机连接到监听端口

一个到达远程主机的连接成功建立

计时时间满重发

计时时间满周期性轮询

远程主机关闭连接

远程主机中断连接

由于太多重传,连接中断

uip_acked()

uip_newdata()

uip_connected()

uip_connected()

uip_rexmit()

uip_poll()

uip_closed()

uip_aborted()

uip_timedout()

当应用程序调用时,uIP设置全局变量uip_conn去指向当前连接的uip_conn结构 (图 5) 。这

可以用来区别不同的服务。一个典型的应用是检查uip_conn->lport (当地TCP端口号)去决定那个


本文标签: 数据 应用 事件 连接 函数