自组织网络中的短报文可靠传输方法

文档序号:7649677阅读:323来源:国知局
专利名称:自组织网络中的短报文可靠传输方法
技术领域
本发明属于网络通信技术领域,特别是指一种自组织网络中可靠的传输数据的方法。
背景技术
Ad Hoc网络是不依赖于网络基础设施,节点之间通过无线通信相互协作进行路由,临时构成的一种多跳无线通信网络。由于Ad Hoc网络具有很高的生存能力和灵活性,故被广泛应用于军事、工业、商业、医疗、家庭、办公环境等领域,其典型应用场合包括军事通信、紧急搜救、移动会议、无线家庭网络、传感器网络等。
作为Ad Hoc网络中必须解决的关键技术难题之一,传输层协议的主要任务包括可靠传输和拥塞控制。在传统网络中,TCP承担了Internet上网络传输总字节数的95%及总数据报文数的90%,其实现版本也异常丰富,从TCP-Tahoe,TCP-Reno,TCP-NewReno到TCP-Vegas,TCP-Veno,FAST-TCP。然而,当把传统网络中的TCP直接应用到无线网络中时,由于无线网络具有很高的差错率及移动性等异于有线网络的特点,其性能损失很大,具体表现为过大的连接开销与建立延时问题,基于报文丢失的拥塞指示问题,网络分离后的TCP超时指数回退问题,隐藏终端与ACK依赖问题,LIMD拥塞控制与路由重选问题,可配置性低的臃肿头部问题。针对这些问题,国内外已经出现了很多技术试图改善传输层协议性能。这些技术可分为对TCP进行改进以及设计基于速率的新协议两大部分,其中前者又可细分为端到端方案与跨层方案两部分。端到端技术方案包括解决TCP超时指数回退问题的TCP Fixed RTO方案,考虑路由重建导致失序报文的TCP-DOOR方案,考虑短期异常与长期异常的TCP Freeze-Probing方案,避免STO(Spurious Time Out)的Eifel方法,区分误码丢包和拥塞丢包的Bias,mBias,Spike,Zigzag,TCP-DCR等方案,使用delay ack降低反向链路冲突的方案,如TCP-LDA,TCP-ADA,TCP-DAA,TCP-DBA等。跨层技术方案包括注重于区分网络拥塞丢包和路由失败丢包的TCP-F,TCP-ELFN,ATCP,TCP-BuS等方案,注重于降低路由失败影响的split TCP技术方案,综合考虑了网络处于拥塞、链路断开、信道差错、路由变化、正常等不同状态情况的ADTCP技术方案。基于速率的新协议以ATP,EXACT为代表,其技术路线是在路由时收集必要信息以选择合适的速率传递报文。
在以上技术方案中,无论是重新设计的协议,还是在TCP基础上进行改进的协议,都只解决了Ad Hoc中网络传输的某一部分问题,并且都采用相同的连接建立机制三次握手。由于三次握手机制在连接建立之前不能提交数据给接收方,这意味着任何数据被提交之前都必须经历RTT的额外时延,在实际使用的低速无线自组织网络中,这有可能长达若干秒。
在某些移动自组网应用环境中,很多数据例如重要的环境测定值,短小命令信息仅占几个到几十个字节并且需要可靠实时传递,对于这种信息的传递进行3次握手无疑是巨大的浪费。即使对一般的报文,由于无线自组网中存在很大的延迟,以及节点动态加入、离开网络和节点移动产生的动态拓扑结构,也可能导致经常性的连接建立过程,此时使用三次握手机制建立连接带来的延时和过大的网络开销往往是不可忍受的。然而,三次握手建立连接是保证报文可靠传输的必要条件,如何绕开三次握手机制,缩短连接建立时间,减轻网络开销就成为了要解决的问题。在这方面,唯一接近的技术是T/TCP,它针对有线网中的事务支持设计,通过在连接报文中加入1~2个长达32位的CC选项,在某些情况下可以避免三次握手过程。但它需要接收方为每个远端主机保留一份历史记录,并且第一次连接或者主机重启后,所有到该主机的连接或者该主机发出的连接都会进入普通的三次握手过程,此时,T/TCP不但不能解决原有的问题,还会增加网络开销和主机处理的开销。在Ad Hoc网络的动态拓扑环境中,这种情况是可能经常出现的。另一个问题是,以上协议都针对一般情况设计,其报文头中包含的很多内容在实际使用时,要么使用了过多的字节,要么没有实际用处,设计一个相对紧凑的报文头是有必要的,并且能在低速Ad Hoc网络中节省可观的网络开销。
在协议的实现中,传统的方法是采用自顶向下的设计方式,大部分采用过程化语言C作为其实现技术,通过庞大的分支跳转语句实现复杂的协议状态机。90年代以后,软件设计方式得到了长足的发展,具体表现为面向对象设计方式的普及,设计模式的使用,以及自底向上的事件编程模型的出现。事件是对象内部状态发生了某些变化,或者对象做某些动作时,向外界发出的通知。外部环境应对这些事件的发生,会做出相应的反应。相对于自顶向下的过程化编程模型,自底向上的事件编程模型更适用于发生顺序不确定的实时事件响应系统,例如网络协议的设计与实现中。基本上,Windows的消息编程模型可看作事件模型的雏形,然而Windows处理事件的方式完全是通过窗口过程以及一成不变的WPARAM/LPARAM参数,以现代编程标准而言,简陋而粗糙。为了传递事件,甚至需要创建不可见窗口。严格说来,窗口过程并不是真正意义上的事件机制,因为每个窗口只允许拥有一个窗口过程,而在真正的事件系统中,相同的事件可以不分等级地注册多个接收者。新出现的C#和Java语言中集成了事件模型,在.Net框架中的也集成了事件,并使用委托来实现。然而,C#和Java语言编写的程序执行效率并不高,并且其事件机制是针对一般情况下设计,没有针对网络协议的特殊情况进行定制,例如不提供数据传递方法,传递复杂数据只能通过设置全局变量的方式进行,因此并不适合用于开发网络协议。C++语言编写的程序执行效率高,由于能够直接控制内存,因此更适合于进行底层开发,并且由于其面向对象的特性,可以使用封装,设计模式等现代方法来提供更好的模块化,使得协议易于理解,修改和扩展,因此是设计协议的首选语言。遗憾的是,C++语言并没有集成事件机制。

发明内容
有鉴于此,本发明的目的在于提供了一种Ad Hoc网络中可靠地传输数据的方法,提高数据的传输效率和实时性。
为了达到上述目的,本发明的技术方案是这样实现的一种Ad Hoc网络中高效可靠地传输数据的方法,通过syn、ack和fin报文实现可靠传输,该方法包括以下步骤发送方发起连接,发送报文syn1(data,syn,syn-ts1),其中data表示数据,syn表示连接建立请求标志,syn-ts1=当前时刻+超时计时器定时,为该报文的超时重传时刻;接收方收到syn1(data,syn,syn-ts1)后,取出syn-ts1,如果syn-ts1>当前时刻,则接受报文并建立连接,否则,拒绝建立连接;发送方与接收方随后采用data-ack交互方式进行通信;发送方在最后一包数据投递完毕后,即可发出连接关闭请求报文fin(data,fin,fin-ts),其中data表示数据,fin表示连接关闭请求标志,fin-ts=max(当前时刻,连接最后发送的syn报文中包含的时戳),为结束时间戳;接收方收到关闭请求后,启动关闭过程,在不早于fin-ts的某时刻关闭连接。
更进一步的,如果在syn-ts1时刻尚未成功建立连接,发送方则判断为发送报文syn1(data,syn,syn-ts1)超时,并在syn-ts1时刻发送syn2(data,syn,syn-ts2),重新请求建立连接,其中syn-ts2=当前时刻+超时计时器定时,它是发送方超时后,下一个syn报文的发送时刻。
更进一步的,syn和fin报文中还分别包括syn-no和fin-no参数,其中syn-no为初始序列号,根据硬时钟生成,fin-no为结束序列号。
更进一步的,ack报文中含有其确认数据所对应的序列号,当ack返回时,在其确认的数据之前发送的所有数据均被确认。
更进一步的,接收方接收syn报文后启动被动打开过程,设收到报文syn(syn-no,data,syn,syn-ts)的时刻为now,如果now>syn-ts或者连接存在但最后一个ack中的序列号大于syn-no,则拒绝此报文,否则接收并新建连接。
更进一步的,接收方接收到报文fin(fin-no,data,fin,fin-ts)后启动被动关闭过程,若此时时刻now>fin-ts,清除连接,否则在fin-ts时刻清除连接。
本发明应用到Ad Hoc自组织网络中,进行短报文的可靠传输,从而实现减小报文数量,大幅减小连接建立的延迟与网络开销,并且根据实际使用的网络特性来配置报文格式,从而节省了网络开销;同时,减少了协议实现中使用的线程数目,提高了系统执行效率。
本发明和以往协议相比,创新点主要体现在以下三个方面初次传输机制,高可配置的简洁报文设计,时序事件引擎。前两个方面是在协议设计上的创新,时序事件引擎是在协议实现上的创新。


图1是现有技术中过期报文引发错误连接示意图;图2是本发明对SYN延期产生重复SYN报文问题的解决方案示意图;图3是序号过滤由于SYN-ACK丢失或延期产生的重复SYN报文的示意图;图4是超时过滤由于SYN-ACK丢失或延期产生的重复SYN报文的示意图;图5是本发明基于时序事件引擎的协议模块划分(职责与交互)示意图;图6是本发明协议状态机示意图。
图7演示了正常状态下一次完整的报文传输过程。
图8演示了异常情况下的处理过程。
具体实施例方式
一初次数据传输机制初次数据传输机制通过避免三次握手过程,节省了网络开销,提高了报文传输的实时性,详细说明如下1.原协议三次握手的原因考察TCP进行三次握手的原因,如果不进行三次握手,则接收方可能会因为延期重复的SYN报文到达而建立错误的连接,进而向上层提交错误、重复的数据。注意到如果延期重复的报文到达时连接未被关闭,则接收端可以通过last-ack过滤seq-no。因此,只有当延期、重复的报文到达接收端时连接已经关闭,才会建立错误的连接。
重复的SYN报文是由报文重传造成的,报文重传的原因包括SYN丢失,SYN延期,SYN-ACK丢失,SYN-ACK延期,其中SYN丢失并不会产生重复的SYN报文,在这里将SYN延期产生重复SYN报文称为问题一,SYN-ACK丢失或延期产生重复的SYN报文称为问题二,如图1所示。
2.初次传输算法初次传输机制通过时戳加序号的方式避免三次握手,算法如下1)连接建立过程发送方启动主动打开过程,发送SYN(syn-no,syn-ts),其中syn-no为初始序列号,根据硬时钟生成。syn-ts为此报文超时重传的时刻,在连接建立报文中即可包含数据。接收方接受报文后启动被动打开过程,设收到SYN报文(syn-no,syn-ts)的时刻为now,如果now>syn-ts或者连接存在但last-ack>syn-no,则拒绝此报文,否则接收并新建连接。
2)连接关闭过程主动关闭方当所有数据报文都已经传输完毕后启动主动关闭过程,发送FIN(fin-no,fin-ts)。其中fin-no为结束序列号,fin-ts为结束时戳,并满足fin-ts=max(连接最后发送的SYN报文对应的syn-ts,当前时刻)。被动关闭方接收到FIN报文(fin-no,fin-ts)后启动被动关闭过程,若此时时刻now>fin-ts,清除连接。否则在fin-ts时刻清除连接。
算法的基本思想是保证网络中不存在两个同时有效的SYN报文,从而有效地解决问题一与问题二。设前后发送两个SYN报文syn1(syn-no,syn-ts1)与syn2(syn-no,syn-ts2)。对于问题一,如果syn1并在syn2建立连接后并传输结束后到达,则有syn1到达时刻>syn2到达时刻>syn2发送时间>syn-ts1,从而syn1被拒绝,如图2所示。对于问题二,设接收端在now时刻接收到syn(syn-no,syn-ts),如果此时连接并未关闭,则根据last-ack的值可以过滤syn-no,如图3所示。如果此时连接已关闭,则now>fin-ts>=syn-ts,从而syn被拒绝,如图4所示。为防止机器崩溃后产生错误连接,开机后须等待MSL的平静时间。
3.适用环境在网络延迟很大的Ad Hoc环境中,只要时钟漂移不超过单跳最小延时,就可以使用初次传输机制来代替三次握手机制,避免三次握手中的前两次握手过程。值得一提的是,这种环境并不罕见,例如传输节点拥有GPS等全局授时设备,或者当单跳延时很大时,完成初始对时的节点在相当长的时间内时钟漂移不会超过单跳延时。
4.效果使用初次数据传输机制避免了三次握手所需的等待时间,减小了网络中的报文数量,并且无需接收端在连接之外维护任何信息。由于只在传输开始的SYN报文和传输结束的FIN报文中添加时戳,因此平均附加的报文长度开销几乎为0。记收发双方单程时间为t,当数据在一个MTU内时,接收方只需要t时间即可接收到数据,而三次握手机制接收方需要3t时间才能接收到数据,在这种情况下,初次连接机制的实时性提高了3倍。对于短报文的传输,网络中交换报文的数量也大幅减少。由于初次传输机制能够大幅减小连接建立的延迟与网络开销,因此对于频繁产生短报文传输特别有效。
二、高可配置的简洁报文设计1.报文格式及其说明报文格式如下所示

source port和destination port分别代表源端口和目的端口。
type各位依次为SYN,FIN,ACK,SACK,TS,CS,保留2位,分别表示起始报文,结束报文,捎带确认,捎带选择确认,拥有校验,拥有时戳。FIN不可带数据,SYN、FIN不可同时出现,TS只可与SYN、FIN同时出现。SYN、FIN都可以携带数据,其语意与TCP的区别在于,只有REQUEST会设置SYN、FIN,ACCEPT不会设置SYN、FIN。
Head len为头部长度,以双字节为单位进行计数,故头部最长为15*2=30字节。
Reserved为保留字段。
Seq#为窗口序号。针对相对较低的信道速率,序列号使用2个字节。
Additional Header目前包括16位ACK,16位Checksum,32位时戳和16位SACK。
ACK表示期望下一包的序列号。同序列号一样,其长度为2个字节。
SACK表示[ACK,ACK+16)的接收窗口状态,第一位总为0,例如0110000000000000表示ack+1,ack+2的报文已经收到。
TS表示时戳,可以逐连接设置其掩码精度(仅限本地)。由于1ms相当于FILETIME 10900的变化值,约14位,FILETIME总共64位,故可取FILETIME的[12,43]位作为时戳。掩码精度默认值可取50ms,即FILETIME的19位,TS的后7位,故默认精度掩码为32-7=25位。CS是校验和,可以逐连接设置。
Checksum是校验和字段,由于大多数Ad Hoc环境拥有一个可靠的链路层,故将校验和设为可选头部,在必要时可以添加。
报文传递以数据-确认的方式进行,可以捎带确认,也可以进行选择性确认。AdHoc中接收方缓存相对于信道速率来说通常不是问题,因此窗口大小的控制只包括拥塞窗口的控制。窗口最大值为16,为处理突发情况,窗口的初值通常为3,窗口的调节采用AIMD策略,由于只用于短报文地传递,故没有复杂的慢启动机制,实现相对简单。由于没有接收方窗口通知,因此也无需坚持计时机制。
2.效果通常数据报文头部长8字节,捎带确认和选择确认的数据报文头部长12字节,远远小于TCP 20个字节的头部开销,在带宽极其有限的Ad Hoc环境中传输短报文,8个字节以上的开销节省是可观的改进,选择性确认与捎带确认也减少了网络上传输的报文数量。
报文的可配置性是以主机处理速度为代价的。然而,低速的ad hoc网络中通常瓶颈在网络带宽而不是主机处理速度,因此根据实际使用的网络特性来配置报文格式,节省网络开销无疑是值得的。
三、时序事件引擎与协议实现
1.时序事件引擎时序事件引擎本身可分为两个部分时序事件元引擎与特化时序事件引擎。时序事件元引擎包括1)事件处理函数接口,所有的事件处理函数从此派生。2)定义事件元素的结构,包括(事件ID,事件类别,延时,耗时,附属数据)。此处的事件ID在不同的特化时序事件引擎中互相独立,即无需保持全局一致。3)事件元引擎,实现除特化事件关联之外的所有功能,包括事件注册与退出,申请事件,重置事件,开启和关闭事件循环,线程安全保证,时序调度等。特化时序事件引擎包括1)从通用事件接口派生的特化事件接口,其中定义了事件处理函数。2)从事件元引擎派生出的特化事件引擎,主要用于完成自定义事件与事件处理函数的关联。
时序事件引擎的使用极其简单,从某特化事件接口派生并实现响应函数,向特化事件引擎注册后,即可在任何时候,任何地点向特化事件引擎投递事件。投递的事件在指定时间到达后,由时序事件引擎触发注册的事件响应函数,完成事件的处理过程。
时序事件引擎是在现代基于事件驱动的设计方法和面向对象的设计方法的基础上发展而来的,提供复杂数据的传递和延时触发机制,因此特别适合于网络协议的高效实现,使得实现的协议具有高效,易于理解,修改和扩展等特点。
2.采用时序事件引擎的高效协议实现如图5所示,通过使用时序事件引擎,可以将协议实现划分为事件引擎与超时管理模块,主控模块,输出模块,输入模块,控制表模块。下面描述各模块的职责以及如何通过时序事件引擎进行交互。
事件调度与超时管理模块的主体包括事件引擎和一个抽象的事件接口,负责进行事件的调度和超时机制的实现,保证所有事件被按序处理,从而可以在一个线程中高效实现,计时器包括重传计时器,ack延时计时器,输入队列空闲计时器,同步超时计时器。
主控模块负责响应所有的事件,并决定调用输入或是输出模块进行处理,其具体职责包括拆除连接,进行状态切换,对报文进行合法性检查和预处理,进行异常处理和非正常数据传输报文处理,过滤过期报文,分离数据和ACK,对数据调用输入模块进行处理,对于ACK调用输出模块进行处理。由于主控模块负责报文格式的解析,一定程度上允许报文格式的扩展修改只波及主控模块。同样,由于主控模块负责报文状态的维护更新与判断,只有主控模块知道状态的存在,因此状态机的变更只可能波及主控模块。
输出模块负责发送数据,对输出队列进行操作,其具体职责包括将应用层数据加入对应套接字对的输出队列中,尝试发送窗口之内的新数据,重传超时未获确认的数据,发送ack,以及在ack到达后滑动发送窗口。
输入模块负责接收数据,对输入队列进行操作,其具体职责包括向应用层缓存填充接收到的有序数据,将从IP层收到的数据放入相应套接字对的输入队列中,滑动接收窗口并申请延时ACK计时器。
控制表模块包括套接字分配管理表,套接字对管理表等,为主控模块提供支持,主要包括套接字分配管理表,套接字对管理表。其中套接字分配管理表记录所有正在使用的地址-端口二元组及其绑定的数据ID,原始套接字等。套接字对管理表记录收发双方的地址-端口二元组及其绑定的收发队列指针,发送窗口大小,接收窗口位置与大小,RTT估计值,RTO大小等状态。
基于事件引擎的运行方式为输入、输出、主控模块向事件引擎申请内部超时事件,外部应用程序和网络层向事件引擎投递外部事件,事件引擎对事件进行调度,触发到期的事件,调用主控模块注册的事件响应函数进行处理。
3.效果传统TCP的实现使用了庞大的switch,if else等条件分支语句和大量的goto语句,使得协议臃肿,强耦合,低内聚,既难于理解,也难于排错,修改和扩展。同时,多个计时器难于管理,增加了系统线程数,从而增加了处理开销。时序事件引擎支持复杂数据的传递,提供线程安全性,基于此的自底向上的设计方式极大地简化了协议的实现,使得协议的模块化更高,可读性更好,并且易于扩展。同时,时序事件引擎将计时器高效地整合到事件处理系统中,从而减少了协议实现中使用的线程数目,提高了系统执行效率。
四、报文传输过程图7演示了一个完整的报文传输过程。
1)发送方发起连接,发送报文(data,syn,ts),其中data表示数据,syn表示连接建立请求标志,ts=当前时刻+超时计时器定时。接收方收到(data,syn,ts)后,取出ts,发现ts>当前时刻,故接受报文并建立连接。
2)发送方与接收方随后采用data-ack交互方式进行通信,对于大小不超过3个MTU的短报文,可以一次投递完毕。
3)发送方在最后一包数据投递完毕后,即可发出连接关闭请求(data,fin,ts),其中fin表示连接关闭请求标志,ts=max(当前时刻,连接最后发送的syn报文中包含的时戳)。接收方收到关闭请求后,记录ts到tints,并启动关闭过程,在不早于fmts的某时刻关闭连接。
图8演示了当出现过期、重复的syn报文时协议的处理过程。
1)t1时刻,发送方请求建立连接,发送syn1(data,syn,t2),其中t2为下一包syn的发送时刻。
2)t2时刻,发送方超时,重新请求建立连接,发送syn2(data,syn,t3),其中t3为第三个syn的发送时刻。
3)t2~t3时段,连接顺利建立,并交付数据,但没有ack返回。
4)t3时刻,发送方再次超时,发送syn3(data,syn,t4),其中t4为第四个syn的发送时刻。
5)t3~t4时段,ack返回,所有数据被确认,随后连接顺利终止。
6)t4时刻,接收方延时关闭计时器超时,顺利关闭连接。
7)之后,syn1姗姗来迟,由于syn1早在t2时刻即已过时,因此被接收方拒绝。
8)最后,syn3到达,由于syn3在t4时刻即以超时,因此被接收方拒绝。
五、状态机的实现协议状态机如图6所示。
建议使用state设计模式实现状态机,凡是与状态有关的操作都使用state将其分散化,能简化协议的实现,并易于扩充。状态-事件响应列表如下所示状态-事件响应列表1

状态-事件响应列表2

状态-事件响应列表3

内部事件说明内部事件是由主控模块进行判定,并且只触发一次的时间,详细说明如下1)接收FIN事件单独收到FIN并不会触发此事件,只有当FIN被移出输入窗口时才会触发。此外,不存在输入队列时接收到FIN,也会触发此事件。其语意为所有数据都已经成功收到,此后不允许接收任何数据(输入窗口内也无效)。这样的状态包括CLOSING,TIMED-WAIT,CLOSED,CLOSE-WAIT,LASTACK。
2)接收FIN-ACK事件FIN的包从输出队列移出时触发(OnAck之后判定)。其语意为所有数据都已经成功送到,此后不允许发送任何数据。这样的状态包括FIN-WAIT2,TIMED-WAIT,CLOSED。
注意事项1)如果同时存在接收FIN事件与接收FIN-ACK事件,MainModule先进行FIN事件的处理,再进行FIN-ACK事件的处理,因此没有FIN-WAITl直接到TIMED-WAIT的转换。
2)如果同时存在data和ack,则先处理data,再处理ack。
3)FIN与FIN-ACK事件在data.ack之后处理。
4)斜体表示拥有进入过程。其中切换到TimedWait的进入过程为申请一个TimedWait超时计时器。切换到Closed的进入过程为如果允许关闭,则申请一个0ms的关闭延时超时。
5)调用send,如果该四元组不存在,则新建一个连接,进入NORMAL状态。
6)客户端在syn被确认之前不会发送fin,这意味者fin发送之后syn已被确认,故fin发送之后不会有新的syn被发送,由fin-ts的语意,所有发送的fin报文,其fin-ts都一样。因此如果收到重复的fin报文,简单过滤即可,无需进行任何额外操作(如重置fin-wait计时器和allowclose标记)。
7)Close-wait超时由MainModule在第一次收到FIN(不同于FIN事件)之后申请,Closed的进入过程也可能会申请。
8)Closed的进入过程通过申请一个0ms的关闭延时而非直接关闭连接释放资源,是出于state模式进入过程的完整性考虑的。否则在进入过程中将资源释放,其后的状态切换就成为无意义操作了。并且,这种设计,将所有的资源释放调用集中到了closed的closed超时处理过程中,有助于结构的明晰和资源管理。
六、其它优选的协议实现方式1.连接关闭过程有多种方案可以实现延时关闭,这里给出一种封装性较好,较简洁的方式。
连接中不存放结束时戳fin-ts,存放allowclose表示允许关闭,并初始化为false。主控模块在收到FIN之后立即申请一个close-WAIT超时,超时时间仍采用上面的方式计算。当close-WAIT超时发生后(可能响应的状态包括所有状态),将连接中的allowclose置为true。在CLOSED状态的进入过程和FIN-WAIT响应过程中,如果allowclose为true,则关闭连接。
2.事件引擎的实现建议使用基于堆的优先队列结构实现时序事件引擎的事件队列,从而可保证事件插入和取出操作的高效性。
实现中,应该考虑到在进行事件处理函数的调用过程中可能会发生事件的再次投递,应该仔细考虑线程安全和同步过程,避免死锁的出现。
3.在IP上实现协议为保证效率,使用原始套接字在IP上直接实现协议。为了避免每次创建套接字的巨大开销,在允许多个IP的环境中,应该将原始套接字放入连接中保存。原始套接字的职责仅限于数据的发送,因此就没有必要使用额外的线程。所有的接收操作由一个底层监听线程进行处理,然后进行数据的分发,连接的查找匹配,这些工作由主控模块来完成。
4.精简线程数目为保证系统高效可靠运作,线程越少越好。因此,除了用户线程之外,只有事件处理线程和底层接收线程。其中事件处理线程负责主体逻辑的实现,所有操作通过事件处理线程串行化操作。底层接收线程负责监听底层信道,获取所需报文。
基于效率的考虑,只有存在套接字时才会启动事件处理线程和底层接收线程,因此存在这两个线程的动态生成和退出过程,这个过程应该设计一个类,如Daemon类来封装。
5.一次拷贝技术虽然理论上存在0次拷贝,但这种方式不利于用户进程和系统进程的分离,使设计复杂,容易出错(甚至要求用户同步发送数据,无法处理网络中断的情况)。因此建议采用1次拷贝技术,在保持设计简洁可扩充的同时,使数据拷贝次数达到最小。
在数据发送时,数据只有在加入时被拷贝复制到输出队列中,在数据得到确认后或者输出队列析构函数调用时,输出队列节点被删除,其析构函数负责释放存储空间。在数据接收时,数据只有在收到时拷贝到底层数据到达的消息中,在数据被用户取走或者输入队列析构时输入队列节点被删除,其析构函数负责释放存储空间。
为实现一次拷贝,必须向底层接收函数部分开放报文格式,以便将用户数据从中分离出来并拷贝到新的存储空间中。底层接收函数发出消息(头部,数据,源IP,目IP),其中头部的空间由主控模块负责释放,数据的空间在从输入队列析构或者取出数据后有输入队列删除输入队列节点时,其析构函数负责释放。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换和改进,均应包含在本发明的保护范围之内。
权利要求
1.一种Ad Hoc网络中可靠地传输数据的方法,通过syn、ack和fin报文实现可靠传输,其特征在于包括以下步骤A.发送方发起连接,发送报文syn1(data,syn,syn-ts1),其中data表示数据,syn表示连接建立请求标志,syn-ts1=当前时刻+超时计时器定时,为该报文的超时重传时刻;B.接收方收到syn1(data,syn,syn-ts1)后,取出syn-ts1,如果syn-ts1>当前时刻,则接受报文并建立连接,否则,拒绝建立连接;C.发送方与接收方随后采用data-ack交互方式进行通信;D.发送方在最后一包数据投递完毕后,即可发出连接关闭请求报文fin(data,fin,fin-ts),其中data表示数据,fin表示连接关闭请求标志,fin-ts=max(当前时刻,连接最后发送的syn报文中包含的时戳),为结束时间戳;E.接收方收到关闭请求后,启动关闭过程,在不早于fin-ts的某时刻关闭连接。
2.如权利要求1所述的方法,其特征在于进一步包括以下步骤如果在syn-ts1时刻尚未成功建立连接,发送方则判断为发送报文syn1(data,syn,syn-ts1)超时,并在syn-ts1时刻发送syn2(data,syn,syn-ts2),重新请求建立连接,其中syn-ts2=当前时刻+超时计时器定时,它是发送方超时后,下一个syn报文的发送时刻。
3.如权利要求1所述方法,其特征在于syn和fin报文中还分别包括syn-no和fin-no参数,其中syn-no为初始序列号,根据硬时钟生成,fin-no为结束序列号。
4.如权利要求1所述方法,其特征在于ack报文中含有其确认数据所对应的序列号,当ack返回时,在其确认的数据之前发送的所有数据均被确认。
5.如权利要求1所述方法,其特征在于接收方接收syn报文后启动被动打开过程,设收到报文syn(syn-no,data,syn,syn-ts)的时刻为now,如果now>syn-ts或者连接存在但最后一个ack中的序列号大于syn-no,则拒绝此报文,否则接收并新建连接。
6.如权利要求5所述方法,其特征在于接收方接收到报文fin(fin-no,data,fin,fin-ts)后启动被动关闭过程,若此时时刻now>fin-ts,清除连接,否则在fin-ts时刻清除连接。
7.如权利要求1至6之一所述的方法,其特征在于对于大小不超过3个MTU的短报文,可以一次投递完毕。
8.如权利要求1至6之一所述的方法,其特征在于该方法替换TCP协议,在IP协议上实现。
9.如权利要求1至6之一所述的方法,其特征在于该方法采用1次拷贝技术。
10.如权利要求1至6之一所述的方法,其特征在于所述报文包括source port、destination port、type、Head len、Reserved、Seq#、Additional Header和Data字段,其中source port和destination port各占16位,分别代表源端口和目的端口;type占8位,各位依次为SYN,FIN,ACK,SACK,TS,CS,保留2位,分别表示起始报文,结束报文,捎带确认,捎带选择确认,拥有校验,拥有时戳;FIN不可带数据,SYN、FIN不可同时出现,TS只可与SYN、FIN同时出现,SYN、FIN都可以携带数据,其语意与TCP的区别在于,只有REQUEST会设置SYN、FIN,ACCEPT不会设置SYN、FIN;Head len为头部长度,以双字节为单位进行计数,故头部最长为15*2=30字节;Reserved为保留字段;Seq#为窗口序号,针对相对较低的信道速率,序列号使用2个字节;Additional Header目前包括16位ACK,16位Checksum,32位时戳和16位SACK,ACK表示期望下一包的序列号,同序列号一样,其长度为2个字节,SACK表示[ACK,ACK+16]的接收窗口状态,第一位总为0;TS表示时戳,可以逐连接设置其掩码精度,这仅限本地;CS是校验和,可以逐连接设置;Checksum是校验和字段。
11.如权利要求1至6之一所述的方法,其特征在于实现该方法时尽量使用较少的线程,除了用户线程之外,只有事件处理线程和底层接收线程,其中事件处理线程负责主体逻辑的实现,所有操作通过事件处理线程串行化操作,底层接收线程负责监听底层信道,获取所需报文。
全文摘要
本发明提供一种Ad Hoc网络中可靠地传输数据的方法,通过syn、data-ack和fin报文实现可靠传输,在发送方与接收方之间建立连接,接收方无需等待漫长的三次握手即可接收数据,收发双方采用data-ack交互方式进行通信,实现报文的发送,发送方在最后一包数据投递完毕后,即可发出连接关闭请求报文,接收方收到关闭请求后,启动关闭过程。应用本发明,能够实现减小报文数量,大幅减小连接建立的延迟与网络开销,并且根据实际使用的网络特性来配置报文格式,从而节省了网络开销;同时,减少了协议实现中使用的线程数目,提高了系统执行效率。
文档编号H04L12/24GK101018176SQ20071007976
公开日2007年8月15日 申请日期2007年3月9日 优先权日2007年3月9日
发明者王宇亮, 章洋, 郑昌文, 何晓新 申请人:中国科学院软件研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1