网络工程毕业设计(论文)-sctp多流优先级的研究与应用.doc_第1页
网络工程毕业设计(论文)-sctp多流优先级的研究与应用.doc_第2页
网络工程毕业设计(论文)-sctp多流优先级的研究与应用.doc_第3页
网络工程毕业设计(论文)-sctp多流优先级的研究与应用.doc_第4页
网络工程毕业设计(论文)-sctp多流优先级的研究与应用.doc_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南京邮电大学通达学院毕 业 设 计(论 文)题 目: SCTP多流优先级的研究与应用 专 业: 网络工程 学生姓名: 班级学号: 指导教师: 指导单位: 通信与信息工程学院 日期:2011年03月23日至 2012年06月06日 摘 要 随着硬件技术和网络通信技术的快速发展,终端用户经常会通过互联网获得多媒体形式的网络服务。例如,网页浏览、即时消息通信、视频聊天等。这些服务往往对带宽十分敏感,且在同一次服务中需要从服务器获取多种类型的数据。但在低带宽情况下网络无法为所有类型的数据提供足够的带宽,因此网络服务器需要提供一种将不同类型数据并行且高效地传输到终端用户的方法,同时在低带宽情况下该方法仍能够提供令人满意的服务质量。流控制传输协议是面向连接,提供可靠数据传输服务的传输协议,它的多流多宿特性非常适合于上述的多媒体网络服务。本方案利用SCTP的多流特性,将同一SCTP偶联中的多个逻辑流赋以不同的优先级,并根据优先级将这些逻辑流对应到若干优先级队列中,随后通过优先级调度算法使其出队并发送出去,从而保证了重要数据能够在低带宽情况下以较低的延迟发送到接收方。为了验证方案的有效性和可行性,进行了详细的分析。关键词:流控制传输协议;多流优先级;队列调度算法ABSTRACT With the steady improvement of hardware technology and network communication technology, end users are accustomed to obtaining the multimedia network services through the Internet, like Web browsing, instant messaging, video chat etc. However, these services are often bandwidth-intensive, and needed to get various data from server in a single service. However, the network couldnt provide enough bandwidth for all kinds of data in the case of low bandwidth, so the network server need a way to transmit multiple data in parallel, which also effectively respond to periods of insufficient bandwidth. SCTP is a reliable, connection-orientied transport protocol. Its multihoming and multistreaming are very suitable for these types of multimedia network services. Based on the multistreaming of SCTP, the scheme assign a priority value to each logical stream in SCTP association, and then put the data of prioritized logical stream to corresponding prioritized output queue. Finally, we schedule these queues with scheduling algorithms, which could ensure the transmission of the more important data with lower delay when low bandwidth is available. In order to verify the effectiveness and feasibility of the scheme,conduct a detailed analysis.Key words: SCTP; prioritized SCTP streams; queue scheduling algorithm目 录第一章 绪论11.1 研究背景11.2 研究目标21.3 研究内容31.4 研究方法31.5 论文结构3第二章 文献综述42.1 引言42.2 SCTP发展背景42.3 SCTP 主要特性52.3.1 多宿主性(Mutilhoming)62.3.2 多流特性(Mutilstreaming)72.4 SCTP的报头格式82.5 SCTP的拥塞控制92.5.1慢启动算法92.5.2拥塞避免算法102.5.3快速恢复算法102.6 本章小结10第三章 Lunix内核中的SCTP的实现113.1 引言113.2 核心数据结构113.3 Lksctp的状态机133.4 Lksctp的初始化偶联原语143.5 Lksctp的用户消息发送原语163.6 本章小结17第四章 基于LKsctp多流优先级的实现194.1 引言194.2 设计思想194.3 用户接口部分的实现234.4 内核调度244.5 优先级队列调度算法设计254.6 性能分析27结束语29致谢30参考文献31南京邮电大学通达学院2012届本科生毕业设计(论文)第一章 绪论1.1 研究背景最初的互联网,是提供“尽力而为”服务的分组交换网络,它主要支持FTP、E-mail、 HTTP等传统数据业务,这些业务对网络延时要求不高。随着计算机硬件和网络通信技术的快速发展,用户终端的处理能力变得更强同时价格更加地便宜。互联网已经具备了处理更加高级的业务的能力。在一些已经出现的新业务中,有一些业务需要在一次网络服务中包含多种服务内容。例如在一次Web网页浏览中,网页中可能在内嵌了流媒体数据的同时,也包含有文本、图片等数据。这些业务的共同特点是既包含有对时延比较敏感的,需要足够端到端带宽来保证令人满意的服务质量的重要数据(如流媒体数据),也包含了对时延不敏感的普通数据(如文本数据)。但是由于网络有时不能提供足够的端到端带宽,所以无法使所有类型数据都能获得令人满意的服务质量,主要的原因如下:(1) 在整个端到端传输路径上,某些节点会有流量过大而出现拥塞的可能。这时数据包的丢弃会导致面向连接的数据传输速率下降;(2) 对于通过无线方式接入的终端设备来说,设备本身的信号强度,以及在无线接入点范围内包含了过多的无线设备,都会影响这些无线设备的可用带宽;(3) 服务器或客户端节点处于高负载状态(特别是服务器端),都会影响整个端到端服务所能获得的带宽;(4) 网络(例如一些企业内网)中可能会使用一些用于限制用户可使用带宽的流 控设备。 正是这些原因使得在低的端到端带宽情况下,服务的请求响应等待时间过长,从而影响了用户的服务质量。对不同类型的数据传输提供不同的服务质量保证,是解决这一问题的有效手段和重要途径。 2000年,SIGTRAN工作组将SCTP作为正式的Internet标准(RFC2960)提交给IETF。最初这个协议的提出是为了解决使用IP网络来传输SS7信令,但由于其多流多宿等特性,SCTP己经成为了具有广泛适用性的传输协议并得到业界的广泛关注。2007年,SCTP已被更新为RFC4960。在此期间出现了大量的草案标准对SCTP的各个方面进行了完善。近几年,业界己拟将SCTP作为下一代网络的主流传输层协议用以取代TCP/UDP。 SCTP是面向连接的,在一次连接建立的过程中,会产生若干个相互独立的逻辑流,每个逻辑流能够以数据块(chunk)为单位相互独立且按序地递交给目的端,同时所有的逻辑流还可共享一套拥塞控制参数。因此SCTP的这种多流结构非常适合用于同时传输多种类型的数据,而且会非常地高效。但现有的SCTP协议在发送端公平地对待SCTP偶联中的多个逻辑流,这样无法实现在网络资源受限情况下,对含有重要数据的逻辑流的优先发送,因此如果能够将SCTP偶联中的逻辑流赋以优先级的特征,给重要数据赋以较高的优先级,并将其优先地传递到网络中去,将有效地降低重要数据的传输延迟,从而在端到端带宽有限的情况下,也能为用户提供可以接受的服务。 SCTP多流优先级的实现,本质上是在传输层中实现了一种对不同类型数据提供不同服务质量保证的QoS控制技术。 目前,在实际网络中己经开发和使用了多种类型的QoS控制技术。这些技术对应于分层体系结构中的各个层次。但由于实现的层次和采用的技术不同,其效果也是不一样的3。 在数据链路层,主要完成的功能是实现对物理介质的接入控制,网络可以通过用户申请服务时协商的QoS参数对业务流量进行QoS控制,主要的QoS参数有峰值信源速率、最小信源速率、信源丢失率、传输时延等。在网络层,主要完成路由选择和数据包转发服务。这种服务是通过中间节点(路由器)的存储一转发机制来实现的。网络层的QoS支持机制主是通过对分组进行区分优先级的处理来保证服务质量的,也就是说,按照优先级的不同将待发送嗽发的分组分成多个不同的队列,采用特定的排队和队列调度控制机制以此来减少特定业务流量的时延和时延抖动。 对传输层来说,它提供端到端的、面向连接的数据传输服务。通过拥塞控制参数,传输层能够很好地了解整个端到端传输路径上的拥塞状况,这些信息使得它能够在保证数据的正确性和有序性的基础上,最大限度的利用网络资源,提高数据的传输效率。所以它主要完成的是端到端路径上的流量控制功能。但在TCP中,如果要想并行地传输多种逻辑数据,只有使用多条TCP连接,而要想进一步地对多个数据流进行流量控制就只有在应用层实现,但是应用层无法了解端到端路径上的拥塞情况,很难有效地进行流量控制,同时给应用程序的设计增加了不必要的复杂性。而对SCTP来说,多种逻辑数据的并行传输可以通过SCTP的多流特性来完成,这时如果再使用某种方法能够对不同逻辑流进行有差别的流量控制就能更好地完成TCP需要在应用层完成的工作。给SCTP增加这样的一个特性,将给那些需要在一次服务中提供多种类型数据的应用程序员提供很大的方便。1.2 研究目标 本课题要求认真了解SCTP的基本特性并且对SCTP的多流特性有一个详细充分的了解,在此基础上将同一SCTP偶联中的多个逻辑流赋以不同的优先级,并根据优先级将这些逻辑流对应到若干优先级队列中,随后通过优先级调度算法使其出队并发送出去,从而保证了重要数据能够在低带宽情况下以较低的延迟发送到接收方。并进行详细分析。1.3 研究内容 本文在对SCTP协议的基本特性有了详细的了解后在仔细阅读了基于Lunix的SCTP源代码后利用SCTP的多流特性,将同一SCTP偶联中的多个逻辑流赋以不同的优先级,并根据优先级将这些逻辑流对应到若干优先级队列中,随后通过优先级调度算法使其出队并发送出去。1.4 研究方法 本课题采用理论研究与仿真相结合的研究方法,首先提出算法的理论模型,再对算法的性能进行分析,最后得出一个完整的解决方案。文献调研提出改进思想改进思想分析得出结论图1.1 研究流程图1.5 论文结构本论文总共分为四个章节,第一章为绪论。第二章为文献综述,主要侧重四个方面:SCTP的发展背景;SCTP的主要特性;SCTP的报头格式;SCTP的拥塞控制。第三章给出了Lunix内核中的SCTP实现分析。第四章给出了基于LKsctp多流优先级的设计思想。 第二章 文献综述2.1 引言本章主要调研了SCTP方面的文献,2.2介绍SCTP的发展背景,2.3介绍SCTP的主要特性,2.4介绍SCTP的报头格式,2.5介绍SCTP的拥塞控制2.2 SCTP发展背景 IP网络和电信网曾经是两个相互独立的网络,随着IP网络的飞速发展以及电信网提供新业务的需求,两大网络开始出现了融合的迹象。但由于两者在设计上存在着很大的差别,很多的技术难题出现在了融合的道路上。为此IETF成立了信令传输工作组(Signaling Transport, Sigtran),它的主要研究课题是基于IP网络的公共交换电话网(Public Switched Telephone Network, PSTN)信令的传输,即SS7信令。 SS7信令在PSTN网中发挥非常重要的作用,它控制着各种业务的建立、维持、释放等重要功能。想象中,SS7信令在IP网络中传输应该是很容易做到的,只需要简单.地将二进制的SS7信令消息放在像TCP这样提供可靠服务的传输层报文就行了。但这种想法忽略了一些重要的问题。例如PSTN中承载SS7信令的信令网络提供高可靠性的数据传输服务,而在IP网络中只能提供“尽力而为”的服务。如果直接将来自于SS7信令网络中的SS7信令传输到IP网络中,那么SS7信令在IP网络中传输过程中就可能出现丢失、乱序、高延迟等问题。对时序要求严格的通信过程来说这些情况的发生是致命的,将会使两个网络中的设备就不能协调一致地工作,从而导致通信过程失败。因此必须保证当SS7信令在IP网络中传输时能够获得与PSTN网络中类似的服务质量。为此Sigtran曾经提交过一篇报告文档RFC2719,在这篇文档中明确指明了在IP网中传输SS7信令时所需的功能和性能需求,还阐明了SS7信令消息对丢包率、延迟及安全性等方面的要求,同时还给出了信令互通的体系结构。很自然地,为了避免重复开发Sigtran曾想到现有的传输层协议来满足RFC2719的要求,其中包括TCP, UDP等,但由于这些协议都存在着或多或少的问题而不能完全符合SS7信令传输的要求。最后还是有一个协议引起了Sigtran的注意,它是由R. Stewart, Xiaobing Xie开发的多网络数据包传输协议(Multi-Network Datagram Transmission Protocol,MDTP ),它成为了SCTP的原型,SCTP中很多的设计理念都是来源于MDTP 。但是MDTP与SCTP之间还是有很大的差别的,这可以从SCTP各版草案的变中看出。这些变化主要有:(1) SCTP的报文格式被重新设计,从而使得SCTP具有很强的扩展性;(2) cookie机制被引入到了SCTP偶联建立阶段以此来避免SYN flooding攻击对服务器端的影响;(3) TCP的拥塞控制机制被引入,以及其它一些的新特性被加入到了SCTP中,例如:连接建立过程中的流协商机制、消息分片、数据块绑定等等。2000年2月,SCTP发生了一个非常重要的变化,即Sigiran决定将SCTP直接放置在IP协议之上,此举意味着需要在操作系统内核中提供对SCTP的支持。从技术层面上说,这将提高SCTP的性能,同时也减少了在同一个系统中SCTP实现的数量,使得我们在评估互联网上的SCTP实现的性能时变得更加的容易。但是由于在操作系统内核中实现SCTP具有一定的复杂性,同时需要操作系统厂商们的支持,因此直到一年后才真正出现内核中的SCTP实现,而Linux的Lksctp是最早的实现的SCTP实现,下一章将会对其进行详细地介绍。除了技术层面的意义外,将SCTP放置在IP之上,还意味着SCTP变成了能够更快地被推广到Internet中去,而不仅是用来传输SS7信令。因为协议如果能够捆绑在具有通用性的操作系统中得到支持,更多的人将会获得使用SCTP的机会,从而促进了SCTP的推广。 而在2001年的二月,IETF决定将SCTP的工作由Sigtran移交给传输领域工作组( Transport Area Working Groupm, Tsvwg)中去。在Tsvwg中讨论的都是一些具有普遍意义的传输层问题,这再一次反映了SCTP对于更广泛范围的应用价值。随着各种新的特性被添加到SCTP中,它已经能够作为一个具有普遍意义的传输层协议为应用程序提供服务了,在性能上它并不逊色于TCP,甚至在某些领域显得比它的竞争者TCP更有优势,因此SCTP有望在未来取代TCP成为主要的提供可靠服务的传输协议。SCTP本身也考虑到了这样的可能性,它提供了一对一的套接口形式,方便习惯了使用TCP的用户方便地使用SCTP来提供数据传输服务。口前,甚至己经开发出了一种动态库技术,能够在不进行重新编译的情况下直接地将基于TCP的应用程序改变为使用SCTP11。2.3 SCTP 主要特性 SCTP继承了TCP和UDP的一些优良特性,例如TCP的拥塞控制机制和UDP的消息边界等,同时SCTP引入了多流、多宿等新特性。由于在SCTP的设计阶段,广泛地评估现有传输协议存在的问题和缺陷,因此SCTP能够更好地为目前的互联网应用提供更好的数据传输服务。而这些优势往往是通过SCTP的新特性体现出来的。本节将逐一介绍这些新的特性。2.3.1 多宿主性(Mutilhoming)在介绍SCTP多宿特性之前,需要简单介绍SCTP中的一个新概念:偶联(Association)。它在用于标识两个运行SCTP的机器在通过SCTP四次握手建立的一种连接关系,并通过连接两端使用的SCTP端口号以及绑定两端的可用IP地址来唯一确定10。 图2.1 SCTP偶联 对应于图2.1的SCTP偶联,它可以唯一地用下列有序组来表示: p1,IP1,IP2, p2,IP3,IP4 这些网络终端设备能够采用多种网络接入方式接入到网络,最普遍的例子是路由器,信令网关,以及便携式电脑,这些设备通常被称为多宿主机。具有多个网络接口卡不仅仅意味着主机同时具有了多个IP地址,而且说明它能够使用多条传输路径将数据包递送到口的端。在这一点上,多宿主机十分类似于SS7网络中的信令转接点(STP),每个STP具有多条的冗余链路,这些链路在大多数的时间里面都是空闲的(或者只是用于传输少数的管理信息),只有一条主链路在工作,当主链路出现故障而无法完成消息传递功能时,才会启用备用链路来传输信令消息,这种冗余结构保证了SS7网络具有极高的可靠性。 在建立SCTP偶联后,两个SCTP对端(SCTP endpoint)会将各自可用的多个本地IP地址绑定在SCTP偶联的本端,这样就会产生多个IP地址对组合而成的传输路径,例如图2.1中的(IP1, IP3)、(IP1, IP4)等。SCTP会事先确定一条主路径(primarypath ),其余的路径为备用路径,随后的数据传输都会默认地使用这条主路径进行,同时SCTP会通过发送心跳包的方式周期性地探测这些备用路径的可用性,同时保存这些备用路径的状态信息,例如往返时间RTT,等。如果在数据传输的某个时刻主路径出现了故障,无法发送数据了,这时SCTP就能通过之前收集的信息寻找一条备用路径,并自动将其选作主路径来进行随后的数据传输。同时SCTP的API草案还指出,SCTP用户可以通过指定数据传输时使用的目的ip地址的方法来主动地选择将数据发送到那条传输路径上去。 试想一下,如果使用TCP在多宿主机上实现上述SCTP提供的功能,将会是一件低效而繁琐的事情。因为这需要用户程序员或相应的函数库在用户空间中去实现类似SCTP路径切换和数据传输的平滑切换等存在,在用户空间去做这些事将会很困难。而这正是SCTP的优势所在。2.3.2 多流特性(Mutilstreaming) 在一个SCTP偶联中,用户除了可以选择使用不同的传输路径以外,还可以通过不同的逻辑流来发送和接收用户消息。但在用户选择不同的传输路径时,指定的是发送SCTP报文的传输路径,而逻辑流与用户消息(一个SCTP报文中可以包含多个用户消息)对应的。不同逻辑流的用户消息彼此独立,SCTP只保证同一个逻辑流的消息被按序地递交给接收端的用户。 输出流队列 流1 流2 流3 输入流队列 流1 输入流队列 流1 流2 流3 输出流队列 流1SCTP对端ASCTP对端B 图2.2 SCTP 多流特性 如图2.2所示。它是SCTP偶联中的单向逻辑流通道,分为两种类型:输出流、输入流。在不使用无序递交的情况下,每一个待发发送的用户消息都会被标识上一个流标识符(stream idenrifier, SID)和一个流序列号(stream sequence number, SSN ),然后根据每个用户消息的SID将其放入对应的输出流队列,并在适当的时候绑定在SCTP报文中发送出去。在接收对端这些属于不同流的用户消息又会根据SID被放入到对应的输入流队列中。为了保证同一个SID的用户消息被按序地递交给用户,将会按照SSN来整理输入流队列中的用户消息。在建立SCTP偶联时,两个对端会协商彼此所能使用的输出流与输入流的流数,在之后的数据传输阶段如果使用了超过协商规定的可使用最大逻辑流号,SCTP将会拒绝将这个数据发送出去。 SCTP的多流特性能够有效地避免在TCP中出现的队头阻塞(Head-Of-Lineblocking, HOL )。同时同一个SCTP偶联中的逻辑流使用一套拥塞控制参数来进行拥塞管理,从而使得数据传输更加的高效。在TCP中,为了能够向同一个对端发送不同的数据,需要建立多个TCP连接,并且在启动和拥塞控制阶段这些连接将会同时处于慢启动状态,这完全是没有必要的,同时也影响了数据传输效率。 目前,一些传统的应用己经开始尝试使用SCTP来代替TCP为它们提供端到端的数据传输服务了。2.4 SCTP的报头格式 一个SCTP报文由一个通用头部(common header)和若干的块(chunk)组成。如图2.3所示图2.3 SCTP报头在通用报头之后有若干个块结构,RFC4960规定SCTP报文至少包含一个块,上限由传输路径上的MTU决定。块是SCTP中最基本的处理单元,最多可以定义256种类型,目前RFC4960中只标准化了前14种类型。主要分为控制块和数据块两大类。在不同类型的SCTP块中标志字段有不同的含义。长度字段用于说明一个SCTP块的长度,其中包括类型、标志、长度部分。由于SCTP要求每个块都按4对齐,在每个块的尾部可能会包含一些填充字节,但这些字节不包括在长度字段的统计范围内。内容字段是可变长度的,根据不同的SCTP块类型,它还会有特定的内部结构。SCTP块在顺序上也是有一定要求的,大体上是这样规定的:控制块在前,重传数据块其次,最后是普通的数据块。 在一个SCTP报文的处理过程是:首先解析通用报头确定它属于哪个偶联,以及验证报文的有效性,接着按照报文中SCTP块的排列顺序依次的处理各个块。 SCTP的这种报文结构,使得它具有很强的扩展性,能够满足未来出现的新特性对SCTP提出的新要求。2.5 SCTP的拥塞控制 拥塞控制是SCTP具有的基本功能之一。在原理上SCTP中使用的拥塞控制机制与TCP相同,其基本思想是:发送方在拥塞参数的指导下,向接收方发送数据块,并且在发送之前用唯一的TSN标识数据块;接收方接收到数据块后周期性地向发送方发送SACK,用于通知接收方收到的数据块情况;发送方根据收到的SACK和超时定时器并使用适当的拥塞控制算法对拥塞参数进行更新,而这些更新过的参数又会用于随后的数据块发送。 当发送方想要发送数据时,它需要判断当前已经发送的未确认数据总量加上准备发送的数据量是否小于min(rwnd ,cwnd),并只有在小于的情况才允许发送方继续向网络注入数据。由于SCTP提供对多宿主机的支持,每个绑定在SCTP对端上的IP地址都可能意味着是一条独立物理传输路径,因此独自使用一套拥塞控制参数集来描述绑定在SCTP偶联上的每个对端传输地址的拥塞状况。然而来自接收方SACK中并没有描述TSN传输地址之间的对应关系,因此发送方需要在发送数据块时就将这些信息保存起来,这样才能发送方才能根据TSN找到需要更新的拥塞参数集。2.5.1慢启动算法 用于数据传输的开始阶段以及通过重传定时器对数据进行重传之后。判断条件是cwndssthreada算法如下:(1) 在刚进入数据传输阶段时,使用慢启动来进行拥塞控制,此时cwnd初始化为2*MTU,而ssthread被设置得很大,通常被设置为通告窗口(a_rwnd ) 的大小。但由于超时重传引起的慢启动cwnd会被初始化为1*MTU;(2) 假设发送方收到的SACK中使得累积确认点前进的那些TSN对应的数据块中包含的数据总量为A字节,那么 cwnd=oldcwnd+min (A ,PMTU);其中oldcwnd为更新之前cwnd的值,PMTU为被更新的cwnd对应的路径MTU 。2.5.2拥塞避免算法当cwnd ssthread时,使用拥塞避免算法来更新拥塞控制参数。算法如下:(1) partial_ bytes _acked初始化为0;(2) 每当一个收到的SACK携带的确认使得发送方的累积确认点增加,在累积确认点内被确认的数据块的字节总数将被累加到partial_ bytes_ acked 中 ;(3) 如果partial _bytes_ acked ssthread,就将cwnd更新为(cwnd+MTU ),同时将partial_ bytes _acked更新为min(0, partial _bytes _acked-cwnd);(4) 当所有的数据都被接收方确认后,发送方将partial_ bytes _acked更新为0。2.5.3快速恢复算法 当接收方发现收到的数据块的TSN并不连续时,说明可能在数据传输的过程中发生了丢失,因此随后接收方每一次发送数据,都会绑定上一个SACK来通知发送方数据出现了丢失,当发送方连续收到4个包含Gap Ack的SACK后,将进入快速恢复阶段。(1) 将SACK中指出的丢失TSN加入到重传队列中发送出去;(2) 更新发生重传的传输地址的拥塞控制参数。ssthread=max(ssthread/2,2*MTU),cwnd=ssthread。这样cwnd就变成了ssthread的一半,并进入了拥塞避免状态; (3) 启动重传定时器。2.6 本章小结 本章首先介绍了SCTP的发展背景再介绍了SCTP的主要特性,这包括偶联的建立与关闭、面向消息传输方式,多宿和多流及其报头格式。在此基础上,我们分析了SCTP的拥塞算法,它包括慢启动算法,拥塞避免算法,快速恢复算法。给出了SCTP特性的一个总体介绍。第三章 Lunix内核中的SCTP的实现3.1 引言 本章的SCTP多流优先级的实现完全是基于Lksctp。在对Lksctp的源代码进行详细阅读的基础上,本章将从核心数据结构、状态机等角度给出Lksctp的实现分析。3.2 核心数据结构在对Lksctp源代码进行仔细阅读时,会发现SCTP标准文档中描述的很多概念与Lksctp实现中的一些核心结构具有-一对应的关系,如表3.1示。表中括号内的单词对应RFC中使用的术语。 表3.1 RFC 2960中的术语LKsctp 中术语对应关系 RFC 2960中的术语 LKsctp 中对应的结构 SCTP对端(Endpoint) struct sctp-endpoint 偶联(Association) struct sctp-association SCTP报文(packet) struct sctp-packet 块(chunk) struct sctp-chunk 传输路径(transport address) struct sctp-transport cookie (cookie) struct sctp-cookie SCTP用户消息(user message) struct sctp-datamsg 这些结构主要定义在内核源码的include/net/sctp/structs.h头文件中,它们就好像一些名字,再结合接下来将介绍的SCTP状态机、智能管这些动词共同构成了一篇用C语言描述的SCTP文档。另外,真正的SCTP报文并不是记录在这些结构中的,而是由struct sk buff来完成这个工作。struct sk buff是Linux网络子系统用来定位和管理一个报文的重要数据结构。报文在Linux内核中被处理的整个过程中,它都将作为参数在各个协议模块之间传递,这样避免了报文消息在各网络子层之间重复的拷贝,从而提高了协议栈的处理效率。下面对Lksctp中一些比较重要的数据结构进行介绍2:(1) sctp_endpoint:无论是一对一,还是一对多形式,每一个套接口仅对应一个sctp_endpoint。它使用一个SCTP源端口号与一系列绑定在这个endpoint上的网络 层地址来唯一地标识这个endpoint,而这个IP地址既可以是IPv4也可以是IPv6 的。同时如果是一对多形式,随后通过套接口建立的SCTP偶联都会通过asocs字段加入到endoint管理的双向链表asocs中去。同时它还定义了一个输入队列,这个队列用于处理一些不属于任何SCTP偶联的SCTP报文。(2) sctp_association:用于表示SCTP偶联。为了能够清楚地描述一个SCTP偶联,结构中包含了源端地址信息、对端地址信息。源端地址保存在base字段中,用一个SCTP端口号和绑定在本地主机IP地址集,对端地址保存在peer中。但是由于对端的信息只能通过和对端主机的交互获得,十分有限,因此这些信息都是通过peer中的其他子结构来保存的。例如,对己收到的TSN的记录(存放在tsnmap字段中)、各条路径的状态信息、对端使用的cookie等。由于sctp_endpoint和sctp_association包含了一些相似的属性,因此这两个结构在设计的时候都包含了一个sctp_ep_common,用于记录这些的属性。(3) sctp transport:用于表示一条SCTP远端路径,包含一个SCTP对端的端口号和IP地址。由于SCTP对每一条传输路径进行独立的拥塞控制,因此结构中还包含了与这条路径相关的拥塞控制参数、链路状态、心跳包定时器等。同每一个sctp-transport中管理着一个待发送的报文,所有需要通过这个传输路径发送出去的数据块都需要组装到这个报文中,然后再使用SCTP_acket智能管发送出去。(4) sctpee chunk:一个SCTP块包含一个TLV结构的通用头部,随后是一些与协议类型相关的字段,这些信息都能通过sctp chunk结构来统一管理。这个结构通过指针skb指向管理实际用户消息的sk buff结构,还包含了指向接收这个chunk的偶联的指针以及发送的目的地址指针。由于MTU的限制,一个chunk可能无法包含一个完整的用户消息,所以如果chunk只是一个分片,就需要一个叫sctp datamsg的结构来对这些分片chunk进行统一的管理。但是在接收SCTP报文时,却仅使用一个sctp_chunk来管理包含在SCTP报文中的SCTP块。(5) sctp_packet:用于管理SCTP报文,每个SCTP报文有一个SCTP通用报头以及若干个chunk构成。该结构中包含了与形成一个报文通用报头相关的信息,以及将所有包含在该SCTP报文中的sctp chunk组织在一起的双向链表头chunk_list,以及指向发送路径的指针transport。这里有一点需要注意,在这个结构中,只是将报文中包含的chunk组织在一起,而每个chunk中的实际用户数据又由各自的sk buff结构管理。因此如果SCTP报文包含多个数据块,用户数据可能存放在一个不连续的内存区域中,因此在真正形成SCTP报文内容时,还需要将这些不连续的数据块拷贝到用一个统一的连续的内存空间中,在协议栈中进行这样重复的内存拷贝是降低效率的一个重要因素。这实际上是一个SCTP块绑定的过程,如果使用一种变通的方式来避免这样的数据重复拷贝,将会进一步的提高Lksctp的性能,但是目前Lksctp并没有提供这种变通的方式。(6) 用于管理各种准备输出的SCTP块,每一个SCTP偶联都包含一个这样的输出队列,这是实现SCT_outqueue智能管的核心数据结构。它将用于控制的SCTP块和用于传输数据_的SCTP块分别的存储。ontrol _chunk _list、out _chunk_ list双向队列中,以及一个用于数据块的重传的双向队列retransmit。(7) sctp_inq用于管理各种来自远端的输入chunk,它包含了一条条双向队列,in chunk_ list用于管理那些从输入的SCTP报文中分解出来的SCTP块,一条工作队列immediate以及一个指向正在处理的SCTP块的指针in_progress。3.3 Lksctp的状态机 在Lkscpt的实现中,状态机是非常重要的,可以说是整个Lksctp实现的核心。在SCTP标准文档中描述的SCTP有限状态机用于说明SCTP偶联的建立与拆除过程,而Lksctp的状态机描述了更多的处理细节。为了区别这两种状态机,文中称Lksctp实现的状态机为Lksctp状态机,而RFC2960中实现的状态机为SCTP状态机。Lksctp状态机接收各种事件,然后结合当前状态对事件进行决策并对其作出响应。 在Lksctp中, Lksctp状态机的使用是通过调用sctp _do_ sm()来完成的。在sc_do _sm中,将对事件的处理过程分成了两个阶段,描述事件需要获得的处理操作,这是通过调用相应的状态处理函数来完成的,根据前一阶段添加的处理操作,对事件进行处理,这是使用sctp_side effects()来完成的。这样设计主要是考虑到SCTP是一个具有扩展性非常强的协议,为了支持对未来SCTP可能提供的新服务,这样先说明统一指定操作然后再统一处理的结构能够使得Lksctp状态机能够很方便地被扩展来为新的事件服务。 sctp_do_ sm通过下列两个参数来区别不同的事件,即事件类型(sctp_event t ),以及事件子类型(sctp_subtype_t )。同时在结合调用sctp_do_sm的偶联当前所处的状态,确定一个为了处理这个事件所需要调用的SCTP状态函数。按照Lksctp设计者的话,Lksctp的状态函数是“purely functional”的,即状态函数仅仅描述对于个事件需要采取的处理操作的描述。具体的处理是由接下来的sctp_side _effects ()来完成的,它通过前一阶段Lksctp状态函数对处理方法的描述,进行具体的处理。Lksctp状态函数记录某,一事件需要的处理方法是通过sctp_cm_seq_t结构来完成的。 Lksctp将所有可能发送的事件分为下列四个大类:SCTP_EVENT_ T _CHUNK:表示产生的事件是一个输入SCTP块的到来;SCTP_EVENT_ T _TIMEOUT:表示产生的事件是定时器超时;SCTP_ EVENT_T_RIMITIVE:表示产生的事件是SCTP用户向Lksctp发送了一个原语(primitive ) ;SCTP_EVENT_T _OTHER:这个事件集表示所有不能归入上述三类的事件。 关于各种事件在不同的状态需要调用的状态函数可以用一张图表的形式清楚的表现出来,但是这是一张巨大的图考虑到SCTP是一个不简单的协议,提供了很多的特性,因此它的复杂也就可以理解了。日前的Lksctp中提供大约80多个状态函数,用于在各种状态下处理各种不同的事件。由于SCTP允许很多事件在不同的状态下发生以及一些事件在特定的状态在非法的,因此表中的很多位置使用了很多相同的状态函数对其进行处理,这些函数是在net/sctp/sm_statfuns.c。中定义的。 由于后面分析的需要,这里结合SCTP用户使用的两个原语来说明Lksctp状态机的工作过程,sctp_primitive_ASSOCIATE, sctp_primitive_ SEND。3.4 Lksctp的初始化偶联原语 在一对多形式下,SCTP用户通过向一个在此之前还没有与之建立连接的目的端发送用户消息来触发初始化偶联原语的产生,在Lksctp中即为一个名为sctp-primitive_ASSOCIATE。在调用这个原语之前,个还没有初始化完毕的sctp-association结构被创建,并用其作为参数调用原语。原语立即使用相应的事件等参数去调用sctp_do_sm()。 SCTP用户请求与对端建立偶联sctp_side_effects()/用于执行上述操作sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_ START, SCTP_TO(SCTP_ EVENT _TIMEOUT_T1_INIT);sctp_add_cmd_sf(commands,SCTP_CMD_REPLY, SCTP_CHUNK(repl); sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC,SCTP_ASOC(struct sctp_association*) asoc);sctp_endpoint_add_asoc();sctp_hash_established();/将之前创建的联合将入到全局环境中sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,SCTP_STATE(SCIP_STATE_COOKIE_ WAIT);通过查找状态表找到并调用状态函数sctp_sf_do_prm_asoc()sctp_assoc_choose_init_transport();/为INIT选择一条发送路径chunksctp_make_init();创建一个类型为INIT的chunk并进行初始 sctp_add_cmd_sf(commands, SCTP_CMD_INIT_CHOOSE _TRANSPORT, SCTP_CHLINK(repl); 调用原语sctp_primitive_ASSOCIATE()sctp_cmd- new_ state()/将当前联合的状态改变为COOKIE_WAIT,并做一些必要调整使用SCTP_EVENT_T_PRIMITIVE、SCTP_PRIMITIVE_ASSOCIATE作为参数调用sctp_do_sm()add_timer();/启动T1定时器sctp_outq_tail;/将INIT chunk发送出去结束图3.1 sctp_primitive _ASSOCIATE流程 图3.1中的第一个虚线框表示sctp_sf_do_prtn_asoc()中调用的一系列函数,这些函数只是将各种命令及其需要使用到的参数加入到commands的命令队列中去,同时还使川sctp-make_init创建了一个INIT chunk,在随后的sctp_side _effects()中依次地执行先前加入到。commands中的命令,通过这样的方式一个初始化偶联原语就被执行了。至于SCTP对端对这次连接建立的请求响应则是在输入事件中被状态机处理的,在发送INIT chunk之前,已经做好了足够准备;所以当收到响应时,Lksctp会对其进行正确的处理。在正确地建立SCTP偶联后,Lksctp会将相应的偶联的状态变更为ESTABLISHED。这样偶联就进入了SCTP数据的传输阶段了。3.5 Lksctp的用户消息发送原语 一对多形式下,由于在发送用户消息时需要指定较多

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论