轻量级TCP/IP协议中缓冲区与内存管理技术的研究与实现

(整期优先)网络出版时间:2019-02-12
/ 3

摘  要  本文针对嵌入式应用的特点,提出了一种基于微操作系统内核之上的网络通信协议的实现方案,描述了该轻量级TCP/IP协议的总体架构,并重点介绍了其中的缓冲区与内存管理技术。

关键词  轻量级TCP/IP;缓冲区;内存管理;

1 引言

微操作系统的通信软件是移动计算、智能传感器等嵌入式系统应用中的关键系统软件,

为了与传统的计算机网络统一组网,微操作系统中必须支持TCP/IP通信协议。然而,在微操作系统中采用传统的TCP/IP协议无疑将导致系统整体性能的下降,同时,各种移动计算设备和嵌入式系统设备在CPU、存储器、通信部件等硬件配置方面存在着很大的差异。因此,通过研究一种可裁减的轻量级TCP/IP协议并加以实现,从而支持不同的设备,满足不同应用场合的通信和组网需求,具有较强的理论意义和重要的实用价值。

针对上述情况,本文作者实现了该轻量级TCP/IP协议,本文描述了实现过程中的关键技术:缓冲区与内存管理技术。

2 轻量级TCP/IP协议简介绍

2.1 轻量级TCP/IP协议


   所谓轻量级TCP/IP协议,就是关注于用尽可能小的内存消耗和尽可能小的代码量将TCP/

IP在诸如嵌入式系统等资源极其受限的系统上加以实现,以支持资源受限的计算设备与传统计算机网络的互联互通。它具有紧凑、轻便、模块化、高效、可裁减和可移植等特性。

2.2 轻量级TCP/IP协议的组成及设计方案

为了有效利用资源并提高效率,本文基于传统的TCP/IP结构,提出了一种轻量级的TCP/IP实现方案,体系结构如图1

轻量级TCP/IP协议和标准的TCP/IP协议相比,在协议组成、协议实现算法上做了较大的简化,但它具有最基本的功能。

1131434875.gif

图1 轻量级TCP/IP协议栈的体系结构图

    轻量级TCP/IP协议的实现包括如下模块:

    ARP协议:实现了ARP请求和ARP应答协议。

    IP协议:实现了IP最基本的功能,包括,发送、接收、转发。不支持IP选项功能。由于嵌入式系统生成的数据较小,能够直接通过网络传输,因此不需要将输出数据报进行分片;但有可能接收到分片的数据报,因此要对输入数据报片重组,以保证与传统计算机网络的通信。

    ICMP协议:主要用来传递差错报文以及其他需要注意的信息。只实现了ICMP中类型号为0,代码号为0的Ping应答协议。

    TCP协议:实现了RFC793中相应的功能,包括三次握手建立连接,连接的撤消,各种状态之间的转换,超时重传,RTT估算,快速恢复和快速转发。

    UDP协议:用来提供不面向连接的、尽最大努力传输的数据流传输服务。

通用接口层:该层把所有与硬件、OS、编译器相关的部分独立出来。重点是对OS进行了封装,形成了对上层软件的统一接口。当TCP/IP需要系统调用时,并不直接调用OS提供的函数,而是使用该层的接口。因此,实现的轻量级TCP/IP协议可以方便的移植。

缓冲区和内存管理:实现了一种能适应数据动态增删,但在逻辑上又呈连续性的数据结构,能够满足在各协议之间传递数据而又不需要内存拷贝。这种链状数据结构,主要用来存放数据包。有如下特色:

1)  方便的在数据的头部增加空间与删除数据,用于处理包头;

2)  可以通过指针来避免真实的拷贝来拷贝包;

3)  可以不拷贝而将多个包形成一个包或将一个包分割成多个包。

针对嵌入式应用的特点,对该数据结构的内存管理采用静态内存管理方法,即在系统启动时一次性申请到足够的内存,在系统运行时不在释放,以此来增加系统的稳定性。内存管理提供内存分配,内存释放等服务。

轻量级TCP/IP协议的配置项:为适合不同的应用需求,通过一个可配置项来设置一些可

配置信息。主要有:UDP是否使用、TCP是否使用、TCP是否主动打开、ARP表大小、接收缓冲大小、TCP连接数、是否使用中断方式等。根据实际应用情况,选取合适的参数对于节约存储空间、加快程序运行具有很大的作用。

3 轻量级TCP/IP协议的缓冲区及内存管理技术

网络的一个主要性能是数据吞吐量。对网络软件的各个组件研究表明,缓冲区是影响网络性能的最重要的因素。同时,缓冲区的分配是与内存管理分不开的。因此,本文对它们的实现机制进行详细的描述。

3.1 轻量级TCP/IP协议的缓冲区技术

轻量级TCP/IP协议缓冲区的职责有两个:

(1) 为协议栈提供合适的缓冲区,如果缓冲区太大会浪费系统资源,太小则会影响

协议的吞吐量

(2)提供合适的数据结构装载网络报文,既可以方便的处理报文,又可以减少缓冲区

拷贝的次数。

借鉴标准TCP/IP的缓冲区设计技术,轻量级TCP/IP协议通过接收数据缓冲和发送数据

缓冲存放数据。采用2种数据链表结构来存放待发送数据和接收数据,分别为MBUF_RAM,

和MBUF_POOL。其中,MBUF_RAM用于在发送数据时存放各层协议首部信息, MBUF_POOL用于存放接收数据。MBUF_RAM的数据结构如图2所示:

1131448468.gif
图2 缓冲区数据存储结构

首先要考虑MBUF_RAM数据区的大小,因为通信系统的内存和缓冲区管理模块必须处理大小变化很大的数据块,对于一个完整的TCP包,其大小可达到几百字节,而对于一个ICMP响应,其数据只不过是几个字节。如果数据区太大,对于像ICMP响应这样的小数据量的应用而言,每次浪费的空间太大;如果数据区太小,则MBUF_RAM的有效利用率(L数据区/LMBUF_RAM)偏低,有效的内存空间不能被充分的利用。MBUF_RAM的长度要兼顾大数据量和小数据量的网络应用。

一个MBUF由头部和数据区构成, MBUF头部包括了链表指针、数据长度、类型、标志等控制信息,剩下的是数据区,主要用来存放协议头部。根据IPv4规定, 一个TCP/IP协议的头部最多为120字节(20字节的IP头部+40字节的IP选项+20字节的TCP头部+40字节的TCP选项),所以MBUF的数据区至少应该大于120字节。

对于以太网来说,最大IP报文长度是1500字节,TCP最大报文长度是1460字节, UDP最大传输单元是1480字节。一个IP报文用一个MBUF链表示,通常第一个MBUF存放全部的协议头部, 从第二个MBUF开始,存放报文数据。MBUF数据区的长度的整数倍应该等于或稍大于TCP的最大报文长度和UDP的最大传输单元。在这里我们选择MBUF的长度为496字节。

协议栈中所有报文存储在上述链表数据结构中,当报文在协议栈中流动时,不会拷贝报文链,而是将报文链的指针通过参数传递。当报文需要进入缓冲区时,也是通过链表的指针操作将报文插入或添加到队列中。

当协议栈需要分配一个缓冲时,就调用:Struct mbuf  * allock_mbuf( )。其入口参数指明所申请缓冲区的大小,如果分配成功则返回该缓冲区的指针,否则返回空指针。

通过函数Struct mhuf  * free_mbuff( )释放指定的缓冲区,该函数返回被删除缓冲区的后续缓冲区的指针。

MBUF_POOL的数据结构与MBUF_RAM相似,本文建立了由16个MBUF_POOL结构组成的链表,由16个固定大小的MBUF组成,这些MBUF是由一个MBUF池分配来的。申明如下:# define MBUFNUM 16;Static struct mbuf pool [MBUFNUM];

MBUF_POOL主要用于网卡驱动程序,因为分配一个MBUF的操作非常快捷,因而非常适用于中断处理程序。

3.2 轻量级TCP/IP协议的内存管理技术

MBUF需要RTOS(如:pSOS,VxWorks等)通用内存管理的支持,由于微操作系统往往是要求可靠性非常严格的系统,而通用内存管理中的内存反复分配和释放,极易造成系统的不稳定和内存碎片的增加以及系统效率的下降。所以,微操作系统应用中往往采用静态内存管理方法,即在系统初始时,一次申请到足够的内存,这保证了网络系统不会用尽所有的可用内存,不会干扰其他程序的运行。在系统运行时不再释放,以此来增加系统的稳定性。作者设计并实现了一个基于静态内存管理方法的MBUF支持算法,简述其实现思路如下:

⑴ 在系统初时为MBUF分配一块足够大的内存空间。

⑵ 进行内存初始化,分出两类内存块,每类有若干个。第一类,MBUF头部,第二类,MBUF数据区。


⑶ 建立一个控制结构,每个内存块的头部都有一个控制结构, 如图3,用以跟踪内存的使用。

1131447863.gif

图3 内存段控制结构

定义如下:

Struct mem{

         mem_size_t next,prev;    //将内存段连接为双向链表

         unsigned used;           //标志内存是否使用

         }

内存管理还提供内存分配、内存释放以及缩小先前分配的内存区等服务。具体的实现函数如下:

void mem_init(void);                         // 创建一个堆

void *mem_mollac(mem_size_t size);          // 内存段的分配

void *mem_free(void *mem);               // 内存段的释放

//  依据size在指针mem所指的内存段上收缩

void *mem_realloc(void *mem, mem_size_t size);

// 按size分配一新的内存段,将指针mem所指的size字节拷贝过来,并释放原先的段

void *mem_reallocm(void *mem, mem_size_t size);

4 结束语

   本文介绍了轻量级TCP/IP协议的特点和设计方法,重点描述其中了缓冲区和内存管理技术。

    随着移动计算、智能传感器、远程监控、信息家电等技术的飞速发展,如何实现安全、高效的、支持IP互联的通信协议成为关注的焦点,本课题的研究和实现,将从根本上满足这些现实的需求,因此将会有很好的应用前景。

参考文献

[1]       Gary R.Wright W.Richard Stevents TCP/IP详解,卷1:协议,范建华等译.机械工业出版社,2000

[2]       Gary R.Wright W.Richard Stevents TCP/IP详解, 卷2:实现,陆雪莹,蒋慧等译.机械工业出版社,2000

[3]       Douglas E.Comer,David L.Stevens 用TCP/IP进行网际互连 第一卷:原理,协议和体系结构.林瑶等译.

     电子工业出版社,1998

[4]   Douglas E.Comer,David L.Stevens 用TCP/IP进行网际互连 第一卷:设计,实现和内部组成.王海等译.电子工业出版社,1998

[5]   RFC文档

[6]   Adam Dunkels,lwip source code and document. http://www.sics.se/-adam/lwip

[7]   Adam Dunkels,lwip source code and document.http://www.dunkels.com/adam/uip/index.html

[8]  王新建, 姚丹霖 ,江国庆. 微操作系统中轻量级TCP/IP协议的研究与实现 ,《网络新技术与应用年会论文集》.电子工业出版社,2005