1.1 uIP 特性
uIP由瑞典计算机科学学院(网络嵌入式系统小组)的 Adam Dunkels开发。其源代码由 C 语言编写,并完全公开,所有代码和相关说明文档可以到
下载。最新版本是uIP1.0 版本,本书移植和使用的版本正是此版本。
uIP 协议栈去掉了完整的 TCP/IP 中不常用的功能,简化了通讯流程,但保留了网络通信必须使用的协议,设计重点放在了 IP/TCP/ICMP/UDP/ARP 这些网络层和传输层协议上,保证了其代码的通用性和结构的稳定性。 由于 uIP协议栈专门为嵌入式系统而设计,因此还具有如下优越功能:
(1) 代码非常少,其协议栈代码不到 6K,很方便阅读和移植。
(2) 占用的内存数非常少,RAM 占用仅几百字节。
(3) 其硬件处理层、协议栈层和应用层共用一个全局缓存区,不存在数据的拷贝,且发送和接收都是依靠这个缓存区,极大的节省空间和时间。
(4) 支持多个主动连接和被动连接并发。
(5) 其源代码中提供一套实例程序:web 服务器,web 客户端,电子邮件发送程序(SMTP客户端),Telnet服务器, DNS 主机名解析程序等。通用性强,移植起来基本不用修改就可以通过。
(6) 对数据的处理采用轮循机制,不需要操作系统的支持。
由于 uIP 对资源的需求少和移植容易,大部分的 8 位微控制器都使用过 uIP协议栈, 而且很多的著名的嵌入式产品和项目(如卫星,Cisco路由器,无线传感器网络)中都在使用 uIP协议栈。
1.2 uIP 架构
uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序的通讯,对于整个系统来说它内部的协议组是透明的,从而增加了协议的通用性。uIP协议栈与系统底层和高层应用之间的关系如图1-1所示。
从上图可以看出,uIP 协议栈主要提供了三个函数供系统底层调用。即uip_init(), uip_input() 和 uip_periodic() 。其与应用程序的主要接口UIP_APPCALL( )。
uip_init()是系统初始化时调用的,主要初始化协议栈的侦听端口和默认所有连接是关闭的。 当网卡驱动收到一个输入包时,将放入全局缓冲区 uip_buf中,包的大小由全局变量 uip_len 约束。同时将调用 uip_input()函数,这个函数将会根据包首部的协议处理这个包和需要时调用应用程序。当 uip_input()返回时,一个输出包同样放在全局缓冲区 uip_buf 里,大小赋给 uip_len。如果 uip_len 是 0,则说明没有包要发送。否则调用底层系统的发包函数将包发送到网络上。 uIP 周期计时是用于驱动所有的 uIP 内部时钟事件。当周期计时激发,每一个TCP连接都会调用uIP函数uip_periodic()。 类似于uip_input()函数。 uip_periodic()函数返回时,输出的 IP 包要放到 uip_buf 中,供底层系统查询 uip_len 的大小发
送。
由于使用 TCP/IP 的应用场景很多,因此应用程序作为单独的模块由用户实现。uIP 协议栈提供一系列接口函数供用户程序调用,其中大部分函数是作为 C的宏命令实现的,主要是为了速度、代码大小、效率和堆栈的使用。用户需要将应用层入口程序作为接口提供给 uIP 协议栈,并将这个函数定义为宏
UIP_APPCALL()。这样,uIP在接受到底层传来的数据包后,在需要送到上层应用程序处理的地方,调用 UIP_APPCALL( )。在不用修改协议栈的情况下可以适配不同的应用程序。
阅读(1001) | 评论(0) | 转发(0) |