lwip协议栈在linux运行,一种轻量级的TCP_IP协议栈LwIP在嵌入式系统中的应用

计算机时代2008年第5期

0引言

一般情况下,如果需要嵌入式Linux系统支持TCP/IP网络协议栈,只需要在内核配置过程中标记内核支持该协议栈即可,但是付出的代价是将内核映像的大小增加200KB左右。如果精简TCP/IP网络协议栈代码,可以使内核映像增加的数量少一些。为此,可以选用一个轻量级的TCP/IP协议栈

(LightweightTCP/IPStack,LwIP)。LwIP是由瑞典计算机科学

协会下的计算机与网络结构实验室开发的,后来作为一个开源

(opensource)项目,由一个全球性的团队进行开发和维护。LwIP的目标就是要有效地减少TCP/IP协议栈所占用的空间,

使之适合于嵌入式系统的需要。

1Linux支持的TCP/IP协议栈分析

在Linux内核源代码目录树中,Linux网络协议代码位于Linux/net目录下。

由于网络代码的特殊性,一般情况下,在内核编译过程中它们不能选择Module编译方式。在Linux/net目录下,core子目录是网络协议实现的核心代码,该目录下的源文件包括了网络协议中使用的公共代码;其他大部分子目录是以协议栈的名称作为子目录名称的,每个子目录下的文件组成一个协议栈模块,集成编译在一起加入内核。

Linux网络系统基本可以分为硬件层/数据链路层、IP层、

INETSocket层、BSDSocket层、应用层五个部分。Linux内核包括了前四个部分。通过TCP/IP协议栈,数据可从应用层到网络设备接口硬件发送出去;也可以从网络设备接口硬件接收数据,通过TCP/IP协议栈往上一直传送到应用层。以发送过程为例:在应用层中的操作对象是socket文件描述符,该层通过文件系统定义的通用接口,使用socket相关系统调用,从用户空间切换到内核空间———在用户空间控制socket文件描述符就相当于在内核中控制BSDSocket,进入到BSDSocket层的操作。在BSDSocket层中,操作的对象是socket{}结构,每一个这样的结构对应一个网络连接,该层通过网络地址簇的不同来区分不同的操作方法,判断是否应该进入到INETSocket层,这一层的数据存放在msghdr{}结构的变量中。在INETSocket层中,根据建立连结的类型,分成面向连结和无连结两种类型,这是区分TCP和UDP协议的主要原则。在这一层的操作对象是sock{}类型的数据,数据存放在sk_buff{}结构中。从INET

Socket层到IP层,主要是路由过程,发送时根据发送的目标地

址确定需要使用的网络设备接口和下一个需要传送到的机器地址。接收数据的时候,需要在IP层判断该数据包是要发送给上一层协议还是要做一个IPForwarding,将数据传给下一个机器。从IP层到硬件层,也就是进入了网络接口设备驱动程序,这就涉及硬件的控制方法了。

2LwIP在嵌入式系统中的应用

一般而言,LwIP只占用40KB左右的内存空间和ROM存储空间,比Linux在内核中实现的TCP/IP协议栈要小得多。

LwIP实现了标准的TCP/IP协议栈,包括TCP、UDP、ICMP、IP、ARP等。LwIP提供了两种API,供用户使用这个协议栈。第一

种是BSDAPI,这种API非常像BSD标准UNIX中的socket

API,所以对其这样命名。它跟普通的socketAPI一样,是基于open-read-write-close模型的。它提供了一种标准的方法来使

用LwIP协议栈。

但这种API效率较低,消耗资源较多,因此不推荐使用。第二种称为RAWAPI。这种API是直接使用了

LwIP协议栈中的回调函数(callbackfunctions),从而使应用

程序和协议栈代码能够更好地集成在一起,运行在同一个进程中。

LwIP把所有与硬件、

操作系统、编译器相关的部分独立出来,放在/src/arch目录下。因此LwIP在Linux上的实现就是修改这个目录下的文件。LwIP的整个TCP/IP协议栈都在一个进程当中,与操作系统内核分开。应用层程序既可以是单独的进程也可以驻留在TCP/IP进程中。如果应用程序是单独的进程,那么可以通过操作系统的邮箱、消息队列等和TCP/IP进程通信。如果应用程序驻留在TCP/IP进程中,那应用程序就可用内部回调函数(RawAPI)和TCP/IP协议栈通信。LwIP会为每个网络连接动态分配一些信号量(semaphore)和消息队列(Message

Queue),当连接断开时会删掉这些信号量和消息队列。LwIP为

了适应不同的操作系统,在代码中没有使用和某一个操作系统相关的系统调用和数据结构,而是在LwIP和操作系统之间增加了一个操作系统封装层。操作系统封装层为操作系统服务(定时、进程同步、消息传递)提供了一个统一的接口。操作系统封装层的源代码在…/LwIP/src/core/sys.c中,而和具体的操作系统相关的代码在…/LwIP/src/arch/sys_arch.c中。操作系统封装层的主要函数分为以下四个部分:

⑴sys_sem_t信号量。LwIP使用信号量通信,在sys_arch

一种轻量级的TCP/IP协议栈LwIP在嵌入式系统中的应用

王亚军

(武警学院计算机教研室,河北廊坊065000)

要:嵌入式Linux系统的网络功能,不仅可以通过裁减内核中与网络有关的代码实现,还可以利用轻量级的TCP/IP协议栈LwIP来实现。文中阐述了LwIP在嵌入式Linux系统中的应用。关键词:LwIP;TCP/IP;Linux;嵌入式系统

15??

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值