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端口号)去决定那个
版权声明:本文标题:uip1.0 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1712932660a613122.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论