嵌入式TCP/IP协议选型

来源:互联网 发布:sb-dji 域名 编辑:程序博客网 时间:2024/06/07 06:36

发信人: autoca (团结一切可以团结的力量), 信区: Embedded
标  题: 嵌入式TCP/IP协议选型1
发信站: 郁金香BBS站 (2007年09月02日14:22:33 星期天), 站内信件

本帖介绍自己对嵌入式系统应用中TCP/IP协议选型的初步考虑。

我的硬件平台是NXP的LPC2100和LPC2300系列ARM7,片内有256~512K的Flash,16~3
2K 的SRAM,不支持总线外扩。软件方面需要使用uC/OS-II和运行于UDP之上的SNMP
v1。

前面的帖子“开源项目: uIP嵌入式TCP/IP协议栈zz”中有个链接,可以下载到mob
isys2003.pdf文件,打开看看,它的标题是:
“Full TCP/IP for 8-Bit Architectures”。

这篇文章里面,表1有一个uIP和lwIP的比较,引用如下:

Table 1: TCP/IP features implemented by uIP and lwIP
--------------------------------------------------------
Feature                                uIP                 lwIP

IP and TCP checksums             x                  x
IP fragment reassembly           x                  x
IP options
Multiple interfaces                                       x
UDP                                                          x
Multiple TCP connections         x                  x
TCP options                           x                  x
Variable TCP MSS                   x                  x
RTT estimation                       x                  x
TCP flow control                     x                  x
Sliding TCP window                                     x
TCP congestion control        Not needed        x
Out-of-sequence TCP data                           x
TCP urgent data                      x                  x
Data buffered for rexmit                               x
--------------------------------------------------------

可见,uIP支持的feature在lwIP都支持。

重要的是,发现uIP还不支持UDP协议!
因为我在做的东西要用到SNMP协议,而SNMP一般是跑在UDP上面的,所以只好放弃uIP
的路线。

再看lwIP,网上可以搜到lwIP v0.5.3版本移植到uC/OS-II的资料,这个版本是比较
旧的了,较新版本的lwIP1.2.0加入了对SNMPv1的支持,这个是我要的。所以继续看
lwIP总体上是否适合我的需要。

除了上面mobisys2003.pdf那篇文章的比较外,还得结合自己的硬件平台考虑。比如
我用的平台是NXP的LPC2100,LPC2300等ARM7芯片,片内Flash最大512K,片内局部
RAM为16K~32K,当然有些片内外设如Ethernet,USB等还有自己的通过AHB总线访问的RAM,
其大小为16K或8K。这些参数决定了哪一种tcp/ip协议栈适合在自己的平台上跑。
那么我们看看下面的简单比较:

(1)uIP使用几Kilobytes的ROM, 仅几百Bytes的RAM;
(2)lwIP则使用大约40kilobytes的ROM,几十K Bytes的RAM(其源代码里面的注释是
这么说的);

可见要采用lwIP还是有一定风险,虽然它被称为light weight IP,但我的系统由于
RAM比较小,所以选择lwIP是否合适还有待进一步验证。

 

 

寄信人: autoca ( =)
标  题: 开源免费的嵌入式TCP/IP协议选型2

前面初步介绍了lwIP和uIP,在使用它们之前先得在自己的开发板上移植,所谓移植
就是修改跟处理器、以太网控制芯片(或片内集成模块)、RTOS、以及编译器相关的部
分。具体而言就是重写底层以太网驱动层,分配定时器,创建RTOS分配给网络模块
的信号量、消息队列等资源,RTOS开/关中断的方式,以及编译器的关键字,例如A
DS和IAR这两种编译器的汇编程序有些关键字是不一样的。

可见,移植TCP/IP协议栈是比较繁琐的。所以我决定先使用周立功的ZLG/IP,因为
手头的板子上它已经移植好了,不过只是初级的v1.0版,有人说它目前还很多bug(
过段时间我整理好再说说自己试用时遇到的bug)。ZLG/IP是基于uC/OS-II的,它有
三个任务:以太网接收及ARP、ICMP任务,UDP收发任务和TCP收发任务。可以自己裁
剪,比如我就把TCP任务裁剪掉了,编译后整个程序占用RAM才25k左右。

ZLG/IP的应用程序编写很方便,和linux下的socket编程很类似,它现在只支持DGRAM和
STREAM两种类型,不支持RAW。sockaddr的结构和linux的sockaddr定义是不同的
。还有很多特点用熟才会知道。

下面是引用的ZLG/IP的说明:

已实现的特性

?? 支持TCP, UDP, IP, ICMP, ARP, ETHERNET等协议;
?? 兼容BSD标准的Socket API接口函数库;
?? ICMP实现PING的功能和UDP无效端口返回;
?? 支持TCP的流控制和超时重传;
?? 支持TCP主动连接和被动连接;
?? 支持在多任务中建立多个不同的TCP连接,支持各连接同时收发数据;
?? 提供WebSever和UDP服务器范例。

暂时未实现的特性

?? IP报的处理不支持分段 在多个网络接口的应用是两个网络间的最大报大小要基
本相等。
?? ICMP协议还不是非常完整 目前ICMP协议只支持PING的功能和UDP无效端口返回。
?? TCP协议不支持紧急数据 这一版本的ZLG/IP不对TCP传输中的紧急数据报进行处
理。
?? 不支持IGMP协议 这一版本的ZLG/IP不支持IP组播和广播。
?? 不支持Socket API发送函数发送大于PMTU 用Socket API发送函数发送数据时,
数据长度不可大于一个TCP或UDP报有效数据的长度。