刘杰;姜胜明;杨恺健
【摘 要】Semi-TCP协议将传统TCP的拥塞控制下放到MAC层,构成逐跳的拥塞控制来判断节点间的拥塞状态,它比传统TCP以及在这基础上改进的无线TCP更适应于动态拓扑的网络.但是目前对Semi-TCP协议的研究还仅局限于计算机仿真阶段.因此尝试基于实际平台RP4412开发板,不修改已有MAC层的控制帧和已有的硬件配置信息,利用软件定义发送数据帧的形式,在帧体域携带节点缓存状态量化信息,完成节点拥塞状态信息的传递,以此实现并测试Semi-TCP在实际平台下拥塞控制的性能.
【期刊名称】《现代计算机(专业版)》 【年(卷),期】2017(000)011 【总页数】5页(P65-69)
【关键词】Semi-TCP;逐跳拥塞控制;多跳无线网络;动态拓扑网 【作 者】刘杰;姜胜明;杨恺健
【作者单位】上海海事大学信息工程学院,上海 201306;上海海事大学信息工程学院,上海 201306;上海海事大学信息工程学院,上海 201306 【正文语种】中 文
在动态拓扑网络中,由于信道损耗以及动态路由等相关问题,造成许多非拥塞因素引起的丢包,根据TCP层丢包即拥塞的原则,TCP盲目地拥塞控制,缩小拥塞窗口值,减小发送速率,导致网络的吞吐量降低。Semi-TCP协议采用跨层设计的思
想,将传统传输层的端到端的拥塞控制功能下放到数据链路层的MAC层,保留TCP的可靠性控制[1]。它是一种逐跳的拥塞控制方法,是为解决在无线动态拓扑网络场景下,由于许多非网络拥塞因素造成对网络拥塞误判以及处理不及时的不足,提高了网络拥塞控制的效率,提升了网络吞吐量。
针对Semi-TCP的研究,大量仿真实验已经证明其在动态拓扑网络场景下,逐跳的拥塞控制比传统TCP端到端的控制更有效。但是现在还仅局限于计算机仿真阶段,主要的仿真实现方法是利用增加或修改控制帧并让其携带缓存状态信息,递归逐跳地传递拥塞信息,来实现拥塞控制。目前的实现方法有通过增加控制帧fCTS的方式,发送节点向接收节点发送RTS时,如果接收节点缓存空间不足以接收数据,回复fCTS给 RTS的发送方,告知拥塞[2];也可以通过修改RTS/CTS帧,即通过带拥塞状态的控制帧RTSC/CTSC来传递拥塞信息[3];在文献[4]中,利用ACK捎带其拥塞信息,以此告知发送方能否发送数据[4];还有方法是在MAC层和TCP层之间通过增加一个虚拟层VTCP,上层收到VACK后调节发送窗口大小,改变发送速率,并且修改RTS帧控制域的subtype字段,实现拥塞状态的判定[5]。文献6提出了一种基于被动侦听和数据帧调度的无线多跳网络拥塞方法[6]。综上几种Semi-TCP的实现方法,它们的共同点是都需要改变现有TCP/IP协议栈的体系结构,需要改变无线网络接口卡的既有的硬件配置信息,同时网络结构和终端系统都需要配置该协议。
本文尝试基于现有实际平台RP4412开发板,通过C语言修改相关函数,软件定义发送数据帧的方式,不修改已有MAC层的控制帧和现有的硬件配置信息,在数据帧的帧体域携带节点缓存状态量化信息,完成节点拥塞状态信息的传递。本方法使用开发板4412搭建实际平台,在Linux(Ubuntu)操作系统下交叉编译已修改的相关代码信息并移植到开发板上,利用软件定义判断开发板无线网卡缓存状态再发送数据帧的方式实现拥塞状态的判断。
1.1 Semi-TCP协议算法
Semi-TCP协议发送节点(或转发节点)根据收到来自接收节点(或下一跳)的接收缓存状态信息和接收节点缓存数据的处理速率及时地对自身节点发送速率和高层向下层发送速率的调节。收到下一跳发送的特殊数据帧,根据帧体域携带的信息进行拥塞判断及处理。Semi-TCP系统的整体架构如图1所示。
从整体上讲,Semi-TCP算法可分成节点自身的拥塞判定和节点间的拥塞传递;节点自身的拥塞判定是指作为发送节点(包括转发节点)时,对传输层向下层发送数据速率的调节。能否向下层发送数据取决于MAC层的发送缓存是否达到了拥塞门限值。节点自身缓存分层划分如图2所示,设节点内发送缓存的空间容量为L(已设定),拥塞门限值为CTh(Congestion Threshold),缓存中当前数据包占用空间为N,0〈CTH≤L。当N〈CTh时,没有拥塞,否则有拥塞。当没有拥塞时,发送节点(包括转发节点)的传输层可以向下层发送数据,否则就不能发送数据[7]。
节点间的拥塞传递是指相邻节点间发送速率的调节。节点在收到下一跳发来的拥塞状态信息,暂停向该节点发送数据。 1.2 Semi-TCP协议实现场景
Semi-TCP协议适用在无线网络场景下,而Linux作为一个开放源代码的操作系统,它支持大量的网络协议,是测试新协议及其增强的良好平台,RP4412开发板所用的正是Linux内核3.0,相关代码修改后交叉编译后移植到开发板上。Linux无线网络架构如图3所示。
图3左侧显示了Linux内核网络协议栈的基本机构,虚线下是以太网设备;右侧显示了Linux无线网络结构,虚线以下是Wi-Fi设备,主要涉及物理层和数据链路层。虚线上展示的是内核空间的情况。用户空间的程序运行在最上层,而硬件相关的设备则在最下面。Linux内核无线子系统分成两大块,cfg80211和
mac80211,它们连通内核其他模块和用户空间的应用程序。其中cfg80211在内核空间提供配置管理服务,内核与应用层通过nl80211时间配置管理接口。Linux内核无线子系统处理OSI模型最底层的MAC和PHY层,MAC层可以分为MAC上层和MAC下层,前者管理无线网络的身份认证、探测、关联等;后者实现MAC层如ACK等操作。硬件(无线适配器)处理了大部分的PHY层和MAC下层操作。
Linux无线子系统实现大部分的MAC上层的回调函数。内核具有高内聚低耦合的特性,各个模块之间分界线很清晰,内核通过一系列的函数指针使得各层之间相互透明不可见。所以在rtl8188EUS(4412开发板集成的USB无线网卡)驱动做修改时,不需要改动mac80211的代码,添加Semi-TCP协议相关操作不用修改套接字层和设备无关层代码。数据和管理路径在mac80211中是分开实现的。数据路径对应着IEEE802.11数据帧(Data Frame),而管理路径对应着IEEE802.11控制帧(Control Frame)。 2.1 交叉开发环境的搭建
开发环境的搭建采用主机与目标板相结合的交叉开发模式,在PC端主机上配置Windows XP操作系统,在虚拟机软件VMware workstations上安装Ubuntu 12.04操作系统并配置交叉编译环境arm-2009q3.tar,用于编辑开发调试。开发板上配置内核Linux kernel 3.0文件系统android 4.0.4,PC端将开发好的协议代码烧写到开发板,开发板作为目标板运行和测试所编写好的协议代码。 开发板开发环境搭建外观实景图:
2.2 Semi-TCP协议数据包的传送和接收过程
在Linux无线网络系统中,mac80211已经注册了网络设备驱动,可看作net_device。在代码路径kernel/ net/mac80211/iface.c中可见。在mac80211内部,ieee80211_subif_start_xmit实现这样一个调用子序列:
ieee80211_xmit=>ieee80211_tx=>ieee80211_tx_frags =>drv_tx信息从mac80211传下来,驱动程序将数据转换成底层硬件可识别的形式,再做相关帧数据的调整,将数据帧放入发送队列,将帧的描述符发送给硬件。在开发板RP4412中数据帧到最后都是通过USB接口发送给无线设备rtl8188EUS。 当数据包在空中被无线设备捕捉到,RP4412内核通过轮询机制判断是否有数据到来,促使接收函数将被调用,驱动层的回调函数为mac80211填充接收描述符,然后把数据包推送给mac80211,由mac80211将数据包放入接收队列。如果收到的帧是数据帧,它将被转换成802.3数据帧,然后改数据帧将通过
netif_receive_skb交付给网络协议栈,在协议栈中各层网络协议将会对数据进行解析,根据收到的数据帧的帧体域捎带的MAC缓存状态的量化信息,增加一个触发器,如果预先设置缓存状态信息大于90%(或者设置50%,70%,并作比较),则代表该发送节点拥塞,否则不拥塞;如果收到的帧是控制帧,则将会由ieee80211 _sta_rx_queued_mgmt处理,部分控制帧(如ack帧)在mac80211层终止,部分(如认证帧)则会通过cfg80211发送给用户空间下的管理程序。
2.3 Semi-TCP协议实现的主要流程
发送节点内核通过轮询得知有数据要发送,接收节点收到发送节点的大量数据,触动触发器,此时,接收节点向发送节点发送特殊的数据帧,帧体域携带接收缓存的占用率和接收节点的数据处理速率(向高层发送或者转发至其他节点),作一个简单判断,然后根据这些信息调整自身的发送速率,通知高层降低发送速率,如果是中间节点(转发节点),则向网络中上一个节点反向递归传递拥塞信息,实现逐跳的拥塞控制。
特殊的数据帧的帧类型,设置帧控制域中的Type字段为10及Subtype字段为null,即特殊的数据帧。发送节点收到该特殊的数据帧,读取subtype字段得知
是事先定制携带有节点缓存信息的特殊数据帧,然后从帧体内读取的缓存状态信息。 帧体设置了一个标志位flag,当缓存占用率达到门限值时flag=1;否则flag=0;根据帧体携带拥塞状态flag和接收节点的数据处理速率Rv两个信息,发送节点根据接收到的信息,调低发送节点的发送速率Tv到小于接收节点的接收数据处理速率Rv,即Tv〈Rv;将原有TCP协议机制上将拥塞控制功能删除,即内核协议栈中的拥塞窗口处理函数不做任何处理。实现流程如图5。
搭建测试平台是为了在添加拥塞状态判断后网络是否有异常,测试环境需要两台开发板测试机,一台作为测试机,另一台作为对端机;2一块带有两块网卡的服务机,一块网卡接测试机网络,另一块网卡接AP网络;3.一个带有命令行界面的AP。测试工具采用OpenGroup开发维护的测试工具集TETware。 操作步骤如下:
(1)安装Server和AP网络:将无线测试脚本拷贝到目录〈server machine>:/usr/local/bin/配置环境变量在
/usr/local/bin/apset/apset.cisco/config.pm配置ap网络地址IP,设置SSID_Semi-TCP以及AP_Login、AP_Password等相关配置;
(2)安装测试机和对端机:将测试脚本写入测试机;安装和配置测试环境执行命令./config.sh-flrt以及./etc/TVSEnvironment,然后运行tvs run; (3)开始测试:/usr/tet/TVS/etc/TVSListing定义好测试场景,运行测试脚本./etc/TVSEnvironment;获取测试报告/usr/tet/TVS/Reports/latest。 根据三项测试得到的结果进行分析:
(1)通过端到端的连通测试工具ping命令分析和判断网络是否故障,根据测试结果分析,测试机与对端机之间网络连接畅通,时延略有延长,丢包率为0。 (2)根据所搭建的测试环境平台,在TETware下运行定义好的测试场景分析得出,在不同场景脚本下,设置不同的工作模式与信道,原有的802.11协议运行
不会受到影响,网络状态正常。
(3)利用802.11网络分析工具Wireshark,它是完全开放源源码的封包分析软件,将无线接口切换为监控模式(monitoring mode),然后输入命令Wireshark启动软件,开始抓包。在封包列表窗口选中IEEE802 data,树状视图窗格IEEE802.11 data域中,可见数据包的具体封装,在下面的数据视图窗格,获取到帧体域(Frame Body)携带的拥塞状态信息。根据在测试机和对端机之间大量的发送数据,呈现出两种帧体携带拥塞信息的特殊的数据帧。实时的抓包可以看出拥塞状态,状态值n〈9(或者n〈5,n〈7)时,未发生拥塞,当值变成n=9(或者n=5,n=7时启动触发器,告知接收机器发生拥塞,可以看出我们通过软件定义发送数据帧的形式,在帧体域携带节点缓存状态量化信息,初步实现了两个节点之间拥塞状态信息的传递。
随着对Semi-TCP协议不断研究,继续对拥塞控制方法等的优化,对实现拥塞控制算法的优化还能继续深入。在实际平台RP4412开发板,通过软件定义发送数据帧的形式,实现在帧体域携带节点缓存状态量化信息,完成节点拥塞状态信息的传递,在此基础上利用开源测试工具TETware建立多种场景和Wareshark对Semi-TCP在实际平台下拥塞控制的性能进行了分析。由此得知,Semi-TCP在实际平台下内核协议栈和网卡驱动代码的改进优化,对节点内和节点间的拥塞控制方法需要继续不断调试。
刘杰(1989-),男,山西太原人,硕士研究生,研究方向为无线网络协议 【相关文献】
[1]Jiang S,Zuo Q,Wei G.Decoupling Congestion Control from TCP for Multi-Hop Wireless Networks:Semi-TCP[M],2009.
[2]姜胜明,韦岗,佐琴,胡海燕,刘桂开.基于RTS/CTS机制的多跳无线网络拥塞控制方法[P].广东:
CN101345749,2009-01-14.
[3]姜胜明,蔡业桂,王丽,韦岗.一种改进的基于RTS/CTS的多跳无线网络拥塞控制方法[P].广东:CN101902776A,2010-12-01.
[4]姜胜明,吴泉明.一种附带式跨层设计的无线网络拥塞控制方法[P].广东:CN102244568A,2011-11-16.
[5]刘梅,姜胜明,陆以勤.无线多跳网络中Semi-TCP协议的实现[J].计算机工程,2012,(09):79-82. [6]杨恺健,姜胜明,钱彦臻,吴世东.一种基于被动侦听和数据帧调度的无线多跳网络拥塞控制方法[P].上海:CN105873126A,2016-08-17.
[7]熊晨霖.Semi-TCP在海洋互联网中的应用仿真研究[D].华南理工大学,2016. [8]Behrouz A.Forouzan.TCP/IP协议族[M].北京:清华大学出版社,2011.
[9]Christian,Benvenuti.深入理解Linux网络技术内幕[M].北京:中国电力出版社,2009. [10]Mattbew S.Gast.802.11无线网络权威指南[M].南京:东南大学出版社,2007. [11]陈莉君.深入分析Linux内核源代码[M].北京:人民邮电出版社,2002.
因篇幅问题不能全部显示,请点此查看更多更全内容