You are on page 1of 39

论文分类号 TN915.

04 单位代号 10183
密 级 公 开 研究生学号 2005522074

吉 林 大 学 硕 士 学 位 论 文
SCTP 主路径自动切换的研究
The Research on Auto-handoff for the SCTP Primary Path

作者姓名  胡文静
专 业  通信与信息系统
导 师 
职 称  李 玲 副教授

学位类别 : 工学硕士
论文起止年月 2006 年 3 月至 2007 年 4 月 www.docin.comwww.docin.com 吉林大学硕士学位论文原创性
声明
本人郑重声明所呈交的硕士学位论文是本人在指导教
师的指导下独立进行研究工作所取得的成果。除文中已经注明
引用的内容外本论文不包含任何其他个人或集体已经发表或撰
写过的作品成果。对本文的研究做出重要贡献的个人和集体均
已在文中以明确方式标明。本人完全意识到本声明的法律结果由
本人承担。

学位论文作者签名
日期 年 月 日 www.docin.comwww.docin.com 《中国优秀博硕士学位论文全文数据库》投稿
声明 研究生院
本人同意《中国优秀博硕士学位论文全文数据库》出版章程
的内容愿意将本人的学位论文委托研究生院向中国学术期刊
光盘版电子杂志社的《中国优秀博硕士学位论文全文数据库》
投稿希望《中国优秀博硕士学位论文全文数据库》给予出版
并同意在《中国博硕士学位论文评价数据库》和 CNKI 系列数据
库中使用同意按章程规定享受相关权益。
论文级别□硕士 □博士
学科专业 通信与信息系统
论文题目 SCTP 主路径自动切换的研究
作者签名 指导教师签名
年 月 日
作者联系地址邮编 吉林长春南湖大路 5372 号吉林大学
南湖校区5 公寓 201 寝 130012

作者联系电话13596428442www.docin.comwww.docin.com
作者姓名
胡文静 论文分类号 TN915.04
保密级别 公开 研究生学号 2005522074
学位类别 工学硕士
授予学位单

吉 林 大 学
专业名称 通信与信息系统
培养单位
院、所、中
心
通信工程学院
研究方向 宽带通信 学习时间
2005 年 9 月
至 2007 年 6 月
论文中文题目 SCTP 主路径自动切换的研究
论文英文题目 The Research on Auto-handoff
for the SCTP Primary Path 关键词 SCTP NS 主路径 自动切换
姓 名 李玲 职称 副教授
导师情况
学历学位 硕士 工作单位
吉林大学
通信工程学院
论文提交日期 2007 年 4 月 23 日答辩日期 2007 年 6 月 9 日
是否基金资助项

否 基金类别及编号
如已经出版请填写以下内容
出版地城
市名、省名

出版者机构名

出版日期
出版者地址包括邮
编
www.docin.comwww.docin.com 内容提要 SCTP 被预言为取代 TCP 的传输层协议。本文针对当 SCTP
主路径性能恶化时即主路径时延大于辅助路径时延时数据仍
在恶劣的主路径上传输这一问题提出主路径自动切换 3 种递进
改进方案。在 NS 环境下修改 SCTP 的 C++代码实现 3 种方
案方案一基本主路径自动切换方案二避免多余重传方
案三扩展初始拥塞窗口。进而仿真得出数据。通过数据拟合
得到改进后协议的传输速率的提高模型。实现主路径自动切换的
SCTP 相对于未改进的 SCTP在路径发生切换后传输速率提
高模型是 %
100]1)3[(×−−=tTBη
其中 B 是新旧路径的带宽比T 是切换周期t 是以切换时
刻为开始的一段时间。
实现主路径自动切换的 SCTP 及其速率提高模型必将对
SCTP 的理论研究以及应用具有一定推动作用。 关键字SCTPNS,主路径自动切换
www.docin.comwww.docin.com 目录
i 目 录
第一章 绪论...................................1 1.1 SCTP 发展背
景..........................................1 1.2 国内外研究动
态.........................................2 1.3 本文的贡献及意
义.......................................2 1.4 本文结
构...............................................3 第二章 SCTP 概
述..............................5 2.1 SCTP 主要特
性..........................................5 2.2 SCTP 分组格
式.........................................13 2.3 数据传
输..............................................17 2.4 本章小
结..............................................22 第三章 网络仿真工具
NS......................23 3.1 NS 介
绍...............................................23 3.2 TCL 脚本编写规
则......................................28 3.3 NS 中的 SCTP 代理
(Agent)...............................30 3.4 搭建 SCTP 传输网
络.....................................34 3.5 NS 的安装与编
译.......................................39 3.6 本章小
结..............................................40 第四章 SCTP 的 C++代码分
析....................41 4.1
Recv()................................................41 4.2
ProcessChunk()........................................41 4.3
ProcessDataChunk()....................................43 4.4
UpdateRecvTsnBlocks().................................45 4.5
ProcessSackChunk()....................................48 4.6 本章小
结..............................................48 第五章 基本主路径自动切换方
案................49 www.docin.com 吉林大学硕士学位论文
ii5.1 方案一基本主路径自动切换机制........................49 5.2 NS 仿真实
现...........................................53 5.3 路径切换的特
点........................................55 5.4 基本主路径自动切换结
论................................58 5.5 本章小
结..............................................58 第六章 进一步改进方
案........................61 6.1 方案二避免多余重传机
制..............................61 6.2 方案三扩展初始拥塞窗口机
制..........................68 6.3 本章小
结..............................................72 第七章 传输速率提高模
型......................73 7.1 四种方案比
较..........................................73 7.2 速率提高模
型..........................................75 7.3 本章小
结..............................................77 第八章 结
论..................................79 参考文
献....................................81 摘要 .......................................
I Abstract......................................V 致谢 www.docin.com 第一章 绪论
1 第一章 绪论 1.1 SCTP 发展背景 因特网和电信网曾经一度是两个独立的网络它们提供不同的业务。
因特网的爆炸式发展和人们的对电信业务的更多需求驱动着两大网络的
融合。IP 技术的飞速发展促使网络融合朝着以 IP 为基础的分组网方向
发展。然而电信网中的电路交换到分组交换将是一个长期的渐进过渡的
过程。在这过渡过程中以电路交换为基础的网络和以分组交换为基础的
网络之间的通信首先要求信令能够互联互通。只有实现了信令的互连互
通才会促进电信网和分组网的最终统一。
基于互联互通的需要IETF 在 1998 年正式成立了一个新的工作组
信令传送工作组(SIGTRAN)主要负责设计与制定 IP 网上传送的 PSTN
信令的标准与协议。而 SS7 就是 PSTN 的信令。
SS7 网和 IP 网的信令互通要求保留原有的 SS7 网和 IP 网的协议栈并在
此基础上使得 IP 网即能传送语音流又能传送 SS7 信令。为此SIGTRAN 的
第一步工作就是产生报告文档 RFC2719[1]指明在 IP 上传输电话信令所需的
功能和性能需求[2]还阐述了信令消息对丢失率、延时以及安全性等方面
的要求同时给出了信令互通的体系结构。后来 Randall Stewart 和 Xiaobing
Xie 提交的多网络数据报传输协议[3](MDTP)获得一致好评。接着 MDTP 演变
到 SCTP[4](Stream Control Transport Protocol)不仅仅名称发生改变协议内容变动也很大。相对
于 MDTP, SCTP 完全改变了协议数据报头和内部的
数据结构采用 Cookie 机制来有效抵御伪攻击数据传送过程中使用了
TCP[5]的拥塞控制策略。另外在消息绑定、数据分段等方面也作了很大的
修改。2000 年 1 月SIGTRAN[6]对 SCTP 再次作了一个很大的变动直接修
改协议栈使 SCTP 直接运行于 IP 层上这意味着 SCTP 从此可以在操作系
统内核中实现。经过不断的研究SIG- TRAN 工作组在 2000 年 10 月正式发
布 RFC2960详细阐述了 SCTP 这个新的传输协议。
新诞生的 SCTP 集合了 TCP、UDP[7]的优点克服了 TCP 固有的队头阻
塞、Dos[8]攻击另外新增了许多功能如多流[9]、多宿[9]、面向消息传输、
Cookie 安全机制[10]动态地址重配置[11]、部分可靠传输[12]、支持移动 IP[13]等等。不但满足了在分组
网上传输信令的要求而且成为了通用的传输层
协议能提供更好的多媒体传输服务移动环境下端到端的高效服务。 www.docin.com 吉林大学硕士学位论文
2SCTP 被业界称为超级 TCP在下一代网络中很有可能取代当前流行
的 TCP。 1.2 国内外研究动态 SCTP 是新诞生的协议协议的功能不断的增加性能不断的增强。
目前主要是在网络模拟中研究也有一些公司、大学、组织搭建了 SCTP
实验网。
国外的研究侧重于起草标准。定义 SCTP 负荷分担草案(多路径同时
传输)[14]制定部分可靠传输标准提交建立 SCTP 偶联后的动态地址重
配置提交 SCTP API 草案[15]定义 SCTP 对移动 IP 的支持提交单播拥塞控制建议标准 TCP 友好可变速率
控制等等。其中特拉华大学的协议
工程实验室[16](PEL)受美国军方(ARL美国陆军研究实验室)的资助重
点研究 SCTP 在移动网络和 Ad hoc[17]网上的应用包括军事应用。除了 PEL国外主要研究机构有思科、
SUN、诺基亚等。
国内的研究侧重于应用。SCTP 与 TCP 的比较[18]SCTP 在移动环境
下的性能研究(比如平滑切换[19]移动 IP[20]最后一跳性能恶化问题[21]基于 SCTP 移动 Internet 传输
模型[22]等)基于独立路径拥塞控制的 SCTP 负荷分担机制研究[23]结合 SS7 的研究[24]SCTP 的安全问
题军事应用[25]等等。国内研究在广度上逐渐跟上国际步伐但在深度上权威性方面还有一定距离。国内在
这方面研究比较多的机构有北京邮电大学、南京
邮电大学、华为、中兴等。 1.3 本文的贡献及意义 本文提出 3 个递进方案。
由于 SCTP 的多宿特性(即终端有多个 IP 地址)一个偶联(类似 TCP
连接)可以拥有多条传输路径。SCTP 规定在传输过程中只用一条主路径
进行传输数据其他路径作为替补除非主路径故障否则一直都使用主
路径传输数据。而偶联建立过程中主路径的选择带有一定的盲目性不
一定是最优路径而且最优路径很有可能随着时间的变化在这多条路径
中不断变化的。
本文针对主路径并非时延最小的问题提出主路径自动切换到时延最
小的路径的机制即基本主路径自动切换机制记为方案一。
在路径切换阶段新、旧路径是同时传输数据的。因为新路径时延低www.docin.com 第一章 绪论
3 旧路径时延大必将导致后发的数据先到收端。如此收端发现数据失序
认为数据丢失并通知发端。发端收到四次失序报告就会重发该数据块。
实际上数据没有丢失只是晚到。所以这些块重发都是多余的。
因此在方案一的基础上针对多余重传问题提出在切换周期内避
免多余重传机制记为方案二。
在方案二中新路径一开始的传输速率较低其原因是拥塞窗口小。
SCTP 规定新路径的初始窗口为 2SMSS(Sender Maximum Segment Size)
而旧路径上的拥塞窗口经历了慢启动阶段后快速增大旧路径的拥塞窗口
比新路径的初始拥塞窗口大一个数量级及以上。因为所有传输路径目的终
端相同又处于同一时间段各条路径具有一定的相关性所以各条路径
的拥塞窗口在一定程度上可以相互借鉴。
因此在方案二的基础上针对路径切换阶段初始拥塞窗口太小的问
题提出将新主路径初始拥塞窗口增至旧主路径拥塞窗口的一半即扩展
初始拥塞窗口机制。这种机制既扩大了拥塞窗口又起到了拥塞控制的作
用比较合理。此记为方案三。
方案三是最优的方案。方案三是完整的主路径自动切换。
最后根据方案三采取大量样值数据通过数据处理并拟合得到
实现主路径自动切换的 SCTP 的传输速率提高模型。
实现主路径自动切换增强了 SCTP 的传输性能增强了 SCTP 的应
用价值促进了 SCTP 的发展。提出速率提高模型推进了 SCTP 的学术
研究为后续研究打下基础。 1.4 本文结构 第二章介绍了 SCTP 协议机制及 SCTP 的核心特点例如多流、多
宿、
安全 3 个本质特性。
第三章介绍了网络模拟(NS)软件SCTP 代理特有命令集NS 下的
SCTP 脚本编写规则本文仿真实验脚本以及网络模拟过程中需要注意的
问题。
第四章分析了 2.30 版 NS 自带的 SCTP 的 C++代码主要是数据传输
和接收这部分函数。
第五章设计并实现了 SCTP 的改进方案一基本主路径自动切换机
制得到仿真数据并进行相应分析。 www.docin.com 吉林大学硕士学位论文
4 第六章针对基本主路径自动切换所存在的多余重传和新路径初始拥
塞窗口太小问题进一步提出方案二和方案三避免多余重传机制和扩展
初始窗口机制。通过仿真实现设计内容得到相关数据进而比较优劣。
得出方案三传输速率最快的结论。
第七章比较了 3 种改进方案给出在路径发生切换后主路径自动切
换的 SCTP 相对于未改进 SCTP 的速率提高模型并通过数据初步验证模
型的合理性。
第八章总结全文所做工作。 www.docin.com 第二章 SCTP 概述
5 第二章 SCTP 概述 2.1 SCTP 主要特性 如图 2-1 所示SCTP 位于 SCTP 用户和 IP 网络层之间类似于
TCP、
UDP是传输层协议是面向连接的可靠传输协议。

偶联类似于 TCP 的连接但它的意义更广。TCP 的连接只有一条传输


路径而偶联可以有多条传输路径。如图 2-2 所示图中的一个偶联中有
两条传输路径。 OSNI-1
NI-2NI-2NI-1Application 1
SCTP port=300
Application 2
SCTP port=400
IP 网络
IP 网络 ip1=10.80.167.111
ip2=202.180.167.165
ip1=10.190.167.12
ip2=220.180.167.19 端点 A
端点 Z
图 2-2 SCTP 偶联 一个或
多个 IP
地址
SCTP 用户
一个或
多个 IP
地址
SCTP 用户
SCTP 端点 A SCTP 偶联
图 2-1 SCTP 视图
SCTP 端点 Z
SCTP
IP
SCTP
IP www.docin.com 吉林大学硕士学位论文
6 偶联的表达式为
{[10.80.168.111,202.180.167.165:300],[10.190.167.12,220.180.167.19:400]}
SCTP 有 3 个本质特性这些特性使其突破了 TCP、UDP 的固有不足
具备先天优势既满足了因特网对通用传输协议的需求又推进了三网合
一。
2.1.1 多流特性
流是偶联中单向逻辑通道是消息序列。一条偶联中可以有多条流
即多流如图 2-3 所示。各条流相互独立。流内可以顺序传输递交也
可无序传输递交这取决于应用层对流的性质的规定。 发送流
发送流
接收流接收流
接收流接收流
发送流发送流流 1
流2
流3
流 4SCTP 偶联
端点 A
端点 Z
图 2-3 偶联中的多流
SCTP 的消息具备定界机制。消息是以数据块(DATA CHUNK)为载体
的见图 2-4。数据块头 Length(长度)用于消息定界。FLAGS 有 3 个比特。
第一比特“U(unorder)”用于表示消息是否需要有序。如果不要求有序的
那么消息的“U”置 1。第二、三比特“B”“E”是 begin,end 的缩写如
果消息太大就要把消息拆分拆分后的第一块 B 置 1拆分后的最后一
块 E 置 1。如果打成的 IP 包大于 MTU(最大传输单元)那么消息就要被拆
分。因为即使 SCTP 不把它拆分路由器也会把 IP 包再拆分这时就增加
了网络层的压力。现在 SCTP 能自动检测出 MTU先行拆分减少了网络
层的压力。性能又提一层。Stream Identifer 是流标识符标识各自独立的
流。Stream Sequeue Num 是流内序号。 www.docin.com 第二章 SCTP 概述
7 图 2-4 DATA CHUNK 的分组格式 SCTP 可以对大消息拆分也可以对小消息捆绑。如果消息字节数太
少比如信令消息就可以捆绑在同一个 SCTP 包里然后再发送。这样
提高了 SCTP 的传输效率降低了开销。
多流应用潜力非常广泛音视频传输[26]WEB 访问FTP 传输等等。
音视频传输是指音频、视频放在不同的流里面两者相互独立假使
网络性能不好丢掉了大数据量的视频小数据量的音频还是能很好传送
到收端不耽误收听、交流。而且音频、视频都设置成无序方式(U=1)一
旦到达收端立即递交至高层提高实时性。
WEB 访问是指在 WEB 里种类丰富的多媒体信息如文本、图片、动
画、视频、声音等等不同的种类可以放在不同的流里传输。通过举例
WEB 访问来说明多流的优越性。假定 WEB 服务器有 3 个小文件每个文
件打包成两个报文。不同的文件用不同的形状表示。三角形为数据文件
圆形为音频文件方形为图片文件。
基于 TCP 的 WEB 访问方式。如果客户端和服务器建立了一条连接
如图 2-5 所示。第一个报文丢失客户端收到了之后的所有报文也只能
放在缓存里不能递交给用户等待报文 1 的到达。这是 TCP 典型的队头
阻塞[27]问题。它势必造成较大的延时。
图 2-5 一条 TCP 连接的 WEB 访问 www.docin.com 吉林大学硕士学位论文
8 为克服队头阻塞提高传输效率客户端与服务器建立 3 条连接分
别传输 3 个文件如图 2-6 所示。在连接 1报文 1 丢失报文 2 收到后只
能在缓存中等待不能立即递交。在连接 2报文乱序报文 4 先到达
但不能立即递交给用户需等报文 3 到达并排序后才能递交给用户。在
连接 3报文是顺序的一旦到达客户端立即递交。
图 2-6 3 条 TCP 连接的 WEB 访问 连接 2 上的文件 2 是音频文件不需要严格有序如果 4 报文先到达
也能立即递交给用户那么能实时性就增强了。但 TCP 不能满足此要求。
服务器、客户端需要为 3 条连接中的每条连接都维护一组变量(传输控
制块)这增加了服务器、客户端的负担。对于服务器来说它能服务的客
户就变少了。此外3 条连接也增加了网络中路由器负担。这些都是 TCP
的弊端。
而采用 SCTP 这些问题都能得以克服如图 2-7 所示。3 个文件用 3 条
流来传输流之间相互独立当报文 1 丢失时不影响流 2、流 3 递交。
这里很好地克服了队头阻塞。3 条流就像 TCP 的 3 条连接。但是 SCTP 只
用一组变量(传输控制块)来维护这一条偶联减轻了服务器、客户端、路
由器的压力。
图 2-7 基于 SCTP 传输 不但如此SCTP 还有其它优点。例子中文件 2 是音频文件它不需 www.docin.com
第二章 SCTP 概述
9 要严格有序。我们可以把 DATA CHUNK 的 FLAGS 的“U”置为 1表示
允许乱序。这样当乱序的报文 4 先到达客户端时不用等待报文 3就直
接递交给用户。这克服了队头阻塞也提高了 WEB 访问的响应速度降
低了时延。
多流特性很好地满足了因特网多媒体传输三网合一等需求。
2.1.2 多宿特性
多宿[28]即端点可以有多个地址一般指多个 IP 地址。如图 2-2 所示
每个端点各有两个 IP 地址一个偶联里有两条传输路径。
SCTP 建立偶联后选择某条传输路径为主路径其它路径为辅助路
径绝大部分数据都是在主路径上传输的部分重发的数据有可能在辅助
路径上传输。SCTP 具有路径故障管理功能。SCTP 发送心跳块(Heartbeat)
周期性检查辅助路径是否处于激活状态。如果收到心跳块证实
(Heartbeat-ACK)那么该路径是正常的否则记录该路径错误一次。如果
错误出现次数超过阈值那么记录该路径为故障状态关闭该路径。如果
主路径故障RTO 大于 60 秒那么 SCTP 把主路径切换到其它激活路径上
继续传输不像 TCP 需要再次建立连接。多宿特性保证传输的连续性保
证偶联的可靠性[29]。
通过心跳块把偶联中的多条路径管理起来了通过路径冗余来实现网
络级容错提高传输的可靠性。
在 SCTP 多宿特性基础上专家又在 SCTP 上扩展了动态地址重配置
功能即移动 SCTP。动态地址重配置是在偶联保持活动阶段动态的增
加和删除 IP 地址并告诉对端将要使用的 IP 地址。
移动 SCTP 不同于移动 IP[30]。前者是传输层的移动后者是网络层的
移动。网络层的移动需要在网络层设置移动代理这增加了网络层的复杂
程度加重了路由器的负担。动态地址重配置(移动 SCTP)支持了终端的移
动。终端移动本质是端到端的移动主机的移动只应该影响那些正在与之
进行通信或是将要与之进行通信的节点。而传输层刚好负责端到端通信的。
所以把移动从网络层提升到传输层后会减少对网络层的修改和升级现有
的网络层设施有利于现有网络过渡到全面支持移动性。
图 2-8 描述了基于移动 SCTP 的终端移动[31]。
在第三代移动通信的 Node_B 的覆盖范围里有一笔记本电脑 A与对
端 Z 通过偶联进行通信现在 A 正从 C 小区移向 D 小区。分析一下建立
偶联与移动的过程。 www.docin.com 吉林大学硕士学位论文
10 因特网
IP1
IP2
IP3Node_B
Node_B
路由器
路由器
路由器 A
A
ZCD
图 2-8 移动 SCTP 举例 1) A 在 C 小区主动发起通信A 在 C 小区收到 Node_B 分配给的 IP2
以 IP2 为地址与 Z 的 IP1 建立偶联。
2) A 移动并获得新地址[32]A 向 D 小区移动在 D 小区边界处得到 D
小区分配的新地址 IP3。
3) 在偶联中动态增加新地址把 IP3 新地址加入到偶联中并通知对
端 IP3 作为主地址。
4) 在偶联中动态删除旧地址由于 C 小区所发送的信号能量逐渐减
弱减弱到一定门限值时删除 C 小区所分配的 IP2。
5) 继续移动重复 2~4 过程。 www.docin.com 第二章 SCTP 概述
11 2.1.3 安全特性
2.1.3.1 TCP 的缺陷
TCP 因为在拒绝服务中易受攻击所以被 SIGTRAN 否定掉。而 SCTP
的四次握手机制很好的解决这一安全机制的问题。
TCP 容易受 SYN Flooding[33]的攻击。面向连接的 TCP 三次握手是 SYN
Flooding 存在的基础SYN Flooding 利用了 TCP/IP 的这一固有漏洞。
SYN Flooding 攻击的原理是恶意攻击者向服务器发送大量 SYN 报
文服务器在发出 SYN+ACK 应答报文后无法收到客户端的 ACK 报文(第
三次握手无法完成)服务器端将为维护一个非常大的半连接列表而消耗非
常多的 CPU 和内存资源还要不断对这个列表中的 IP 进行 SYN+ACK 的
重试。服务器端将忙于处理攻击者伪造的 TCP 连接请求而无暇理睬客户的
正常请求此时从正常客户的角度看来服务器失去响应。
2.1.3.2 网络安全的特点
要想很好地抵御这类网络攻击[34]需要做到如下几点
1) 网络服务器收到服务请求时在确认此请求合法性之前不分配任
何本地资源
2) 识别出重复的或者过时的服务请求对此类有攻击嫌疑的请求不予
理睬
3) 当接收到新的服务请求时应该赋予当前正在处理的工作以更高的
优先权
4) 对于非单一传送的意外分组不做任何响应。
2.1.3.3 SCTP 的 Cookie 安全机制
SCTP 能够较好的满足这些特点。在一次 SCTP 四路握手中INIT 消息
的收端不必保存任何状态信息或者分配任何资源这样就可防范 SYN
Flooding 等攻击。它在发送 INIT-ACK 消息时采用了 Cookie 机制该 Cookie
具有发端要建立自己状态所需的全部信息。
SCTP 产生一个状态 Cookie 的过程如下
1) 使用收到的 INIT 和发出的 INIT- ACK 块中的信息创建一个偶联的
TCB(传输控制块)。
2) 在 TCB 中将当前日期设为创建日期将协议参数“有效 Cookie
时间”设为生存期间。
3) 根据 TCB收集重建 TCB 所需的最小信息子集将该子集和密钥 www.docin.com 吉林大学硕士学位论文
12 产生一个 MAC(信息认证编码)。
4) 结合上述最小信息子集和 MAC 产生状态 Cookie。
5) 在发送完 INIT ACK(包含状态 Cookie 参数)后发送方必须删除 TCB
以及任何与新偶联有关的本地资源。
当端点收到带状态 Cookie 的 INIT-ACK 时立即用此状态 Cookie 向
对端响应一个 COOKIE ECHO 块。
当收端收到了对端发来的 COOKIE ECHO 块则该采取以下动作。
1) 使用状态 Cookie 中携带的 TCB 数据和密钥来计算 MAC(RFC2104
中介绍了如何生成和计算 MAC)。
2) 状态 Cookie 的鉴权是把计算出的 MAC 同在状态 Cookie 中携带的
MAC 进行比较如果比较失败则把这个包含 COOKIE ECHO 和数据块(可
能包含)的 SCTP 分组直接丢弃而不产生任何指示。
3) 对状态 Cookie 中的创建时间标记和当前的本地时间比较如果封
装的时间已经超过了在状态 Cookie 中携带的寿命值则这个包含 COOKIE
ECHO 和数据块(可能包含)的 SCTP 分组被丢弃同时该端点必须向对端传
送一个差错原因为“过期的 Cookie (Stale Cookie)”的 ERROR 数据块。
4) 如果状态 Cookie 有效则使用 COOKIE ECHO 携带的 TCB 数据信
息向发送 COOKIE ECHO 块的发端创建偶联并进入到 ESTAB- LISHED
状态。
5) 向对端发送 COOKIE ACK 数据块用来确认收到了 COOKIE ECHO
数据块。
SCTP 通过 COOKIE 机制满足了抵御网络攻击所提出的要求成就
了 SCTP 的安全性。
2.1.4 SCTP 与 TCP、UDP 的比较
TCP 用于对数据的可靠传输但是由于队头阻塞问题(HOL)降低了
TCP 的传输效率。UDP 用于对非可靠数据的传输对 TCP 不友好容易
造成网络拥塞。SCTP 的功能特点规定了它的适用性适于无序、有序数
据的可靠传输同时对多宿主机的支持提高了对网络级容错和移动。表 2-1
是 SCTP、TCP、UDP 的功能比较。
www.docin.com 第二章 SCTP 概述
13 表 2-1 SCTP、TCP、UDP 功能比较
SCTP TCP UDP
全双工数据传输 是 是 是
面向连接 是 是 否
可靠的数据传输 是 是 否
部分可靠数据传输 可选 否 否
有序递交 是 是 否
无序递交 是 否 是
流控和拥塞控制 是 是 否
选择性确认 是 可选 否
消息定界 是 否 是
路径 MTU 发现 是 是 否
应用层数据拆分、捆绑 是 是 否
多流 是 否 否
多宿 是 否 否
SYN 泛洪攻击保护 是 否
/
支持半关闭连接 否 是
/ 2.2 SCTP 分组格式 SCTP 分组由公共的分组头和若干块[35] (CHUNK)组成每个数据块中
既可以包含控制信息也可以包含用户数据。图 2-9 是 SCTP 的分组格式。
SCTP 公共头(common header)共 12 个字节。验证标签是判别所收分组
的有效性其可以提高安全性。校验和是用于判断分组是否比特错误提
高分组的可靠性。
块是 SCTP 特有的消息格式主要块如表 2-2 所示除了表中的块
还有很多预留给以后用的块。块主要分为控制块和数据块(如图 2-4 所示)。
下面讲解一下几个典型的块。 www.docin.com 吉林大学硕士学位论文
14
图 2-9 SCTP 分组格式
表 2-2 SCTP 各种 CHUNK
信息块类别 信息块名称 信息块类型值
INIT 0x01
INIT-ACK 0x02
COOKIE-ECHO 0x0A
COOKIE-ACK 0x0B
SHUTDOWN 0x07
SHUTDOWN-ACK 0x08
SHUTDOWN-COMPLETE 0x0E
偶联
控制

ABORT 0x06
DATA 0x00
用户
数据块
SACK 0x03
HEARTBEAT 0x04
路径管理块
HEARTBEAT-ACK 0x05
异常块 ERROR 0x09 www.docin.com 第二章 SCTP 概述
15 2.2.1 INIT 块
图 2-10 是 INIT 块格式该块用来启动两个 SCTP 端点的一个偶联。
启动偶联还需 INIE-ACKCOOKIE-ECHOCOOKIE-ACK 三块。INIT-ACK
与 INIT 块格式一样。
启动标签INIT 的收端记录启动标签参数的值。这个值必须被放置到
INIT 的收端发送的与该偶联相关的每个 SCTP 分组中的验证标签字段中。
启动标签允许除 0 以外的的任何值。如果在收到的 INIT 数据块中的启动标
签为 0则接收方必须作为错误处理并且发送 ABORT 数据块中止该偶联。
图 2-10 INIT 块格式 通告的接收方窗口信用值(a_rwnd)这个值表示指定的缓冲区的容量
用字节数表示为 INIT 发送方为偶联预留的窗口大小。在偶联存活期间
这个缓冲区的容量不应减少(即不应把该偶联的专用缓冲区取走)但端点
可以在发送的 SACK 数据块中修改 a_rwnd 的值。
最大输出/输入流数流的数目在偶联启动的时候约定好的。
初始的 TSN(Transmission Sequence Number)定义发送方将使用的初
始的 TSN该值可以设置为启动标签。
2.2.2 SACK 块
图 2-11 是 SACK 块格式。该块用来证实数据。
累积 TSN 证实该字段指示收到连续 TSN 序列的最后一个 TSN 值。
通告的接收方窗口信用(a_rwnd)该字段指示修改了 SACK 的发送方
的接收缓冲容量的字节数。 www.docin.com 吉林大学硕士学位论文
16
图 2-11 SACK 块格式 间隔证实块的数目用来指示 SACK 块中包含的间隔证实块的数目。
重复的 TSN 的数目该字段包含了该端点收到的重复的 TSN 的数目。
每个重复的 TSN 都列在间隔证实块列表后。
间隔证实块开始该字段用来指示这个间隔整数块的起始 TSN 偏移
为了计算实际的 TSN 号码必须要用累积 TSN 证实加上偏移号码。计算出
的 TSN 标识用来识别第一个在这个间隔证实块中被收到的 TSN。
间隔证实块结束用来指示这个间隔证实块的结束 TSN 偏移为了计
算实际的 TSN 需要把累积 TSN 证实加上这个偏移号码。这个计算出的 TSN
用来识别在这个间隔证实块中最后收到的 DATA 数据块。
重复的 TSN用来指示一个在上一个 SACK 发送后收到的 TSN 重复
的个数。每次一个接收者收到一个重复的 TSN(在发送 SACK 前)则把这
个 TSN 加到重复的 TSN 列表中。每发送一次 SACK 后则把统计重复 TSN
的计数器重新清 0。
2.2.3 Heartbeat 块与 Heartbeat-ACK 块
SCTP 端点通过向对端点发送这个 Hearbeat 块用来检测定义在该偶联
上到特定目的地传送地址的可达性。Heartbeat 块如图 2-12 所示。 www.docin.com 第二章 SCTP 概述
17 Type=3flagsHEARTBEAT 长度
HEARTBEAT 参数
图 2-12 Heartbeat 块格式
HEARTBEAT 参数字段如图 2-13 所示它是一个可变长度的非透明
数据结构其信息通常只需要发送方明白即可。当该 HEARTBEAT 块发送
到目的地传送地址时发送方特定的 HEARTBEAT 信息字段通常包括关于
发送方当前的时间信息。
图 2-13 HEARTBEAT 参数格式 SCTP 端点在收到对端点发来的 HEARTBEAT 块后则发送
Heartbeat-ACK(见图 2-14)块作为响应。HeartBeat-ACK 总是向包含
HEARTBEAT 块的 IP 数据报中的起源 IP 地址发送。
图 2-14 Heartbeat-ACK 块格式 HEABTBEAT 信息可变长度该字段的内容应当把 HEARTBEAT 块
中的 HEARTBEAT 参数作为回送的响应该字段包含一个可变长度的非透
明的数据结构。 2.3 数据传输 2.3.1 SCTP 包的产生过程
图 2-15 是 SCTP 包的产生过程。SCTP 将用户消息生成数据块有两种
可能
1) 如果用户消息小于 SMSS(Sender Maximum Segment Size
SMSS=PMTUIPheaderSCTPheader)则直接加上数据块头
2) 如果消息大于 SMSS则先对用户消息拆分(分片)再对每一分片
加上数据块头。 www.docin.com 吉林大学硕士学位论文
18 加上数据块头的过程是
1) 指定流标识符
2) 指定流序列号保证流内有序
3) 指定 TSN保证可靠性。
生成数据块后再绑定控制块最终生成 SCTP 包发送到 IP[36]层
打成 IP 包。最后的包格式如图 2-16 所示。 图 2-16 带 SCTP 包的 IP 包格式 SCTP 打包规则把控制块放在
前其有高优先级数据块放在后并且在不大于 SMSS 的情况下绑定尽可能多的数据块。 数据块队列 绑定
SCTP 控制器
拆分应用层
SCTP 包
1
2
3 用户消息 将用户消息生成数据块 构成 SCTP 包 将 SCTP 包送至 IP 层
控制块队列 SCTP 层
IP 层
IP 包
1
2
3
图 2-15 SCTP 包的产生过程 www.docin.com 第二章 SCTP 概述
19 2.3.2 SCTP 包的接收过程
SCTP 包的接收过程如图 2-17 所示。SCTP 先对 SCTP 包的各个控制块
和数据块解绑定。有的数据块是被拆分后形成的因此需要重新装配成一
个完整的消息再送入流队列有的数据块则直接送入流队列。接收到数
据块后接收方以某些规则返回选择性证实。 2.3.3 SCTP 流量控制
流量控制的目的是保证传输高效、平稳。
先介绍一下两个重要窗口和一些变量。
拥塞窗口(Congestion windowCwnd)是由发送方维护并动态更新的一
个变量用于指出发送方可以向链路上注入多少数据量(以字节为单位)而
不至于引起拥塞且这个数据量是不需要证实的。如果接收方是多宿的
那么针对每个对端 IP 地址维护一个拥塞窗口。
接收窗口(Receiver WindowRwnd)用于指出数据接收方的当前 buffer
大小(以字节为单位)也由发送方维护和计算计算时依据接收方返回的
SACK 中的信息。
Outstanding它指示发端已向某一链路注入的数据量这些数据是未解绑定分组
重新装配解绑定的消息 向发送方回确认消息 Stream reordering queues 解绑定 SCTP 控制器 重新装配应
用层
SCTP 层 SCTP 包 1
2
3 用户消息
IP 包 IP 层
图 2-17 SCTP 包的接收过程
控制块 www.docin.com 吉林大学硕士学位论文
20 证实的。
流量控制遵循如下规则
1) 如果 Outstanding >= Cwnd发送方将不能发送新的数据。
2) 如果 Rwnd 表明接收方的 buffer 已没有剩余空间(即 Rwnd0) 发
送方就不能再发送数据。
但有一个例外即使 Rwnd0 只要 Cwnd 允许还可再发送一个数
据块。这个例外是为防止偶联出现死锁进而没法再传输数据。
发送了某一数据设数据量为 C则 Rwnd, Outstanding 的计算公式如
下。Rwnd’Outstanding’代表前一个 RwndOutstanding。
Rwnd Rwnd’C
Outstanding = Outsanding’ + C
3) 进行传输时发送方应优先传输发送队列中那些标记为重传的数据
块。有两种原因产生重传数据块。
a) 数据块已发送但一段时间内没有收到证实即定时器超时需
要重传
b) 有 4 次 SACK 证实此数据块丢失需要重传这种重传就是常说
的快速重传。
4) 无论 Cwnd 和 Rwnd 的值为多少如果下一个 TSN>231-1 发送方应
停止发送数据即 TSN 值在 0232 之间循环。
2.3.4 SCTP 证实规则
SCTP 执行的是选择证实规则[37]而 TCP 执行的是累积证实规则。选
择证实增加了协议复杂度但是提高了传输效率。尤其是在信道恶劣的无
线链路执行选择证实的传输效率远远高于执行累积证实的传输效率。
证实规则如下
1) 当端点向对端发送数据时应在其中绑定一个 SACK。
2) 收到 SCTP 包之后若没有要发送的 SCTP 包可用于携带 SACK
则接收方必须在一定时间内证实收到的数据块。SCTP 中推荐的延时是
200ms最多不能超过 500ms。
3) 如果端点连续收到两个携带数据块的 SCTP 包则接收方在收到第
二个 SCTP 包时立即证实。本规则用于防止端点在发送 SACK 之前累
积了太多没有证实的数据。 www.docin.com 第二章 SCTP 概述
21 4) 接收方为每个 SCTP 包只能发送一个 SACK。
5) 如果收到两个重复的数据块必须立即回复 SACK指明有某 TSN
重复。
6) 如果收到的数据块其 TSN 不连续接收方应立即回复带有间隔
证实(Gap ACK)的 SACK并且在 TSN 未恢复连续之前一直如此。
2.3.5 SCTP 拥塞控制
SCTP 的拥塞控制[38]类似于 TCP其基本思想是为了使数据发送方
可以协助进行拥塞控制首先需发送方能够发现或检测到网络何时发生拥
塞之后发送方需减缓或暂停向网络注入数据。这样有效地减少了网
络中的流量过载的路由器才有可能恢复。
拥塞控制算法的基本机制
1) 刚开始通过一条新的连接发送数据时从较慢的数据速率开始。这
是由于该连接可承受的数据吞吐量未知所以保守发送。
2) 只要没有数据丢失发送方逐渐增加数据发送速率即小心探询可
承受的数据吞吐量上限。
3) 一旦发现数据丢失发送方将之作为可能出现拥塞的标志因此马
上降低数据发送速率。
4) 如果数据丢失不再出现发送方将返回 2)再次逐渐增加发送速率。
在介绍拥塞控制的具体过程之前先介绍相关变量。
Cwnd拥塞窗口。2.3.3 节已介绍其初值为 2SMSS。
Ssthresh(Slow Start Threshold)慢启动门限。拥塞控制方式由慢启动
(SSSlow Start)转变为拥塞避免(Congestion Avoidance)的转折点。初始值
为 2MTU。
Pba(Partail Bytes Acknowledged)部分字节证实。SCTP 特有的用于
计算拥塞避免过程中 Cwnd 的增长。初始值为 0。
Outstanding2.3.3 节已介绍其初始值为 0。
拥塞控制机制分为四个阶段慢启动阶段拥塞避免阶段拥塞控制
阶段快速重传阶段。
1) 慢启动阶段(Cwnd<Ssthresh)收到 SACK 证实如果确认的数据量 www.docin.com 吉林大学硕士学位论

22 小于 PMTU则
Cwnd=Cwnd’+确认数据量
如果确认数据量大于 PMTU则
Cwnd=Cwnd’+PMTU。
注Cwnd’代表前一次的 Cwnd。
2) 拥塞避免阶段(Cwnd>ssthresth)收到 SACK 证实Pba 增加相应的
确认数据量如果 Pba 增加到大于 Cwnd则 Cwnd=Cwnd’+PMTU而 Pba
减少 Cwnd。
3) 拥塞控制阶段当某一数据块被证实丢失 4 次即进入拥塞控制阶
段。
Cwnd=max(2×MTUCwnd/2)
Ssthresh=Cwnd
4) 快速重传阶段某一数据块被证实丢失 4 次后被标记为重传数据
块在下一次发送 SCTP 包时该数据块优先被发送。因为没有到超时就
重传所以叫作快速重传。
除了上述四个阶段拥塞控制变量会发生变化还有下面几个事件也会
导致拥塞控制变量发生变化。
当路径空闲的时候每经过 Heartbeat 周期Cwnd 减为原来一半而
Ssthresh 不变。
当某一路径出现超时正在传输中的所有数据标记为重传
Ssthresh max(Cwnd/22×MTU)
Cwnd1×MTU 2.4 本章小结 本章介绍了 SCTP 的本质特性多流、多宿、安全等并与 TCP、UDP
进行比较。讲解了与主路径自动切换相关的几个块DATA 块、INIT 块、
SACK 块还有 HEARTBEAT 与 HEARTBEAT-ACK 块。探讨了数据包的
产生、接收和数据包的传输过程如流量控制、证实规则、拥塞控制。 www.docin.com 第三章 网络仿真工具
NS
23 第三章 网络仿真工具NS SCTP 主路径自动切换采用网络仿真进行研究。网络仿真技术具有以下
特点
1) 全新的模拟实验机理使其具有在高度复杂的网络环境下得到高可
信度结果的特点
2) 网络仿真的预测功能是其他任何方法都无法比拟的
3) 使用范围广, 既可以用于现有网络的优化和扩容也可以用于新网
络的设计而且特别适用于中大型网络的设计和优化
4) 初期应用成本不高, 而且建好的网络模型可以延续使用, 后期投资
还会不断下降。
网络仿真可以采用 NS[39]、OpenNet[40]、Matlab 这三种软件。NS 是一种
网络技术的源代码公开的、免费的软件模拟平台研究人员使用它可以很
容易地进行网络技术开发而且它所包含的模块已经非常丰富几乎涉及
到了网络技术的所有方面包括 2000 年诞生的 SCTP。所以NS 成了目前
学术界广泛使用的一种网络模拟软件。在每年国内外发表的有关网络技术
的学术论文中利用 NS 给出模拟结果的文章最多通过这种方法得出的研
究结果也是被学术界所普遍认可的此外NS 也可作为一种辅助教学的工
具已被广泛应用在了网络技术的教学方面。因此选择 NS 做仿真工具。 3.1 NS 介绍 NS(Network
Simulator)是一种面向对象的网络仿真器本质上是一个
离散事件模拟器。由 UC Berkeley 开发而成。它本身有一个虚拟时钟所
有的仿真都由离散事件驱动。目前 NS 可以用于仿真各种不同的 IP 网已
经实现的一些仿真有网络传输协议比如 SCTP、TCP 和 UDP业务源
流量产生器比如 FTPTelnetWeb CBR 和 VBR路由队列管理机制
比如 DroptailRED 和 CBQ路由算法比如 Dijkstra 等。NS 也为进行局
域网的仿真而实现了多播以及一些 MAC 子层协议。
NS 包含仿真事件调度器、网络组件对象库以及网络构建模型库等。事
件调度器计算仿真时间并且激活事件队列中的当前事件执行一些相关
的事件网络组件通过传递分组来相互通信但这并不耗费仿真时间。所
有需要花费仿真时间来处理分组的网络组件都必须要使用事件调度器。它
先为这个分组发出一个事件然后等待这个事件被调度回来之后才能做
下一步的处理工作。事件调度器的另一个用处就是计时。 www.docin.com 吉林大学硕士学位论文
243.1.1 NS 分裂对象模型
NS 是用 Otcl[41]和 C++编写的。这种设计出于效率与灵活的综合考虑。
模拟器有以下两种不同的事情要做
一方面具体协议的详细模拟和实现需要一种系统编程语言它能够
高效地操作字节、包头等数据结构能够实现合适的算法在大规模的数据
集合上进行操作而且这样的算法往往是需要不停地重复执行。对于这样
的任务来说运行速度是非常重要的而周转时间(运行模拟找 bug修
复 bug重编译重运行)就显得不那么重要了。
另一方面许多网络中的研究工作都是围绕着网络构件和环境的具体
参数进行的需要经常重新设置和修改模拟场景需要以较短的时间开发
出大量的场景。在这种情况下周转时间(改模型直到重新运行)就更重要
了。由于模拟场景只需要执行一次因此这部分任务的运行时间就不重要
了。
为了满足以上两种不同任务的需求NS 使用了 C++和 Otcl。C++运行
速度快是强制类型语言(进行了严格的数据类型检查)容易实现复杂的
数据类型容易实现精确的、复杂的算法但是修改、debug 和重新编译
所花费的时间要长一些因此 C++适合具体协议的实现。Otcl 运行速度比
较慢但是可以很方便地(并且交互地)修改不需要编译而且 Otcl 不是
强制类型的不容易出错。因此它适合做模拟配置。
为了进一步增强编程的灵活性提高程序的效率我们需要把 C++和
Otcl 结合起来使得 C++能直接调用 Otcl 解释器的功能Otcl 和 C++能够
相互直接操作对方定义的数据并且 C++的类和 Otcl 类对应起来。这种机
制叫做 TclCL。
NS 正是利用了 TclCL 建立起来的分裂对象模型形成了丰富的构件
库。通过这种机制NS 达到了模拟配置灵活和运行效率高的统一。
如图 3-1 所示分裂对象模型。构件的主要功能通常在 C++程序中实
现Otcl 中的类主要提供 C++对象面向用户的配置接口。
NS 中 C++中的类和 Otcl 中的类通常具有对应关系。C++和 Otcl 语言
都是面向对象的语言。两边的继承关系通常是一致的。每当实例化一个构
件时都会同时创建一个 Otcl 中的对象和一个对应的 C++对象并且两个
可以互相操作。图 3-2 给出了一对相关联的 Otcl 对象和 C++对象的例子。
在这个例子中当用户在 Otcl 脚本中通过“new Agent/SCTP”创建了一个
Otcl 对象_o123 时也相应地在 C++中创建了*sctp 对象。通过 Otcl 对象
_o123我们可以直接访问 C++对象*sctp 的数据成员以实现参数配置而 www.docin.com 第三章 网络仿真工
具NS
25 SCTP 的协议处理、数据传输和流控算法则是由 C++对象*sctp 的函数来实
现。我们可以称 Otcl 类为解释类C++类为编译类两者互为影像类。
图 3-1 分裂对象模型
图 3-2 Otcl 类和 C++类的对应关系 3.1.2 NS 网络仿真(模拟)一般过程
图 3-3 是利用 NS 网络仿真的一般过程。进行模拟前首先要分析模拟涉
及哪个层次。NS 模拟分两个层次
1) 基于 Otcl 编写的层次。利用 NS 已有网络元素实现模拟无需对 NS
本身进行任何修改只编写 Otcl 脚本
2) 基于 C++和 Otcl 编程的层次。如果 NS 中没有所需的网络元素就
需要对 NS 扩展添加所需要的网络元素或者修改网络元素。需要添加
新的 C++类和 Otcl 类然后再编写 Otcl 脚本。 www.docin.com 吉林大学硕士学位论文
26 图 3-3 利用 NS 网络仿真的一般过程 3.1.3 NS 构成
3.1.3.1 功能模块构成
NS 仿真器封装了许多功能模块最基本的是节点、链路、代理、数据
包格式等等下面分别来介绍各个模块。
1) 事件调度器目前 NS 提供了四种具有不同数据结构的调度器分别
是链表、堆、日历表和实时调度器。
2) 节点(node)是由 TclObject 对象组成的复合组件在 NS 中可以表
示端节点和路由器。
3) 链路(link)由多个组件复合而成用来连接网络节点。所有的链路
都以队列的形式来管理分组的到达、离开和丢弃。
4) 代理(agent)负责网络层分组的产生和接收也可以用在各个层次
的协议实现中。每个 agent 连接到一个网络节点上由该节点给它分配一
个端口号。
5) 包(packet)由头部和数据两部分组成。一般情况下packet 只有头
部、没有数据部分。
6) 无线模块无线模块是以 MobileNode 为基本核心的。主要包括工作
机制、路由机制和构造 MobileNode 的网络协议栈的各个网络构件。这些构
件主要包括信道、网络接口、无线信号传输模块、MAC 协议、接口队列、
链路层和地址解析协议。除了 MobileNode还有 MobileNode 的移动和业
务流场景文件。 www.docin.com 第三章 网络仿真工具NS
27 7) trace[42]文件trace 的功能是详细地记录模拟过程trace 可以根据用
户的需要记录模拟过程中的任何一个细节。
表 3-1 是 SCTP 主路径自动切换脚本运行后的 trace 文件。其中
事件有“r”“”“”三种。“r”代表接收事件“”
代表入队列事件“”代表出队列事件。
时间某一分组的动作时间。 表 3-1 trace 文件的部分截取 事件 时间

地址
目的
地址
协议
类型
大小



标识
源地
址与
端口
目的
地址
端口

数目
TSNuid SID SSN
r 0.700294 4 1 SCTP36I04.01.01-17 65535 65535
+ 0.700294 1 4 SCTP1500D01.04.011 8 0 0
- 0.700294 1 4 SCTP1500D01.04.011 8 0 0
r 0.752694 1 4 SCTP1500D01.04.011 8 0 0
r 0.755094 1 4 SCTP1500D11.04.012 9 0 1
+ 0.755094 1 4 SCTP48S04.01.012 10 65535 65535
+ 4.151256 4 1 SCTP56H04.01.01-11774 65535 65535 源地址目的地址通信两端点的 IP 地址。虽
然多宿主机有多个 IP 地
址但这里只显示该分组发送、接收有关的一个 IP 地址。
协议类型SCTP 的 trace 文件在该字段都是 SCTP。其它协议类型有
UDP,TCP 等。
大小分组字节大小。脚本规定 IP 包大小为 1500 字节所以载有 DATA
块的 IP 分组都是 1500 字节。但标志为“I”“S”“H”的分组大小不一
样。这大小取决于IP 头SCTP 公共头各种控制块大小。S 代表载有 SACK
的 IP 分组其大小为 48 字节因为 IP 头 20 字节SCTP 公共头 12 字节所以
SACK 块大小为 16 字节。
标志“I”代表偶联建立、关闭阶段的控制信息块“D”代表数据
块“S”代表 SACK 块“H”代表心跳块和心跳证实块。
源地址端口、目的地址端口这里显示了发送、接收某一分组的 IP 地
址和端口。
TSN数据块的传输序列号。一个 TSN 唯一标识 DATA 块。其用于数据
的可靠传输。因为非数据块没有 TSN所以非数据块的值为-1。 www.docin.com 吉林大学硕士学位论文
28SID流标识。
SSN流内序列号。其用于数据的有序传输。
3.1.3.2 软件构成
NS 包含 Tcl/Tk, OTcl, NSTclcl 这些软件。其中 Tcl 是一个开放脚本
语言用来对 NS 进行编程Tk 是 Tcl 的图形界面开发工具可帮助用户
在图形环境下开发图形界面OTcl 是基于 Tcl/Tk 的面向对象扩展有自己
的类层次结构NS 为本软件包的核心是面向对象的仿真器用 C++编写
以 OTcl 解释器作为前端Tclcl 则提供 NS 和 OTcl 的接口使对象和变量
出现在两种语言中。为了直观地观察和分析仿真结果NS 提供了可选的 X
graphy、可选件 Nam。Xgraphy 用于画图Nam 用于显示传输动画。 3.2 TCL 脚本编写规则 3.1 节讲述了解
释层是用 TCL 脚本来实现的。下面介绍一下普通的 TCL
脚本编写过程。
1) 创建事件调度(模拟对象实例)
一个事件调度跟踪仿真时间并且触发以特定时间间隔预定的可变事
件。它通过在特定时间触发可变网络单元来激发事件队列中的事件并且执
行适当的操作。
一个事件调度(模拟对象实例)由以下命令创建
set ns [new Simulator]
一个事件由下列命令来调度
$set at <time> <event>
其中<event>是任何合法的 ns/Tcl 命令。
调度由以下命令来开始
$ns run
2) 创建网络拓扑
除了源流量、接收到的流量和用于生成和传输数据的协议/应用代理
外节点、链路、路径和队列都构成网络拓扑的单元。
一个节点用以下命令创建
set n0 [$ns node] www.docin.com 第三章 网络仿真工具NS
29 一个全双工链路用以下命令创建
$ns duplex-link $n0 $n1 <bandwidth> <delay> <queue_type>
<bandwidth>和<delay>是全双工链路的带宽和时延参数。<queue_type>
是当它们沿着仿真的网络拓扑移动时放置、标记或丢弃包的一个队列对象
的表现。<queue_type>可以是下面的一种DropTail(FIFO 队列)FQ(Fair
Queueing objects)SFQ(Stochastic Fair Queueing)RED(Random Early
Detection)CBQ(Class-Based Queueing)等前面提到的每一种队列类型都
有它自己的特性。
3) 创建传输层代理
TCP/UDP/SCTP 代理均为传输层代理。通过配置不同的应用如 Ftp、
Http、Telnet 等都能在这些传输层代理上运行。在用户创建的 OTcl 代理
和 C++中这些对象的内部实现之间又有一个通信。在创建代理之后把这
些新代理附加到节点上实现初始化一个绑定。
例如一个 SCTP 代理由以下命令来创建
$set SCTP [new Agent/SCTP] #创建 SCTP 代理
$ns attach-agent $n0 $SCTP #绑定 SCTP 代理和节点 n0
通过产生一个新的 FTP 代理一个应用层如 FTP 就创建在了 SCTP 顶
部然后把它附加在以前步骤中创建的 SCTP 代理上。例如有
Set ftp [new Application/FTP] #创建应用 FTP 代理
$ftp attach-agent $SCTP #绑定 FTP 代理和 SCTP 代理
$ns at <time> “$ftp start” #在<time>开始 FTP 数据传输
4) 创建通信源
通过创建一个通信源代理并把它附加在一个传输层代理上来产生
CBR 或 VBR。命令如下
$Set cbr [new Application/Traffic/CBR] #创建 CBR 源流量
$cbr attach-agent $SCTP #绑定到传输层代理
$ns at <time> “$cbr start” #在<time>开始流量
5) 跟踪
所有需要被跟踪的具体的状态变量都由跟踪命令来指示
$SCTP trace Cwnd_
跟踪定传输层代理的 Cwnd 的值。
6) 创建 NAM www.docin.com 吉林大学硕士学位论文
30NAM 是和开始、暂停、停止数据流量选项一起用图形动态地显示网络
拓扑的。
通过仿真生成了一个带有 a.nam 扩展名的文件执行时产生图形显示。
节点、队列、流量和其他网络单元在图形中都能清楚地看到。
7) 创建 trace 文件
在跟踪所有变量或跟踪少数变量的机制里运行完仿真后生成了一
个扩展名为.tr 的跟踪文件。跟踪文件有一个特殊的格式代表了某个时间
事件发生的信息。它通常表明了发送的数据包的大小、源地址和目的地址、
包的序列号和在发端队列中或被收端收到的时间间隔。
set allchan [open all.tr w] #以写的方式打开某一个文件把文件句
#柄给 allchan。
$ns trace-all $allchan #用 trace-all 命令实施跟踪并把跟踪信息
#写入以 allchan 为句柄的 all.tr 文件。 3.3 NS 中的 SCTP 代理(Agent) NS2.27 版本及之后版本内置了
SCTP 代理[43]。SCTP 代理有很多新的变
量和命令。在这一节中介绍一下。
SCTP 代理是由美国特拉华大学协议工程实验室(PEL)为 NS 开发的。
SCTP 代理是双向代理即其是发端也是收端而且是均衡的。但是双向
数据通道并未实现。这里每个 SCTP 代理要么是发端要么是收端。
3.3.1 SCTP 代理的几个文件
SCTP 代理由几个文件组成sctp.cc, sctp.h; sctp-hbAfterRto.cc, sctp-hb-
AfterRto.h; sctp-mfrHbAfterRto.cc, sctp-mfrHbAfterRto.h; sctp-cmt.cc, sctp-
cmt.h; sctp-mfrTimestamp.cc, sctp-mfrTimestamp.h; sctp-multipleFastRtx.cc,
sctp-multipleFastRtx.h; sctp-timestamp.cc, sctp-timestamp.h。除了 sctp.cc
sctp.h 其它文件都是后续随着 SCTP 代理扩展而增加的文件。
sctp-hbAfterRto SCTP 代理主要功能是扩展了重传策略。当出现超时
时增加了重传到另外一条路径的策略并在原路径立即发送 Heartbeat 块。
sctp-multipleFastRtx SCTP 代理主要功能是当出现超时时力图使超时
次数最少。没有多次快速重传算法只能重传一次丢失块。如果所重传块 www.docin.com 第三章 网络仿真工具
NS
31 又丢失掉又一个超时时间后需要再重传丢失块这样降低了传输速率。
而多次快速重传算法在需要多次重传的时候允许相同丢失块多次重传。
sctp-cmt SCTP 代理主要功能是多路径同时进行传输这大大提高了路
径的利用效率是目前最高效的传输方式。
sctp-Timestamp SCTP 代理主要功能是在每一个包里加上了时间戳这
样利于收端区分原传输块和重传块。
sctp-mfrHbAfterRto SCTP 代理是组合了 sctp-multipleFastRtx 代理和
sctp-Timestamp 代理的功能。
sctp-mfrTimestamp SCTP 代理是组合了 sctp-multipleFastRtx 代理和
sctp-Timestamp 代理的功能。
3.3.2 SCTP 代理中的变量
SCTP 代理中有 TCL 变量。下面所描述的每个变量既是类变量也是实
例变量。改变类变量会改变所创造的代理的默认值也可理解为用此代理
创建的所有对象的值。改变实例变量只影响用此代理创建的某个对象的值。
举个例子
Agent/SCTP set pathMaxRetrans_ 5;
上面这条语句是改变类变量。以后所有新建 SCTP 代理的 pathMax-
Retrans_值都是 5。
$sctp set pathMaxRetrans_ 5 ;
上面这条语句只改变实例对象$sctp 的 pathMaxRetrans_值。
SCTP 代理的默认参数
Agent/SCTP set debugMask_ 0 #关闭组件调试控制的 32 位
Agent/SCTP set debugFileIndex_ -1 #调试输出文件输出到屏幕
Agent/SCTP set associationMaxRetrans_ 10 #偶联最大重传为 10 次
Agent/SCTP set pathMaxRetrans_ 5 #路径最大重传为 5 次
Agent/SCTP set changePrimaryThresh_ -1 #如果错误计数超出切换
#主路径
Agent/SCTP set maxInitRetransmits_ 8 #INIT 块最大重传为 8 次
Agent/SCTP set oneHeartBeatTimer_ 1 #每个目的地址都开启 HB
#定时器
Agent/SCTP set heartbeatInterval_ 2.5 #HB 间隔时间单位秒
Agent/SCTP set mtu_ 1500 #最大传输单元 1500
Agent/SCTP set initialRwnd_ 65536 #初始接收窗口 65536 www.docin.com 吉林大学硕士
学位论文
32Agent/SCTP set initialSsthresh_ 65536 #初始慢启动门限 65536
Agent/SCTP set initialCwnd_ 2 #初始拥塞窗口 2 个 SMSS
Agent/SCTP set initialRto_ 3.0 #初始 RTO 为 3.0 秒
Agent/SCTP set minRto_ 1.0 #最小 RTO 为 1.0 秒
Agent/SCTP set maxRto_ 60.0 #最大 RTO 为 1.0 秒
Agent/SCTP set fastRtxTrigger_ 4 #快速重传触发次数为 4 次
Agent/SCTP set numOutStream_ 1 #出流数为 1
Agent/SCTP set numUnrelStream_ 0 #部分可靠流的数目
Agent/SCTP set reliability_ 0 #所有部分可靠流的 k 算法
#重传值
Agent/SCTP set unordered_ 0 #确定是否按序
Agent/SCTP set ipHeaderSize_ 20 #IP 包头大小
Agent/SCTP set dataChunkSize_ 1468 #数据块大小
Agent/SCTP set useDelayedSacks_ 1 #开或关延迟 SACK 算法
Agent/SCTP set sackDelay_ 0.200 #RFC2960 推荐 200ms
Agent/SCTP set useMaxBurst_ 1 #开或关最大脉冲
Agent/SCTP set rtxToAlt_ 1 #重传到哪个地址[44]0 为同
#一地址1 为另外的地址
#2 为快速重传给同一地址
#超时重传给另外地址。 Agent/SCTP set
dormantAction_ 0 #0 为改变路径1 为采用主
#路径2 为采用最近使用的
#路径
Agent/SCTP set routeCalcDelay_ 0 #计算一个路由的时间
Agent/SCTP set routeCacheLifetime_ 1.2 #路由保留在缓存的时间为
#多少
Agent/SCTP set trace_all_ 0 #开或关 在 trace 文件中显
#示所有变量
debugMask_和 debugFileIndex_需要详细介绍一下。这两个变量是和
sctpDebug.h 与 sctpDebug.cc 紧密联系在一起的。
debugMask_是用于开启特定功能调试输出的掩码。不同的功能对应不
用的值。sctpDebug.h 有关于每一位的功能映射。1 用于开启所有调试0
用来关掉调试。
debugFileIndex_用于规定调试输出的文件名。每个 SCTP 代理实例都
可以独立输出 SCTP 调试信息到特定的文件。比如数据发端能把运行记
录输出到某个文件那收端把运行记录到另外一个文件。如果 www.docin.com 第三章 网络仿真工具NS
33 debugFileIndex_被置位为 0那输出文件命名为 debug.SctpAgent.0. 如果置
位为-1这个文件输出到 stderr。为避免冲突两个 SCTP 代理不能发送输
出到同一个文件。默认情况是-1。
如果启用这一功能那每一次脚本运行都能得到发端或收端的执行过
程输出文件。执行过程输出文件按时间顺序记录了每一个被调用的函数。
这样不用通过单步调试只通过看输出文件就能知道脚本的运行过程
非常方便一目了然。
注意ns 必须把针对这个选项的DDEBUG 一起编译才能工作。需
要在 makefile 文件的 CCOPTWall 这一行加 DDEBUG。即这一行应
是
CCOPTWall DDEBUG
重新编译 NS打开这项功能。
3.3.3 SCTP 代理中的命令
SCTP 代理中还有特定的命令这些命令能在 TCL 脚本中使用。
trace跟踪给定变量。当这些变量(和偶联信息)发生改变时每次都被
显示。比如 Trace 跟踪如下变量
Cwnd_ 跟踪所有路径上的 Cwnds
Rto_ 跟踪所有路径上的 RTO
errorCount_ 跟踪所有路径上的错误计数器
frCount_ 跟踪快速重传的次数
mfrCount_ 跟踪多径快速重传算法调用次数。这个变量只用于多径快
速重传扩展代理
timeoutCount_ 跟踪所有路径上超时总数
rcdCount_ 跟踪在所有路径上的路由计数时延总次数。
print提供跟踪的抽样方法。这个命令简单地显示了每个给定变量(偶
联信息)。该命令带一个上面所示变量的中任何一个参数。
set-multihome-core为多宿节点设置核心节点。带一个节点参数而
且一个 SCTP 代理只能设置一个。
multihome-add-interface给多宿节点增加一个接口。带两个节点变量。
变量 1 是多宿节点的核心节点。变量 2 是所添加的接口节点。所有接口的
加载必须在设置核心节点之后绑定 SCTP 代理之前。
multihome-attach-agent绑定 SCTP 代理到多宿节点。带 2 个参数。参 www.docin.com 吉林大学硕士学位
论文
34 数 1 是核心节点参数 2 是 SCTP 代理。
set-primary-destination设置对端的接口节点为主目的地址。带一个节
点参数。可选而且可以在每个端点设置超过 1 次。 如果不用此命令主
路径随机选择。
force-source设置包的出口节点。带 1 个节点参数。可选而且可以
在每个端点设置超过 1 次。如果不用此命令路由会自动选择包的发送源。 3.4 搭建 SCTP 传输网络 3.2 节介
绍了如何写一般的 TCL 代码3.3 节介绍了 SCTP 代理的一些
变量和命令现在可以写针对 SCTP 的脚本文件了。结合 SCTP 主路径自
动切换研究这一课题搭建某一 SCTP 传输网络编写如下脚本。

Trace set show_sctphdr_ 1

# 创建模拟对象
set ns [new Simulator]

#创建 nam 文件
set nf [open sctp.nam w]
$ns namtrace-all $nf

#创建名为 all.tr 的 trace 文件


set allchan [open all.tr w]
$ns trace-all $allchan

#建立一个名为 finish 的过程


proc finish {} {
global ns nf allchan

#设置路径变量
set PERL "/usr/bin/perl"
set USERHOME "/home/ns2302"
set NSHOME "$USERHOME/ns-allinone-2.30"
set XGRAPH "$NSHOME/bin/xgraph"
set SETFID "$NSHOME/ns-2.30/bin/set_flow_id" www.docin.com 第三章 网络仿真工具NS
35 set RAW2XG_SCTP "$NSHOME/ns-2.30/bin/raw2xg-sctp"
set GETRC "$NSHOME/ns-2.30/bin/getrc"

#清空缓存关闭 nam、trace 文件
$ns flush-trace
close $nf
close $allchan

#画出 if0 路径发送数据包与时间的关系图


exec $PERL $GETRC -s 1 -d 4 all.tr > all.tr.if0
exec $PERL $GETRC -s 4 -d 1 all.tr >> all.tr.if0
exec $PERL $SETFID -s all.tr.if0 | \
$PERL $RAW2XG_SCTP -A -q -t if0 >temp.rands.if0
exec $XGRAPH -bb -tk -nl -m -x time -y packets temp.rands.if0 &

#画出 if1 路径发送数据包与时间的关系图


exec $PERL $GETRC -s 2 -d 5 all.tr > all.tr.if1
exec $PERL $GETRC -s 5 -d 2 all.tr >> all.tr.if1
exec $PERL $SETFID -s all.tr.if1 | \
$PERL $RAW2XG_SCTP -A -q -t if1 > temp.rands.if1
exec $XGRAPH -bb -tk -m -x time -y packets temp.rands.if1 &

#画出偶联发送数据包与时间的关系图
exec $PERL $SETFID -s all.tr | \
$PERL $RAW2XG_SCTP -A -q -t all > temp.rands
exec $XGRAPH -bb -tk -m -x time -y packets temp.rands &

#执行 nam 动画
exec nam sctp.nam &
exit 0
}

#设置多宿节点 0
set host0_core [$ns node]
set host0_if0 [$ns node]
set host0_if1 [$ns node]
$host0_core color Red
$host0_if0 color Red www.docin.com 吉林大学硕士学位论文
36$host0_if1 color Red
$ns multihome-add-interface $host0_core $host0_if0
$ns multihome-add-interface $host0_core $host0_if1

#设置多宿节点 1
set host1_core [$ns node]
set host1_if0 [$ns node]
set host1_if1 [$ns node]
$host1_core color Blue
$host1_if0 color Blue
$host1_if1 color Blue
$ns multihome-add-interface $host1_core $host1_if0
$ns multihome-add-interface $host1_core $host1_if1

#设置$host0_if0 $host1_if0 之间的 if0 链路带宽、时延、排队类型


$ns duplex-link $host0_if0 $host1_if0 5Mb 50ms DropTail

#设置$host0_if1 $host1_if1 之间的 if0 链路带宽、时延、排队类型


$ns duplex-link $host0_if1 $host1_if1 5Mb 50ms DropTail

#提取 if0、if1 链路的句柄为更改路径的带宽、时延做准备


set link1 [$ns link $host0_if0 $host1_if0]
set dlink [$link1 link]
set link2 [$ns link $host1_if0 $host0_if0]
set dlink2 [$link2 link]

#创建某一个 SCTP 代理实例名字为 sctp0


set sctp0 [new Agent/SCTP]
$ns multihome-attach-agent $host0_core $sctp0
#sctp0 与核心节点绑定
$sctp0 set fid_ 0 #流标识符为 0
$sctp0 set debugMask_ -1 #打开所有调试信息
$sctp0 set debugFileIndex_ 0 #SCTP 调试信息输出到文件
# debug.SctpAgent.0
$sctp0 set mtu_ 1500 #最大传输单元为 1500
$sctp0 set dataChunksSize_ 1468 #SMSS 为 1468
$sctp0 set numOutStreams_ 1 #定义 1 条流
$sctp0 set oneHeartbeatTimer_ 1 #打开 Heartbeat 开关 www.docin.com 第三章 网络仿真工具
NS
37 $sctp0 set heartbeatInterval_ 2.5 #HeartbeatInterval 时间为 2.5 秒

#打开 SCTP 特有的跟踪文件


set trace_ch [open trace.sctp w]
$sctp0 set trace_all_ 1 #trace them all on oneline
#创建创建某一个 SCTP 代理实例名字为 sctp1
set sctp1 [new Agent/SCTP]
$ns multihome-attach-agent $host1_core $sctp1
#sctp0 与核心节点绑定
$sctp1 set debugMask_ -1
$sctp1 set debugFileIndex_ 1 #SCTP 调试信息输出到文件是
#debug.SctpAgent.1
$sctp1 set mtu_ 1500
$sctp1 set initialRwnd_ 131072 #初始接收窗口为 131072
$sctp1 set useDelayedSacks_ 1 #采用延迟证实
$sctp1 set heartbeatInterval_ 2.5

#给两个 SCTP 代理实例设置不同的颜色


$ns color 0 Red
$ns color 1 Blue

#将 sctp0 sctp1 两个代理连接起来


$ns connect $sctp0 $sctp1

#把应用层 ftp0 绑定到 sctp0


set ftp0 [new Application/FTP]
$ftp0 attach-agent $sctp0

#在关联建立前设置主传输地址
$sctp0 set-primary-destination $host1_if0

#告诉 Simulator 模拟对象在 0.5 秒时启动


$ns at 0.5 "$ftp0 start"

#告诉 Simulator 在 5.0 秒时改变路径 if0 的时延和带宽


$ns at 5.00 "$dlink set bandwidth_ 1M "
$ns at 5.00 "$dlink set delay_ 200ms" www.docin.com 吉林大学硕士学位论文
38$ns at 5.00 "$dlink2 set bandwidth_ 1M "
$ns at 5.00 "$dlink2 set delay_ 200ms"

#告诉 Simulator 在 8.0 秒时调用 finish 过程


$ns at 8.0 "finish"

#开始模拟
$ns run
上面这个脚本文件是后面几章研究 SCTP 主路径自动切换的脚本文
件。所有的仿真实验都用到此脚本(除了改变 finish其它都一样)。需要特
别注意的有两点
1) 设置多宿节点
NS 刚诞生的时候没有多宿节点的概念设置多宿节点命令是后来增
加的。它要求先创建多个节点然后选中某一节点为核心节点再通过命
令把其它接口节点一一绑定到核心节点上。其中真正发送数据的是接口节
点而非核心节点。
2) 更改路径的时延、带宽
更改路径时延、带宽不能采用嵌套的方式比如
$ns at 5.0 “$ns duplex-link $host0_if0 $host1_if0 5Mb 50ms DropTail”
这种方式看似可以但实际根本没有改变路径时延、带宽。经过进一
步研究发现应按下面方式设置。
set link1 [$ns link $host0_if0 $host1_if0] #调用了方法 link 获得了一条
#特定的从 host0_if0 到
#host1_if0 的链路。
set dlink [$link1 link] #通过 link 获取 link1 的延时
#链路句柄 dlink只有获得了
#这个句柄才能更改链路带
#宽时延。
在 NS 里从 host0_if0 到 host1_if0 的链路和从 host1_if0 到 host0_if0
的链路是不同的。要使得往返时延、带宽同时变化需要同时设置 host0_if0
到 host1_if0 与 host1_if0 到 host0_if0 的时延、带宽。然后采用如下语句就
能更改时延、带宽了。
$ns at 5.00 "$dlink set bandwidth_ 1M " www.docin.com 第三章 网络仿真工具NS
39 $ns at 5.00 "$dlink set delay_ 200ms"
$ns at 5.00 "$dlink2 set bandwidth_ 1M "
$ns at 5.00 "$dlink2 set delay_ 200ms"
该脚本文件的内容是创建一个发端一个收端发端发送 FTP 数据。
发端与收端之间有两条路径。这两条路径的初始带宽都是 5M时延都是
50ms。主路径是 host0_if0 到 host1_if0 的 if0 路径。在 5.0 秒时刻host0_if0
到 host1_if0 的 if0 路径传输性能恶化带宽降为 1M时延变为 200ms。
如果 SCTP 没有主路径自动切换功能那么在 5.0 秒之后主路径还
是传输性能恶化的 if0 路径显然传输速率没很好的发挥。
如果 SCTP 具备了主路径自动切换功能那么经过一次心跳之后提
取了辅助路径 if1 的 RTT 值发现辅助路径的时延比当前主路径 if0 小
SCTP 就把主路径切换到路径 if1 上路径 if1 变成了主路径而 if0 变为了
辅助路径。这样 SCTP 充分发挥了最佳传输速率。 3.5 NS 的安装与编译 3.5.1 安装 NS
本文选用 ns-2.30[45]版本的 NS安装在 Linux 系统下。 1) 下载 ns-allinone-2.30.tar.gz.
2) 解压缩 tar xzvf ns-allinone-2.30.tar.gz
3) 进入 ns-allinone-2.30 文件夹执行 ./install
4) 安装结束后根据安装结果提示在当前用户的.bashrc 文件下修改
3 个环境变量PATH、LD_LIBRARY_PATH 和 TCL_LIBRARY
5) 注销用户再登录用户环境变量读入内存NS 就可以执行了。
3.5.2 编译 NS
SCTP 主路径自动切换研究需要修改 C++代码。修改之后需要重新编
译 NS。在 ns-2.30 路径下进行编译编译的步骤是
make clean #删除原先 NS 里所有的旧的目标文件、可执行文件
make #重新编译 www.docin.com 吉林大学硕士学位论文
40 先执行 make clean 是为了更彻底的编译。
Linux 系统下有一个很好的调试工具gdb。它能满足开发人员对代码
调试的需求。gdb 也能调试 NS但是需要在 makefile 文件里添加-g 参数。
3.3.2 节里讲到 debugMask_和 debugFileIndex_两个变量打开调试信
息功能的前提是 makefile 文件里添加-DDEBUG 参数。
这两个参数都是在 makefile 文件里的 CCOPT=Wall 后添加。修改之
后应是
CCOPT = -Wall -g -DDEBUG
然后重新编译。
注意当在 makefile 文件的 CCOPT 行中加上DDEBUG 参数后重
新编译时系统会提示在 ns-2.30 文件夹下 mobil1e 文件夹的某一文件出错。
因为该文件和 SCTP 模拟没有关系直接把那文件的错误行注释掉再编
译就成功了。 3.6 本章小结 本章介绍了 NS 分裂对象模型特性与构成并讲解了在 NS 环境下仿真
实验的两个层次。探讨了 NS 中的 SCTP 代理的特点、变量、命令并编
写了第五、六、七章所用的 SCTP 传输网络的脚本文件。最后介绍如何安
装、编译 NS 及需要注意的地方比如为了能够打开 SCTP 的调试信息
需要在 makefile 文件 CCOPT 这一行添加-DDEBUG 参数。 www.docin.com 第四章 SCTP 的 C++代码分析
41 第四章 SCTP 的 C++代码分析 本章分析 SCTP 的 C++代码。分析代码首先需要对 SCTP 协议深入了
解其次要学会使用工具[46]。浏览代码可以用 SourceInsight此软件能方便快捷地找到变量、函数的声明
和定义。然后使用调试工具如 gdb认
识代码的执行过程。SCTP 代码本身带了很多调试信息这对快速理解代
码非常有帮助。在脚本文件中只要把调试信息开关全打开那么在脚本
执行过程中NS 把所调用的每一个 SCTP 的函数及其关键变量按时间顺序
输出到某一文件。我们称此为 SCTP 调试信息。这些 SCTP 调试信息静态
地反映了函数的执行过程让开发者从单步调试中解放出来有更多的精
力研究核心问题。
SCTP 主路径自动切换是数据传输过程中的问题。下面着重分析几个
重要函数来展现 SCTP 的数据传输过程。 4.1 Recv() Recv()是 SCTP 的接收函数其在 SCTP 数据传输
中起到很大的作用
甚至可以部分反映 SCTP 传输的特点。这一节介绍 Recv()函数。
Recv()对一个 ip 包进行处理。首先剥去 ip 包头信息提取数据部分
这些数据就是 SCTP 的数据块或者控制块。Recv()的流程图如图 4-1 所示。 4.2 ProcessChunk()
ProcessChunk()处理拆分好的块(Chunk)在 recv()中已经将 ip 包中
的数据拆分成 SCTP 定义的 Chunk 类型根据 chunk 类型的不同调用相
应的函数进行处理。
调用相应的函数处理不同类型 Chunk 前之前需要判断 SCTP 处于什
么状态。SCTP 有 9 个状态CLOSED、COOKIE_WAIT、COOKIE_ECHOED、
ESTABLISHED、UNINITIALIZED、SHUTDOWN_ SENT、SHUTDOWN_
RECEIVED、SHUTDOWN_ACK_SENT、SHUT- DOWN_PENDING.。2.30
版的 NS 实现了建立偶联的状态机而没有实现关闭关联的状态机。图 4-2
是 ProcessChunk()处理各种状态下的流程图。 www.docin.com 吉林大学硕士学位论文
42
图 4-1 Recv()流程图 9 个状态中ESTABLISHED 状态在数据传输中最重要的。下面分析 www.docin.com 第
四章 SCTP 的 C++代码分析
43 ESTABLISHED 状态下的数据块处理。在此状态下ProcessChunk()块能处
理 DATA、SACK、FORWARD_TSN、HEARTBEAT、HEARTBEAT_ACK
等等数据块如其流程图如图 4-3 所示。 查看关联状态 eState 值调用
SCTP_STATE_COOKIE_ECHOED
状态处理模块
调用
SCTP_STATE_COOKIE_WAIT
状态处理模块
调用
SCTP_STATE_CLOSED
状态处理模块
调用
SCTP_STATE_ESTABLISHED
状态处理模块
返回准备发送的数据的大小开始
结束
图 4-2 在不同状态下 ProcessChunk()处理流程图 4.3 ProcessDataChunk() 如果接收到的是 Data
Chunk那么 ProcessChunk()调用 ProcessData-
Chunk()。ProcessDataChunk()流程图如图 4-4 所示。此函数先更新所接收到
的最高 TSN再为发送 SACK 更新 Block 与累积证实值如果数据要求有
序则先排序后再递交到高层用户否则直接递交到高层用户。 www.docin.com 吉林大学硕士学位论文
44 查看 chunk 的类型
处理延时 SACK 消息
调用
ProcessDataChunk()
收到的 TSN 块
列表长度大于 0 
iDataPktCountSince-
LastSack = 0
opSackGenTimer-
>force_cancel();
eSackChunkNeeded
=TRUE


调用 ProcessSack-
Chunk()
uiAdvancedPeerAckPoint
> uiCumAckPoint
eSendNewData-
Chunks=TRUE
eForwardTsn-
Needed=TRUE
调用 ProcessForward-
TsnChunk()
生成 SCTP_CHUNK-
_HB_ACK 消息
加上 HB 相关信息
更新下一个 chunk
的位置
调用 ProcessHeartbeat-
AckChunk()
输出这是当前
不能处理的类型
输出这是当前
不能处理的类型
调用
ProcessCookie-
EchoChunk()
生成
SCTP_CHUNK_
COOKIE_ACK
更新下一个 chunk
的位置
输出这是当前
不能处理的类型
调用 Process-
OptionChunk()


结束
开始图 4-3 在 ESTABLISHED 状态下ProcessChunk()处理流程图

图 4-4 ProcessDataChunk()流程图 www.docin.com 第四章 SCTP 的 C++代码分析


45 4.4 UpdateRecvTsnBlocks() ProcessDataChunk()流程里调用了 UpdateRecvTsnBlocks()它体
现了
SCTP 数据传输的选择证实特性。SCTP 的选择证实机制是固有的不像
TCP 是选加的这大大提高 SCTP 的传输性能尤其提高了在恶劣的无线
信道下传输的性能。
因为收到的 Chunk 可能不连续而 SCTP 协议又是选择性证实这使
得收端要向发端发送各种不连续 SACK。各种不连续情况很复杂总结归
纳最少有 8 种情况。接收到的任何 chunk 的处理方式都是这 8 种或这 8
种之间的相互组合。
为更好地分析这 8 种情况用举例方式来说明。下面例子中新接收
到的 Chunk 用竖粗实线(红色)表示已接收到的 Chunk 用横粗实线(黑色)
表示并表明了 Chunk 的传输序列号(TSN)。在新接收 Chunk 前假定累
积证实值(CumAck)为 10。两横粗实线间的虚线是空隙表示该 Chunk 没
有收到而出现不连续。不连续的 Chunk 为 Block(如图 4-5 TSN=13,14 的
Chunk)Block 可以是 1 个 Chunk(如图 4-6 Block 为 TSN=14 的 Chunk)也
可以是多个紧挨着的 Chunk(如图 4-5 Block 为 TSN=13,14 的 Chunk)。
第1种
图 4-5 空隙 > 1 时 新接收 Chunk 挨着 Block 左边的更新图 第 2 种
图 4-6 空隙 > 1 时 新接收 Chunk 挨着 CumAck 的更新图 第 3 种
图 4-7 空隙 > 1 且非在第一个空隙里时新接收 Chunk 挨着 Block 右边的更新图 www.docin.com 吉林大学
硕士学位论文
46 第 4 种
图 4-8 空隙 > 1 新接收 Chunk 独立成为 Block 时的更新图 第 5 种
图 4-9 空隙 = 1 新接收 Chunk 刚好填补上空隙的更新图 第 6 种
图 4-10 空隙1 新接收 Chunk 填补空隙把两个 Block 连成一个 Block 的更新图 第 7 种
图 4-11 正常接收 Chunk 的更新图 第 8 种
图 4-12 新接收的 Chunk 独自产生 block 的更新图 图 4-13 是 UpdateRecvTsnBlock()函数的流程图。图
中的 1 到 8 这 8 个
方框与上述 8 幅更新图一一对应。
UpdateRecvTsnBlock()流程可以分为 3 大块。
第一块循环查找所有的 Block若新接收到的 Chunk 与 Block 有关www.docin.com 第四章 SCTP 的 C++代
码分析
47 则 TSN 序先暂存。循环终止条件是已查找完所有 Block。
第二块循环结束若正常接收则 CumAck 增 1。
第三块循环结束若仍是非正常接收则新建暂存空间 Block存
储该 Chunk.。
UpdateRecvTsnBlock()的设计思想是正常连续接收的情况下每接收
到的 Chunk 会使得 CumAck 值增 1若收到不连续的 Chunk那么收端要
为 Chunk 创建存储空间即为 Block然后把非正常接收的 Chunk 在 Block
里按 TSN 顺序存储好。 UpdateRecvTsnBlocks()入口有无 Block

新接收 TSN
是否在空隙内
空隙是否大于 1


23
是否在
第一空隙中


14
是否在
第一空隙中
56


扩展 Block 中的 chunk 数
是否
正常接收
78
出口
是否

指向
下一个 Block

否 图 4-13 UpdateRecvTsnBlock()流程图 www.docin.com 吉林大学硕士学位论文
484.5 ProcessSackChunk() 如果接收到的是 SACK 块那么 ProcessChunk()调用 ProcessSack-
Chunk()如图 4-14 所示。此函数根据 SACK实现清除缓存中已证实数据
块更新 RTT调整拥塞窗口重启定时器计算 Outstanding 值的功能。
图 4-14 ProcessSackChunk()流程图 4.6 本章小结 本章分析了与数据传输相关的几个重要函数如
Recv(), Process-
Chunk(), ProcessDataChunk(), UpdateRecvTsnBlocks(), ProcessSackChunk()。
www.docin.com 第五章 基本主路径自动切换方案
49 第五章 基本主路径自动切换方案 明白了 SCTP 协议学会了 NS 仿真工具及 SCTP 特有命令分析了
SCTP 的重要 C++源代码现在进入 SCTP 主路径自动切换设计并实现章节。 5.1 方案一基本主路径自动切换
机制 因为 SCTP 的多宿特性一个偶联(Association)里可以有多条传输路径。在偶联建立完成时偶联就已
确定好初始传输路径(Primary Path)。在偶联
建立到偶联关闭整个传输过程中除非初始路径发生故障[47](Failure)否则
数据传输都在这条初始路径上完成所以初始路径又称做主路径。除主路
径外的其余路径都是辅助路径用于网络级容错[48]快速重传提高偶联
的健壮性、可靠性。
如果主路径时延不是最小的辅助路径的时延低于主路径时延这样
就没有发挥出偶联的最大传输速率。为提高协议性能需要主路径自动切
换到时延最低的路径上即基本主路径自动切换机制记为方案一。
基本主路径自动切换基于 SCTP 特有的 Heartbeat 机制。Heartbeat 机制
是 SCTP 发端在每一条传输路径上每隔一段时间发送 Heartbeat 块收端收
到后立即发回 Heartbeat-ACK 块。发端根据收到 Heartbeat-ACK 块提取
这条路径的往返时延RTT。用 Heartbeat 测量的 RTT 与当前主路径的 RTT
进行比较如果主路径上的 RTT 小则正常传输如果辅助路径的 RTT
小则主路径切换到最小 RTT 的辅助路径上。
上述思想可以用图 5-1 流程图来表示。
从偶联建立到偶联关闭发送 Heartbeat 块是一个死循环。其由定时器
发出中断后执行发送 Heartbeat 块。发送 Heartbeat 块的间隔时间为 2.5 秒左
右严格地说时间间隔是 2.5+RTO 之间的任何一个时间即围绕着 2.5 秒
前后波动。Heartbeat 块里有发送时刻的时间当发端收到 Heartbeat-Ack
时能提取出发送时间并用当前时间减去发送时间得到 RTT。
5.1.1 主路径切换的 3 个步骤
从图 5-1 可以看出切换路径的 3 个步骤
1) 遍历 sDestList 列表记录最小 RTT www.docin.com 吉林大学硕士学位论文
50sDestList 列表是全局变量存储着多个 SctpDest_S 结构体变量
SctpDest_S 的成员变量有对端 IP 地址、端口、拥塞窗口、dRto、dSrtt、dRttVar
等。通过遍历 sDestList记录最小 RTT。
图 5-1 基本主路径自动切换流程图 2) 判断最小 RTT 是否为当前主路径的 RTT
如果主路径时延不是最小的说明主路径不是最优的。主路径应当切
换到最小时延的那条路径上。
3) 如果切换则调用 SetPrimary()
这 3 个步骤实现了基本主路径自动切换。 www.docin.com 第五章 基本主路径自动切换方案
51 5.1.2 RttUpdate()修改
基本主路径自动切换的 3 个步骤被添加到 RttUpdate()里。在介绍 Rtt-
Update()之前先介绍 RFC2960 里对计算 RTORTT 的规则。
规则如下
1) 当第一个 RTT 测量包被发送之后则设置 RTO 为协议参数
RTO.Initial。
2) 当第一个 RTT 测量 R 被得到后则设定
SRTTR (5-1)
RTTVAR=R/2 (5-2)
RTO=SRTT+4×RTTVAR (5-3)
3) 如果得到一个新的 RTT 测量 R’则设定
RTTVAR=(1RTO.Beta)×RTTVAR+RTO.Beta×|SRTT-R’| (5-4)
SRTT=(1RTO.Alpha)×SRTT+RTO.Alpha×R’ (5-5)
RTO=SRTT+4×RTTVAR (5-6)
注公式(5-4)中的 SRTT 值应当是公式(5-5)SRTT 更新之前的值。
SRTT(smooth round trip time)是平滑 RTT在路径时延变化很快或
振荡的时候起到平稳作用。RTO (round time out)是往返超时。
RTO.Beta 为 0.25。RTO.Alpha 为 0.125。
4) 如果数据正在传送中则允许使用下面的规则 5)新的 RTT 的测
量必须针对每个往返传输进行。此外针对给定目的地址往返时
延内新 RTT 测量不应大于一次。这里有两个原因第一在实际
中过于频繁的测量并不会带来明显的好处第二如果测量过于
频繁规则 3 中的 RTO.Alpha 和 RTO.Beta 需要进行调整这样
SRTT 和 RTTVAR 也要相同的速率进行调整(根据进行的往返时延
测试次数反映取值)而规则 3)中用到的 RTO.Alpha 和 RTO.Beta
只根据一次往返时延测试。
5) Karn’s 算法RTT 测量不使用重发的分组来进行。
6) 在计算 RTO 时如果 RTO 计算结果小于 RTO.Min那么把置为
RTO.Min。使用这个的原因是为了避免 RTO 过低而带来的不必要
的超时。RTO.Min 是 1 秒。
7) 如果 RTO 计算结果大于 RTO.Max那么 RTO 置为 RTO.Max。
RTO.Max 为 60 秒。
经过修改后的 RttUpdate()流程图如图 5-2 所示虚框部分为添加内容www.docin.com 吉林大学硕士学位
论文
52 是路径切换的 3 个步骤。 RttUpdate()入口计算新 RTT 规则三
规则二是否规则六
规则七
遍历 sDestList 列表
记录最小 RTT
是否
第一次测量最小 RTT 是否为
当前主路径 RTT 调用 SetPrimary()切换路径否 RttUpdate()出口是 图 5-2 RttUpdate()流程图 图 5-2 的
规则二、三、六、七即为上面所介绍的 RFC2960 里规定的规
则 2)、3)、6)、7)。
通过这 3 步骤发端就可以每隔一个心跳周期寻找最优路径把主路
径切换到最优路径最大限度地发挥偶联传输速率。 www.docin.com 第五章 基本主路径自动切换方案
53 5.2 NS 仿真实现 根据 5.1 所设计的方案一修改 SCTP 代码再重新编译 NS并运行
3.4 节 TCL 脚本。
图 5-3 SCTP 传输网络 图 5-3 是 SCTP 在 NS 仿真实现的 NAM(模拟传输动画)截图。节点 0、
1、2 合起来是一个发端节点 3、4、5 合起来是一个收端。0 是核心节点
1、2 是接口即该端点两个 IP 地址3 也是核心节点4、5 也是接口
也即该端点的两个 IP 地址。1 和 4 路径命名为 if02 和 5 路径命名为 if1。
在 SCTP 传输过程中数据只能从接口发或收不能直接从核心节点发或
收。
该脚本规定应用层传输 FTP 数据在 0.5 秒后开始传输在第 5 秒
前路径 if0、if1 的带宽为 5M时延为 50 毫秒在第 5 秒路径 if0 性能
恶化带宽变成 1M时延变为 200 毫秒在第 8 秒传输结束。
图 5-3 也是偶联建立后刚开始传输第一次数据的截图处于慢启动阶
段。图中可以看到第一次传输只能传 2 个 SMSS可以理解为两个数据包。
这是由拥塞控制机制决定的初始拥塞窗口为 2 个 SMSS。
图 5-4图 5-5图 5-6 是 3 个典型时间点 NAM 截图。
图 5-4 说明在 4.7 秒时刻 1~4 路径上充满了连续的数据包这是因为在
慢启动和拥塞避免阶段拥塞窗口一直在增大这样发端一次能向网络发
送的数据也变多。
www.docin.com 吉林大学硕士学位论文
54 图 5-4 第 4.7 秒的传输截图

图 5-5 第 5.0 秒的传输截图 图 5-6 第 6.0 秒的传输截图 www.docin.com 第五章 基本主路径自动切换


方案
55 如图 5-5 所示在第 5.029 秒时刻 1~4 路径上靠近收端的 4 接口的数据
包是连续的而靠近发端的 1 接口的数据包是不连续的。连续的数据包是
在第 5 秒前发送的不连续的数据包是第 5 秒后发送的。在第 5 秒时刻
路径 if0 带宽从 5M 变为 1M时延从 50ms 变为 200ms第 5 秒后IP 数
据包在队列里的排队时间变长了那出队列就不再连续了。
如图 5-6 所示在第 6.1039 秒不但 1~4 路径上在传输数据而且 2~5
路径也开始传输数据了。由于新路径的拥塞窗口为 2SMSS所以一开始只
发送了 2 个数据包。
TCL 脚本规定第 5 秒时刻路径 if0 的带宽时延变化为什么是在第 6
秒时刻新路径才传输数据呢这和 Heartbeat 块发送时间有关系的。因为
Heartbeat 块发送是有一定间隔的不是每时每刻都有。根据 trace 文件可知
在第 5 秒后第一个 Heartbeat 块的发送时间是在 5.87 秒。当 Heartbeat-ACK
返回到发端发端提取 RTT进而比较再切换路径时间就在 6 秒左右。 5.3 路径切换的特点 图 5-7 为方案
一的路径 if0 传输数据包与时间关系图。图中有上(红色)、
中(绿色)、下(蓝色)三条线。上线(红色)代表 SCTP 把数据包发送到缓存
即入队列中线(绿色)代表数据包从缓存注入到网络即出队列下线(蓝
色)代表数据包从收端反馈回来的证实 SACK。纵坐标代表所发送的数据
图 5-7 路径 if0 数据包与时间关系图 www.docin.com 吉林大学硕士学位论文
56 包序列号横坐标代表时间斜率指示传输速率(下面类似图的信息也是这
样的)。在第 5 秒带宽和时延发生变化路径性能变差所以第 5 秒后的
斜率小于第 5 秒前的斜率即第 5 秒后的传输速率小于第 5 秒前的传输速
率。
图 5-8 为方案一的路径 if1 传输数据包与时间的关系图。If1 在第 6 秒
左右开始传输数据包。在 6.0 至 6.2 之间发送了第 1640 及以上的数据包
但是过了 6.2 秒之后又退回到重发第 1600 左右的数据包。
图 5-8 路径 if1 数据包与时间的关系图 为什么会重发呢这要结合 trace 文件 all.tr 一起分析。根据
all.tr 文件
的信息画出在路径切换周期数据包发送时序图如图 5-9 所示。
在图 5-9 中中间两条竖线代表发端的两个接口(IP 地址)外面两条
竖线代表收端的两个接口(IP 地址)T6.041 表示在 6.041 秒这一时刻
D1595表示 TSN=1595 的数据包(这里的数据包和数据块等同因为 NS
的 SCTP 代码只支持一个数据包带一个数据块下同)S1595(1643)表示
SACK 块其累积证实值为 1595收到的数据包序列号的最高值为 1643
图中接口 4 与接口 5 之间的长虚线特别需要注意它表示收端的 IP 地址 4
收到某一数据包从而更新了收端接收缓存内的数据在路径 if0(4~1)和路
径 if1(5~2)路径上都发送了同样的 SACK。图 5-9 只是把部分而非全部数据
包传输情况显示在图上但这部分数据已足够显示路径切换时的特点。 www.docin.com 第五章 基本主路径自
动切换方案
57
图 5-9 方案一路径切换周期数据包发送时序图
根据图 5-8 和图 5-9在 5.990 秒至 6.200 秒之间if1 发送了 4 个包
(1643~1646)分两次发送。在第 5.990 秒由于新路径初始拥塞窗口为
2SMSS发端发送了 2 个数据包(TSN=1643、1644)。收端在第 6.042 秒收
到这两数据包发现当前的累积证实值是 1595认为 TSN 为 1595~1642
的数据包丢失立即返回两个 SACK 通知发端。发端在第 6.093 秒收到
SACK 证实拥塞窗口变为 3SMSS。两个 SACK 都报告 TSN 为 1595~1642
的数据包丢失由于丢失报告次数没有达到四次所以发端没有重传这些
数据包。发端根据当前拥塞窗口为 3SMSS发送了 3 个数据包。再一个往
返后发端在第 6.200 秒收到了第四个带有丢失报告的 SACK(从接口 5 到
接口 2 的粗虚线表示导致发端重发数据包的第四个 SACK)然后根据当前
拥塞窗口和 Outstanding 立即重发丢失数据包。在新路径发端从发送 TSN
1643 数据包到重发 TSN=1604 的数据包数据包的序列号变小了所以
在 6.200 秒左右图 5-8 中的曲线突然向下坠落。 www.docin.com 吉林大学硕士学位论文
58 由此可以得出基本主路径自动切换存在着多余重传问题而且它对提
高传输速率起到反作用的。
上述是重发数据包的过程。重发的根本原因是 if1 的时延小于 if0 的时
延在时延大的 if0 路径上先发的包后到而时延小的 if1 路径上后发
的包先到。
然而事实上发端并非重发了所有的 1604~1642 数据包。因为 1604~1642
数据包都是在 5.990 秒之前就已经进入旧路径 if0 的发送缓存处于排队状
态5.990 秒之后它们仍旧陆续出队列被发送到收端。从图 5-9 中可以
看到因为在 6.248 秒之前收端已经在 if0 路径上收到了第 1612 个及之
前的数据包所以收端发送的 SACK 的累积证实值一下子从 1606 跃迁
到 1612。在路径切换阶段内累积证实值出现了 4 次跃迁。
直到 6.707 秒所有的重传都已完成切换阶段结束之后所有新数
据都在新路径上传输。 5.4 基本主路径自动切换结论 上述是根据在实现基本主路径自动切换的 SCTP 下执行
3.4 节脚本文
件所得到数据而得。同样的脚本文件在未改进的 SCTP 下执行得到相关
数据。进而两者进行比较。本文把未改进的 SCTP 记为未改进方案。
从 trace 文件中可以得到如下数据
1) 8 秒内未改进方案收端共收到 1758 个包方案一收端共收到 1996
个包。传输分组数目提高 13.5%。因为传输时间长度相同所以传输速率
也提高 13.5。
2) 5.990 秒到 8 秒这段时间未改进方案收端共收到 168 个
(TSN=1591~1758)数据包方案一收端收到 406 个(TSN=1591~1996)数据包
是未改进方案的 2.42 倍。
显然传输速率有很大提高这是方案一的优点。但是方案一也存在着
多余重传的问题这是它的劣势。 5.5 本章小结 本章针对主路径时延并非最小的问题提出基本主路径自
动切换机制
并给出相应算法。这算法通过 3 个步骤实现被嵌入到 RttUpdate()里。编
译修改后的 SCTP 代码仿真实验实现了基本主路径自动切换。方案一的 www.docin.com 第五章 基本主路径自
动切换方案
59 传输速率比未改进方案的传输速率有提高。但是通过分析路径切换时的
特点发现切换后存在着多余重传问题。在路径切换初始阶段这问题消
耗了路径切换所带来的优势降低了传输速率。基本路径自动切换的 SCTP
传输速率仍有较大提高空间待第六章进一步改进、提高。 www.docin.comwww.docin.com 第六章 进一步改
进方案
61 第六章 进一步改进方案 6.1 方案二避免多余重传机制 6.1.1 避免多余重传机制的设计
在第五章的研究中发现主路径自动切换后带来了重传[49]的问题。根
据图 5-9我们知道 TSN=1604~1642 的数据包并没有丢失只是由于在 if0
路径的排队和链路时延导致其后到收端。换句话说它们肯定是会到达收
端。那么在 if1 路径上的重传就是多余的。在方案一的基础上提出避免多
余重传机制记为方案二。
首先介绍 SCTP 的重传机制。
当带有丢失报告的 SACK 到达发端时如果某数据块刚好在丢失报告
里也即被证实丢失标识丢失次数的 iNumMissingReports 就加 1。如果
该数值为 4那么 SCTP 就会重发该数据块。这项工作是由 Process-
GapAckBlocks()函数来完成的。
如果 1604~1642 这些多余重传数据块(定义为旧路径余留数据块)在路
径切换周期内 iNumMissingReports 不增加就避免重传了。因此避免重传
的关键为如何界定旧路径余留数据块与路径切换周期。
1) 旧路径余留数据块就是新路径发送数据块序列号之前的所有数据
块。定义新路径上发送的第一个数据块为 uNewLinkFirstTsn_hu那么凡是
TSN 小于 uNewLinkFirstTsn_hu 的数据块都是旧路径余留数据块。从图 5-9
可知 uNewLinkFirstTsn_hu 为 1643。
2) 路径切换周期是在正常接收情况下从新路径传输第一个数据开始
到旧路径数据块传输完毕并返回证实为止。非正常接收是指旧路径余留数
据块真的出现丢失。如图 6-1 所示图中路径切换周期有两种定义。
第一种从新路径 if1 发送第一数据块 TSN=1643 的时刻(5.990 秒)开
始到发端收到从旧路径传过来的最后一个 SACK1641 的时刻(6.794 秒)。
切换周期 16.7945.9900.804 秒。
第二种从新路径 if1 发送第一数据块 TSN=1643 的时刻(5.990 秒)开
始到发端收到从新路径上传过来的余留数据块证实的时刻(6.707 秒)。 www.docin.com 吉林大学硕士学位
论文
62 切换周期 26.7075.9900.717 秒。
两者的区别在于余留数据块的 SACK 从新路径还是从旧路径上传过
来。 12
54T=6.042
重发 D1638~1642
D1650
D1643
if0 时延 200ms
if1 时延 50ms
T=6.794
T=5.990
T=6.594
T=6.606
T=6.707
T=6.658
S1649 图 6-1 路径切换周期图 在图 6-1 中有如下细节旧路径的证实块的序列号最高到 TSN=1641
并非 TSN=1642。这是因为新、旧路径都在传输 TSN=1642 数据块旧路
径上的 TSN=1642 在 6.606 秒到达收端至此收端数据块空隙就被填充完
毕也即所收到的都是连续的数据块。那么收端采取延迟证实机制等下
一个数据块(第 6.658 秒TSN=1638)到达后再发送 SACK。而 TSN=1638
的数据块来自新路径收端就只从新路径上返回证实而且这个证实的累
积证实值是 1649。累积证实值一下子跃迁到 1649这是因为在路径切换初
期新路径发送了 TSN=1643~1649 的数据包。 www.docin.com 第六章 进一步改进方案
63 在两种切换周期中需要进一步比较二者合理性。
切换周期 2 严格符合切换周期定义称之为理论切换周期。但其过于
严格没有冗余度很有可能导致部分数据块还得重传而且代码实现起
来复杂。切换周期 1 比切换周期 2 时间稍长而且代码实现方便直接采
用旧路径的 RTT 来代表路径切换周期所以称之为代码切换周期。
SCTP 代码实现采用代码切换周期为路径切换周期。
现在明确了余留数据块和路径切换周期两大问题。只要在路径切换周
期内发端收到余留数据块的丢失报告不增加 iNumMissingReports那
么余留数据块就不会多余重传。
6.1.2 代码改进
避免多余重传需要修改如下函数SetPrimary()、GenChunk()、
ProcessGapAckBlocks()。
需要添加如下全局变量。
Boolean_E eChangeLinkState_hu;
u_int uNewLinkFirstTsn_hu;
double dChangeStartTime_hu;
double dChangeEndTime_hu;
Boolean_E eNewLinkFirstTsnMarked_hu;
其中eChangeLinkState_hu 是布尔变量指示现在是否处于切换周期
内。
uNewLinkFirstTsn_hu 是无符号整形变量指示新路径上传输的第一个
数据块的 TSN 值。
dChangeStartTime_hu 是双精度变量指示路径切换的开始时间。
dChangeEndTime_hu 也是双精度变量指示路径切换的截止时间。
eNewLinkFirstTsnMarked_hu 布尔变量指示是否已经提取 uNewLink-
FirstTsn_hu。
图 6-2、图 6-3、图 6-4 分别为 SetPrimary()GenChunk()ProcessGapAck-
Blocks()的改进后的流程图。流程图的虚框部分为添加内容。 www.docin.com 吉林大学硕士学位论文
64
图 6-2 改进后的 SetPrimary()流程图

图 6-3 改进后的 GenChunk()流程图 www.docin.com 第六章 进一步改进方案


65
图 6-4 改进后的 ProcessGapAckBlocks()流程图 SetPrimary()增加了提取
dChangeStartTime_hu、dChangeEnd- Time_hu、
代码切换周期的功能。
GenChunk()增加了提取新路径上发送的第一个数据块(uNew-
LinkFirstTsn_hu)的 TSN 功能。
ProcessGapAckBlocks()增加的功能是在路径切换周期内余留数据块的
iNumMissingReports 不加 1。为什么一定要在路径切换周期内原因是防
止出现不正常接收情况即旧路径余留数据块真的发生丢失。
6.1.3 方案二NS 仿真实现
修改 SCTP 代码后重新编译 NS并运行 3.4 节脚本实现方案二。结
合 trace 文件 all.tr发现 if1 上仍重传了 TSN 为 1613~1642 的数据块。将图
6-5 与图 5-8 比较可以看到方案二重传第一个数据块的时间晚于方案一
重传第一个数据块的时间。这说明路径切换截止时间起了一定作用。重传 www.docin.com 吉林大学硕士学位论

66 的开始时间变晚了重传的数据块变少了但没有彻底避免多余重传。切
换周期需要进一步探讨。
图 6-5 控制多余重传后的 if1 路径数据包发送与时间关系图
6.1.4 进一步探讨切换周期
查看 trace 文件方案二重传的第一个的时刻是 6.298 秒。再查看调试
信息文件 debug.SctpAgent.0(发端 SCTP 调试信息文件)发现路径切换的起
始时刻(dChangeStartTime_hu)是 5.968 秒路径切换的截止时刻是 6.167 秒
两者之差为 0.199 秒非上述代码切换周期的 0.804 秒。为了在代码上实现
正确提取路径切换周期需要解决以下 3 个问题。
1) 取 RTT还是取 SRTT
查看修改的代码我使用的是 SRTT不是 RTT。根据 5.1.2 节所讲述
的规则 2)、3)。
SRTT=(1RTO.Alpha)×SRTT+RTO.Alpha×R’
当前的 SRTT 受前一个 SRTT 影响很大。
查看 trace.sctp 文件在 5.990 秒前的旧路径最后的 SRTT 刚好为 0.199
秒。而 debug.SctpAgent.0 文件里在 5.990 秒前的旧路径的 RTT 为 0.569 秒。
可以看出SRTT 与 RTT 相差很多。因此应该采用 RTT而不是 SRTT。
2) 旧路径 if0 的链路时延是 200 毫秒为什么所测 RTT 是 0.569 秒呢 www.docin.com 第六章 进一步改进
方案
67 NS 下的 RTT 由如下几部分构成
RTT = 两倍的链路时延排队时间收端处理时间
两倍的链路时延因为是往返所以是两倍链路时延。
排队时间它受带宽制约。带宽越大排队时间越短带宽越小排
队时间越长。这个排队时间可以从 all.tr 这个 trace 文件提取。“”表示入
队列“”表示出队列同一个数据包出队列时间减去如队列时间就是排
队时间。
收端处理时间当收端收到数据包经过处理产生 SACK需要一
定时间的。但是当出现乱序的时候这个时间相对于前两者可以忽略不
计。
明确了 NS 里 RTT 的计算过程就知道加上排队时间后所测 RTT 应
是 0.569。
3为什么所测 RTT 和代码切换周期(0.804 秒)仍有差距呢
这问题出自所测 RTT 的开始时刻。
根据 5.1.2 节规则 4)RTT 是每 RTT 测量一次并不是每个包都测量
一次的。查看 trace.sctp 知道RTT=0.569 是在第 5.534 秒测量得到的距
切换阶段 5.990~6.794 秒有一些提前。RTT0.569 是由于 SACK1536 的到
达发端而产生的而 TSN=1536 是在第 4.965 秒(第 5 秒前)入队列的那时
带宽、时延没变仍是大的它排队时间必然小于第 5 秒后的数据包的排
队时间。所以真实 RTT 大于所测 RTT即所测 RTT 小于代码切换周期。
为了真正避免多余重传需要放大所测 RTT 值而这个倍数不能从理
论上推出只能从经验上得到。经过多次实验放大 40是比较合理的。
所以
代码切换周期1.4×所测 RTT
dChangeEndTime_hu  dChangeStartTime_hu1.4×所测 RTT。
至此我们知道了合理的代码切换周期和切换阶段截止时间。 6.1.5 避免多余重传结论 路径切换截止时间改进
后再编译执行 3.4 节脚本截取新路径 if1
在路径切换阶段的数据包发送图如图 6-6 所示。图中曲线没有突然下滑www.docin.com 吉林大学硕士学位
论文
68 即没有多余重传改进成功。
图 6-6 采用合理路径切换周期的 if1 路径数据包发送与时间关系图 从 trace 文件中可以得到如下数据
1) 方案二 8 秒内收端收到 2169 个数据包比未改进方案(1758)速率提
高 23。
2) 5.990 秒~8 秒方案二收端共收到 579(2169~1591)个数据包是未
改进方案的 3.4 倍。
方案二解决了方案一存在着的多余重传问题方案二的传输速率比方
案一的传输速率有进一步提高。但是从图 6-6 可以看到在切换初期图
中点与点之间分得比较开随着时间的推移点与点才连续上这说明起
初传输速率低然后慢慢提高的。如果在切换初期尽快让点连续上那
传输速率又能提高一截。这个问题待 6.2 节分析并解决。 6.2 方案三扩展初始拥塞窗口机制 6.2.1 扩展初始
拥塞窗口机制的设计
从图 5-6图 5-9图 6-1 都能看到新路径一开始只能发送两个数据
包然后需要等一个 RTT 后才能再发数据包。 www.docin.com 第六章 进一步改进方案
69 SCTP 拥塞窗口机制规定一条路径上的初始拥塞窗口为 2SMSS。所以
一开始只能发送 2 个数据包。
如果一个偶联刚建立拥塞窗口大小定为 2SMSS 是合理的。因为起初
不知道网络状况只能通过慢启动等拥塞控制机制在一段短时间内探知网
络吞吐量逐步使得拥塞窗口与网络吞吐量匹配。
现在偶联已经建立而且已经在一条路径上传输了一段时间新路径
的拥塞窗口仍为 2SMSS 是不合理的。因为 SCTP 对网络状况并非一无所知
多条传输路径工作在同一时间段连接同一对终端具有一定相关性各
条路径的拥塞窗口在一定程度上可以相互借鉴。
初始拥塞窗口的大小直接决定着切换初始的传输速率的高低。旧路径
的拥塞窗口经过慢启动阶段拥塞窗口迅速增大比新路径拥塞窗口大一
个数量级或者甚至更大。如果新路径拥塞窗口借鉴旧路径拥塞窗口定
能提高路径切换初期传输速率。
在方案二的基础上提出把新路径的拥塞窗口设置为旧路径拥塞窗口
的一半即扩展初始拥塞窗口机制。这是合理而高效的即扩展了初始拥
塞窗口提高传输速率又含有拥塞控制思想避免网络拥塞。此方案记
为方案三。
6.2.2 代码改进
增大新路径的初始拥塞窗口可以在 SendMuch()函数来实现。
SendMuch()函数功能是在拥塞窗口的允许下尽可能多的发送数据。而发
送一个数据包则是 SendPachet()来实现。SendMuch()是把数据包发送到缓存
里排队等待 IP 层的发送。
需要新添一些变量。eFirstSending_hu此变量为布尔类型。当处于路
径切换阶段并且该变量为 TRUE 时新路径拥塞窗口才被设置成旧路径
拥塞窗口的一半一旦设置完毕该变量立即设置成 FALSE。也即一次
路径切换只能设置一次而且只在第一次传送数据的时候设置。之后的
拥塞窗口变化完全遵循拥塞控制机制 RFC2581[50]。
改进后的 SendMuch()函数流程图如图 6-7 所示。虚框部分为添加内容。
6.2.3 方案三NS 仿真实现
修改代码后重新编译 NS执行 3.4 节脚本实现方案三。 www.docin.com 吉林大学硕士学位论文
70
图 6-7 改进后的 SendMuch()流程图 图 6-8 是方案三在路径切换时刻的数据传输图一长串连续数据包从 2 接
口发往 5 接口这是因为扩展了新路径初始拥塞窗口。而图 6-9 是方案
二在路径切换时刻的数据传输图只有 2 个数据包从 2 接口发往 5 接口
这是因为 RFC2960 规定初始拥塞窗口为 2SMSS。比较图 6-8 与图 6-9显
然方案三比方案二传输速率高。
上述两图中还可以看到旧路径 1~4每个包之间的间隔较大这是
由于旧路径的低带宽、大时延决定的。 www.docin.com 第六章 进一步改进方案
71 图 6-8 拥塞窗口扩大后6 秒时刻的传输

图 6-9 拥塞窗口没变时6 秒时刻的传输图 6.2.4 扩展初始拥塞窗口结论


从 trace 文件中可以得到如下数据
1) 8 秒内方案三的收端共收到 2255 个数据包比未改进方案(1758)
传输速率提高 28。
2) 在 5.990~8 秒内方案三的收端共收到 665(TSN=1591~2255)个数据
包是未改进方案(168)的 3.96 倍。
方案三既克服了多余重传问题又解决了初始拥塞窗口过小问题故
方案三是最佳方案。方案三完整地实现了主路径自动切换。 www.docin.com 吉林大学硕士学位论文
726.3 本章小结 本章针对第五章基本主路径自动切换遗留下的问题提出 2 个递进方
案方案二避免多余重传机制和方案三扩展初始拥塞窗口机制。修改
SCTP 代码重新编译通过仿真实验实现两个方案。方案二中如何界
定切换周期并通过代码实现是比较复杂、容易出错的工作。6.1 节针对
此做了详细分析并提出严格意义上的理论切换周期和通过代码实现的代
码切换周期两者既有区别又有本质联系。
通过理论分析实验证实方案三是最佳方案方案三是具备主路径
自动切换的 SCTP。具备主路径自动切换的 SCTP传输速率得到很大提高。
为了量化在各种情况下各个时间点传输速率的提高值提出传输速率提
高模型。这部分内容在第七章研究。 www.docin.com 第七章 传输速率提高模型
73 第七章 传输速率提高模型 7.1 四种方案比较 根据第五章、第六章的方案一、二、三的 NS 仿真数据得到
图 7-1。
图 7-1 体现了未改进方案与 3 种改进方案在切换后(5.99~8 秒)传输分组数目
与时间的关系。从图 7-1 可知未改进方案(Scheme0)、方案一(Scheme1)、
方案二(Scheme2)、方案三(Scheme3)传输分组数目是依次递增的。因为传
输时间段相同所以它们的传输速率也是依次递增的。
图 7-1 四种方案传输分组数比较 从图 7-1 还可以看到方案一虽然比未改进方案好但在较长一段时
间内都和未改进方案传输的分组数相同这是因为方案一还存在着多余重
传问题。方案二避免了多余重传但切换开始阶段传输断断续续这是因
为新路径初始拥塞窗口太小。方案三扩大了初始拥塞窗口单位时间传输
分组数目进一步增多。
从图 7-1 可知方案三是最佳方案它不但实现了基本的主路径自动
切换而且克服了因路径切换所带来的多余重传和新路径初始拥塞窗口过 www.docin.com 吉林大学硕士学位论

74 小的问题。
方案三是实现主路径自动切换的 SCTP。
表 7-1 体现了未改进方案与 3 种方案所传输分组的总数。图 7-3 是表
7-1 的图形化。表 7-1 有 4 个时间段各时间段关系见图 7-2。分别是 0.5~8
秒整个传输阶段从路径切换时刻开始到整个传输结束这段时间(5.99~8)
命名为广义新主路径传输阶段路径切换周期(5.99~6.707)此处切换周期
为 6.1.1 节所讲的理论切换周期记为 T切换完成后阶段命名为狭义新
主路径传输阶段(6.707~8)。其中切换时刻是新路径上发送第一个数据块
的时刻即 5.990 秒广义新主路径传输阶段是切换周期加上狭义新主路
径传输阶段。 表 7-1 4 种方案的传输分组个数对照表 单位分组个数
整个传输阶段 广义新主路径传输阶段切换周期内狭义新主路径传输阶段
未改进 1758 168 60 108
方案一 1996 406 52 354
方案二 2169 579 99 480
方案三 2255 665 139 526 图 7-2 4 个时间段的关系 0
500
1000
1500
2000
2500
0.58 秒 5.9908 秒切换周期内切换完成后 4 个时间段传输数据包个数未改进
方案一
方案二
方案三
图 7-3 在 4 个时间段3 种方案与未改进方案的传输数据绝对量对比 www.docin.com 第七章 传输速率提高模

75 表 7-2 的四个阶段是以未改进方案的传输分组个数为单位其它 3 种
方案与之比较得出倍数关系。图 7-4 是表 7-2 的图形化。 表 7-2 3 种改进方案与未改进方案的倍数表
整个传输阶段 广义新主路径传输阶段切换周期内狭义新主路径传输阶段
未改进 1 1 1 1
方案一 1.14 2.42 0.87 3.23
方案二 1.23 3.45 1.65 4.44
方案三 1.28 3.96 2.32 4.87 0
1
2
3
4
5
6
0.58 秒 5.9908 秒切换周期内切换完成后 4 个时间段与未改进的倍数关系未改进
方案一
方案二
方案三
图 7-4 4 个时间段未改进与 3 种方案的传输数据相对量对比图 表 7-2狭义新主路径传输阶段方案三的传
输速率是未改进方案的
4.87 倍接近 5 倍。因为在狭义新主路径传输阶段方案三只有一条新路
径 if1 在传输数据其带宽是 5M。同样在这一阶段未改进方案只有一条
旧路径 if0 在传输数据其带宽是 1M。其本质是新路径的带宽是旧路径带
宽的 5 倍。
从图 7-4 可以看到在路径切换周期内方案一的传输分组数目比未改
进方案的传输分组数目少。其原因是方案一存在多余重传短时间内降低
了传输性能。 7.2 速率提高模型 方案三实现了 SCTP 主路径自动切换传输速率最大。我们希望得到
方案三相对于未改进方案的传输速率提高模型。这个模型的时间段是广义
新主路径传输阶段也即从切换时刻开始后的这段时间。 www.docin.com 吉林大学硕士学位论文
76 修改 3.4 节脚本文件的结束时间执行脚本得到大量样值经处理得
到表 7-3进而进行分析推出数学模型。 表 7-3 不同结束时间的样值表
结束时间 7 7.5 8 8.5 9 10121525 35 45 55 60
切换时刻 5.99 5.99 5.99 5.99 5.995.995.995.995.995.995.99 5.99 5.99
t 1.01 1.51 2.01 2.51 3.014.016.019.0119.0129.0139.01 49.01 54.01
Y 2.96 3.63 3.96 4.18 4.314.494.654.775.045.025.02 5.05 5.05
4.54 4.82 4.87 4.93 4.944.964.984.985.155.095.07 5.1 5.09 1) 第一行是传输结束时间
取 7~60 秒之间的不同时间点。
2) 第二行是切换时刻切换时刻都是 5.99 秒。
3) 第三行是传输结束时间与切换时刻差值即广义新主路径传输阶
段记为 t。
4) 第四行是广义新主路径传输阶段方案三的传输速率与未改进方案
的传输速率比值记为 Y。
5) 第五行是狭义新主路径传输阶段方案三的传输速率与未改进的传
输速率比值。这一行数据约等于 5又一次证明了在狭义新主路径传输阶
段方案三的传输速率与未改进的传输速率比值是新旧路径的带宽比。带
宽比值记为 B。
从第三行数据可以看出越是远离切换时刻Y 值越接近 5即新旧
路径的带宽比越是靠近切换时刻Y 值越受切换周期(记为 T)的影响。
把第三行 t 和第四行 Y 用 MatLab[51]拟合得图 7-5。
5101520253035404550
1
1.5
2
2.5
3
3.5
4
4.5
5
t
YY vs. t
fit 1
图 7-5 MatLab 拟合图 www.docin.com 第七章 传输速率提高模型
77 图 7-5 纵坐标代表 Y横坐标代表 t。
拟合之后的函数是 8904
.0024.3121.5−××−=tTY (7-1)
从公式(7-1)可以看到如果 t 越大第二项几乎为 0Y 就是 5.121
约等于带宽比如果 t 越小第二项对 Y 值的影响较大。
为简化公式(7-1)且让它不局限于我们所搭建的仿真环境满足任何
新旧主路径带宽比得到公式(7-2)。 t
TBY3−= (7-2)
其中 B 为新旧主路径的带宽比。用 T=0.717、B=5 和表三数据 t 验证该
模型Y 值的误差小于 3.1。
值得注意的是切换周期 T 是与新旧主路径的带宽、时延都有关系。由
于关系复杂需要后期深入研究。
速率提高模型则是 %
100)1(×−=Yη (7-3)
%
100]1)/3[(×−−=tTBη (7-4)
我们可以利用公式(7-4)预测 SCTP 主路径自动切换在各个时间点的速
率提高程度。 7.3 本章小结 本章比较未改进方案、方案一、方案二方案三的仿真结果。结果表
面方案一、方案二、方案三的传输速率是依次递增的。方案三是实现主路
径自动切换的 SCTP。
修改 3.4 节脚本文件中传输结束时间执行脚本得到大量样值数据
并得出在切换时刻后方案三与未改进方案的传输速率比值。用 MatLab
拟合这些数据得到了传输速率提高模型。 www.docin.comwww.docin.com 第八章 结论
79 第八章 结论 本文讲解了 SCTP 协议介绍了 NS 工具及相应 SCTP 代理分析了
SCTP 的 C++源代码。在此基础上围绕着路径切换提出了 3 种改进方案
1) 针对主路径时延并非最小的问题提出主路径自动切换到时延最
小的路径上即基本主路径自动切换机制记为方案一。该方案利用 SCTP
特有的 Hearbeat 机制每隔一段时间提取并比较各路径 RTT如果主路
径时延不是最小则开始切换。该方案发挥了偶联中最优路径的作用但
是带来了多余重传的问题在路径切换初始阶段影响传输速率较快提高。
2) 路径切换周期内新、旧主路径同时传输数据由于时延不同导
致收端收到的数据包失序SCTP 的 SACK 机制误认为旧路径余留数据块
丢失引发发端重传。针对多余重传问题在方案一的基础上提出避免
多余重传机制记为方案二。该方案解决了多余重传问题相对于方案一
传输速率提高了一大步但是新路径的初始拥塞窗口过小而限制初期传输
速率问题显露出来了。
3) 针对路径切换阶段初始拥塞窗口太小的问题在方案二的基础上提
出将新主路径初始拥塞窗口增至旧主路径拥塞窗口(旧路径拥塞窗口比新
路径拥塞窗口大一个数量级)的一半即扩展初始拥塞窗口机制记为方案
三。这是完整的 SCTP 主路径自动切换。实现主路径自动切换的 SCTP 充
分发挥了偶联中最优路径的传输速率比未改进方案传输速率得到最大
提高。
这 3 种递进方案分别通过 NS 仿真实现。根据仿真数据得到图 7-1。
图 7-1 体现了未改进方案与 3 种方案在切换后(5.99~8 秒)传输分组数目与时
间的关系。未改进方案(Scheme0)、方案一(Scheme1)、方案二(Scheme2)、
方案三(Scheme3)传输分组数目是依次递增的。因为传输时间段相同所以
它们的传输速率也是依次递增的。
从图 7-1 还可以看到方案一虽然比未改进方案好但在较长一段时
间内都和未改进方案传输的分组数相同这是因为方案一还存在着多余重
传问题。方案二避免了多余重传但切换开始阶段传输断断续续这是因
为新路径初始拥塞窗口太小。方案三扩大了初始拥塞窗口单位时间传输
分组数目进一步增多。
实现了 SCTP 主路径自动切换其传输速率提高多少需要量化。为此
通过修改 3.4 节脚本文件的结束时间执行脚本得到大量样值再进行 www.docin.com 吉林大学硕士学位论

80 数据处理和 MatLab 拟合得到数学模型 %
100]1)/3[(×−−=tTBη
公式中B 是新、旧主路径的带宽比T 为路径切换周期t 是自切换
时刻开始后的一段时间。通过此公式可以知道在切换时刻过了 t 秒后具
备主路径自动切换的 SCTP 传输速率相对于未改进方案的传输速率提高百
分比。
SCTP 主路径自动切换的实现以及传输速率提高模型必将对 SCTP 的
理论研究以及应用起到一定的推动作用。
www.docin.com 参考文献
81 参考文献 [1] L. Ong, I. Rytina. Framework Architecture for Signaling Transport.
RFC2719. 1999.10
[2] Seth T. Performance Requirements for Signaling in InternetTelephony.
Internet-Draft. draft-seth-sigtran-req-00.txt. 1999.5
[3] R. Stewart, Q. Xie. Multi-network Datagram Transmission Protocol.
draft-ietf-sigtran -mdtp-06.txt. 1999.6
[4] R. Stewart, Q. Xie. Stream Control Transmission Protocol. RFC2960.
2000.10
[5] Postel, J. Transmission Control Protocol. RFC793. USC/Information
Sciences Institute. 1981.9
[6] http://www.ietf.org/html.charters/sigtran-charter.html
[7] Postel, J. User Datagram Protocol. RFC 768. USC/Information Sciences
Institute. 1980.8
[8] Daswani N, Garcia-molina. H. Query-Flood DoS Attacks in Gnutella. In
ACM CCS. 2002
[9] R. Stewart, Q. Xie. Stream Control Transmission Protocol a Reference
Guide. 清华大学出版社. 2003.1 pp.13-14, pp.22-24
[10] 雪琛,张月卓,季新生. 利用 Cookie 验证机制保证 SCTP 偶联建立的安
全性. 现代计算机. 2004 年, 第七期. pp.53-55
[11] R. Stewart, M. Ramalho. Stream Control Transmission Protocol (SCTP)
Dynamic Address Reconfiguration. draft-ietf-tsvwg-addip-sctp-14.txt.
2006.3
[12] R. Stewart, M. Ramalho. Stream Control Transmission Protocol (SCTP)
Partial Reliability Extension. RFC3758. IETF. 2004.5
[13] Seok Joo Koh, Qiaobing Xie. mSCTP with Mobile IP for Transport Layer
Mobility. draft-sjkoh-mobile-sctp-mobileip-02.txt. 2003.8
[14] A. Abd El AlT. Saadawi. Load Sharing in Stream Control Transmission
www.docin.com 吉林大学硕士学位论文
82Protocol. draft-ahmed-lssctp-01.txt. 2005.10
[15] R.Stewart draft-ietf-tsvwg-sctpsocket-08.txt. 2004
[16] http://pel.cis.udel.edu/
[17] Broch J, Maltz D A, Johnson D B. Supporting hierarchy and heterogeneous
interfaces in multi-hop wireless adhoc networks. Australia: IEEE Comput
Soc, 1999.
[18] 童孟军,胡维华. SCTP 与 TCP 的比较分析. 计算机工程与设计. 2004 年
第 06 期. pp.924-928
[19] 孙宇虹. 基于流传输控制协议的移动切换研究. 现代电子技术. 2004
年, 第 15 期 pp.1-2
[20] 王利, 徐明伟, 徐恪. 轻量级的基于移动 SCTP 的 IP 移动解决方案. 华
中科技大学学报(自然科学版). 2003 年, 第 1 期. pp.11-14
[21] 郭伟, 程时端. 一种 SCTP 变种:以接收方为控制中心的流控制传输协
议. 计算机应用研究. 2005 年, 第 1 期. pp.229-231
[22] 郭强,朱杰,张海滨. 基于 SCTP 的移动 Internet 建模与仿真. 计算机工
程. 2005 年, 第 12 期. pp.111-112
[23] 郭伟,程时端. SCTP 负荷分担及其关键算法的研究. 计算机应用研究.
2005 年, 第 2 期. pp.189-190
[24] 于林,王焕义,张德民. SS7 over IP 的关键技术 SCTP 概述. 江西通信科
技. 2002 年, 第 4 期. pp.35-37
[25] 刘红梅,张有光. SCTP 在军事通信网络中的应用研究. 无线电工程.
2005 年, 第 5 期. pp.24-27
[26] Phillip T. Conrad, Armando L. Caro Jr. Remote Multimedia Document
Retrieval over Parital Order Transport. ACM Multimedia. 2001,9
[27] 张蓉,李健. 基于 SCTP 多数据流特性的 WEB 传输. 信息技术. 2005 年,
第 6 期. pp.30-32
[28] Jungmaier, A, Rathgeb, EP. On SCTP multi-homing performance.
TELECOMMUN SYST 31 (2-3): 141-161 2006.3
[29] Janardhan R. Iyengar, Armando L. Caro Jr., Paul D. Amer, Gerard J. Heinz,
Randall R. Stewart. Making SCTP More Robust to Changeover. SPECTS www.docin.com 参考
文献
83 2003, July 2003
[30] C. Perkins. IP Mobility Support. RFC2002. 1996.10
[31] 王翔. SCTP 在 P2P 文件共享系统中的应用研究. 吉林大学. 2006 年
pp.25-26
[32] R. Droms. Dynamic Host Configuration Protocol. RFC2131. 1997.3
[33] P. Ferguson, D. Senie. Network Ingress Filtering: Defeating Denial of
Service Attacks which employ IP Source Address Spoofing. RFC2267.
1998.1
[34] Kent, S., R. Atkinson. Security Architecture for the Internet Protocol.
RFC2401. 1998.11
[35] R. Stewart, Q. Xie. Stream Control Transmission Protocol. RFC2960.
2000.10
[36] Internet Protocol. RFC791 1981.9
[37] 中华人民共和国信息产业部. 流控制传送协议(SCTP). 中华人民共和
过通信行业标准. YD/T 1194-2002. 人民邮电出版社. 2002
[38] Allman, M., Paxson, V. TCP Congestion Control. RFC2581. 1999.4
[39] 徐雷鸣,庞博. NS 与网络模拟. 人民邮电出版社. 2003
[40] 王文博,张金文. OPNET Modeler 与网络仿真. 人民邮电出版社. 2003
[41] 美Brent B.Welch 著 王道义,乔陶鹏 译. Tcl/Tk 组合教程第二版
——双语教材+多媒体教室. 电子工业出版社. 2001.1
[42] 于斌,孙斌. NS2 与网络模拟. 人民邮电出版社. 2007.4
[43] ns-allinone-2.1b8.sctp-rel3.3.patch.orig http://pel.cis.udel.edu
[44] A.Caro, P. Amer, J. Iyengar, R. Stewart. Retransmission policies with
transport layer multihoming. 2003.9
[45] U.C. Berkeley, LBL, USC/ISI, and Xerox Parc. ns-2 Documentation and
Software, Version 2.30. 2006. www.isi.edu/nsnam/ns
[46] [美]Douglas E.Comer.著 林瑶, 蒋慧等译. 用 TCP/IP 进行网际互联. 电
子工业出版社. 2001
[47] A. Caro, P. Amer, R. Stewart. Transport layer multihoming for fault
www.docin.com 吉林大学硕士学位论文
84tolerance in FCS Networks. Boston, MA. 2003.10.
[48] Ye, CH, Saadawi, TN, Lee, MJ.Improving. stream control transmission
protocol performance over lossy links. IEEE J SEL AREA COMM 22 (4):
727-736 2004.5
[49] Armando L. Caro, Paul D. Amer, Randall R. Stewart. Retransmission
Policies for Multihomed Transport Protocols. Computer Communications.
2006.6
[50] M. Allman, V. Paxson,W. Stevens. TCP Congestion Control. RFC2581.
1999.4
[51] 张志涌. 精通 MATLAB 6.5 版. 北京航空航天大学出版社. 2003.3 www.docin.com 摘要
I 摘要 SCTP 是 2000 年新诞生的传输层协议。它是信令传输工作组为促进三
网合一为在因特网传输 7 号信令而设计的协议。之后IETF 推广其为通
用传输层协议。专家称其为超级 TCP并可能取代 TCP。其不但解决了 TCP
的固有弊端如队头阻塞容易 Dos 攻击而且增加了许多强大的功能
如多流、多宿、动态地址重配置等。
本文针对当 SCTP 主路径性能恶化时即主路径时延大于辅助路径时
延时数据仍在恶劣的主路径上传输这一问题提出主路径自动切换的 3
种递进改进方案。在 NS 环境下修改 SCTP 模块的 C++代码实现 3 种
递进改进方案方案一基本主路径自动切换机制方案二避免多余重
传机制方案三扩展初始拥塞窗口机制。经过实验并与未改进的 SCTP
进行比较得出改进后的传输速率提高的数学模型。
目前国内外这方面研究的论文较少因此我们所得到的改进后的方案
以及传输速率提高的数学模型必将对 SCTP 的理论研究以及应用有一定
的推动作用。
由于 SCTP 的多宿特性即终端有多个 IP 地址一个偶联类似 TCP
连接可以拥有多条传输路径。SCTP 规定在传输过程中基本只用一条
主路径传输数据其他路径作为替补除非主路径故障一直都使用主路
径传输数据。而偶联建立过程中主路径的选择带有一定的盲目性不一
定是最优路径而且最优路径很有可能随着时间的变化而变化。
针对主路径并非时延最小的问题提出主路径自动切换到时延最小的
路径的机制即基本主路径自动切换机制记为方案一。
基本主路径自动切换机制是基于 SCTP 特有的 Heartbeat 机制。
Heartbeat 机制是 SCTP 发端每一条传输路径每隔一段时间发送 Heartbeat
块收端收到后立即发回 Heartbeat-ACK 块。发端收到 Heartbeat-ACK 块
提取这条路径的往返时延RTT。主路径自动切换就是在比较各条路径
RTT 大小的基础上把主路径切换到 RTT 最小的路径上。
在路径切换阶段新、旧路径是同时传输数据的。因为新路径时延低
旧路径时延大必将导致后发的数据先到收端。如此收端发现数据失序
认为数据丢失并通知发端。发端收到四次失序报告就会重发该数据块。
实际上数据没有丢失只是晚到。所以这些块重发都是多余的。
因此在方案一的基础上针对多余重传问题提出避免多余重传机 www.docin.com 吉林大学硕士学位论文
II 制记为方案二。
SCTP 发端收到某一数据丢失证实那么 iNumMissingReports 会加 1
当 iNumMissingReports 增为 4 时促发 SCTP 重发该数据块。避免多余重
传只要在切换周期内避免那些多余重传的块 iNumMissingReports 加 1 即可。
方法如下
一界定多余重传的块。所多余重传的块都是已经放入旧路径发送缓
存的数据块其 TSN传输序列号小于新路径上所发送数据块的 TSN。
我们称它们为旧路径余留数据块。
二界定切换周期。切换周期是从新路径开始发送第一个数据到旧路
径发送完所有数据并收到证实为止也是新旧路径同时传输数据的阶段。
在方案二中新路径一开始的传输速率较低原因是拥塞窗口小。SCTP
规定新路径的初始窗口为 2SMSS而旧路径上的拥塞窗口经历了慢启动阶
段后快速增大旧路径的拥塞窗口比新路径的初始拥塞窗口大一个数量级。
因为所有传输路径目的终端相同又处于同一时间段各条路径具有一定
的相关性拥塞窗口在一定程度上可以相互借鉴。在路径切换时如果新
路径初始拥塞窗口 2SMSS 扩大为旧路径拥塞窗口的一半定能提高传输速
率。
因此针对路径切换阶段初始拥塞窗口太小的问题提出将新主路径
初始拥塞窗口增至旧主路径拥塞窗口的一半即扩展初始拥塞窗口机制。
这种机制既扩大了拥塞窗口又起到了拥塞控制的作用比较合理。此记为
方案三。
本文采用 2.30 版的 NS 网络仿真软件。在 NS 环境下搭建 SCTP 传输
网络。该网络有两个终端之间有两条传输路径起初每条路径的带宽都
为 5M时延为 50ms在 0.5 秒时刻开始建立偶联并传输在 5 秒时刻
主路径性能恶化带宽降为 1M时延变为 200ms在 8 秒时刻传输结束。
在未改进方案采用 NS2 自带的 SCTP 模块、方案一、方案二、方案三
下执行同一脚本文件得到相关传输数据。未改进方案是在链路性能恶化
但没出现故障的旧主路径上传输。方案一、二、三在 5.99 秒时刻都发生了
主路径自动切换之后在时延低的新主路径上传输。5.99 秒时刻取决于发
端在辅助路径上收到的 Heartbeat-ACK 时刻。
根据 NS 模拟数据得到未改进方案与 3 种方案在切换后5.998 秒
传输分组数目与时间的关系。未改进方案、方案一、方案二、方案三传输
分组数目是依次递增的。因为传输时间段相同所以它们的传输速率也是
依次递增的。 www.docin.com 摘要
III 方案一虽然比未改进方案好但在较长一段时间内都和未改进方案传
输的分组数相同这是因为方案一还存在着多余重传问题。方案二避免了
多余重传但切换开始阶段传输断断续续这是因为新路径初始拥塞窗口
太小。方案三扩大了初始拥塞窗口单位时间传输分组数目进一步增多。
方案三实现了主路径自动切换,并且传输速率最大。我们希望得到方案
三相对于未改进方案的传输速率提高模型。
修改脚本文件的结束时间得到大量样值进而进行分析推出数学
模型。
我们可以利用此模型预测主路径自动切换在各个时间点的速率提高程
度。
经改进后的 SCTP 传输性能大大提高促进了 SCTP 的理论研究和实
际应用。

关键词SCTPNS主路径自动切换 www.docin.comwww.docin.comAbstract
V Abstract SCTP(Stream Control Transmission Protocol) is a transport layer protocol
established in 2000. In order to promote the integration of the three networks
and transmit the no.7 signaling in Internet, SIGTRAN constitutes SCTP. Then
IETF extends it to general transport layer protocol. SCTP is called super TCP,
which is expected to replace TCP. SCTP not only solves some intrinsic
problems of TCP, such as head-of-line blocking and denial of service, but also
adds other powerful functions, such as multi-homed, multi-streams, and
dynamic address reconfiguration.
When the performance of the SCTP primary path degrades, that is, the
delay-time of the primary path is longer than that of the assistant path, the data
are still transmitted in the primary path. Aimed at the problem, the paper
presents three step-by-step modified schemes to automatically switch the
primary path. On NS, the 3 schemes are realized and the simulation results are
obtained by modifying the C++ source code of SCTP. Scheme1 is a basic
auto-handoff for SCTP primary path; the redundant re-transmission is avoided
on scheme2 and the initial congestion window is expanded on scheme3. The
comparison between unmodified SCTP and modified SCTP was made and then
the model of transmission speed rate-increased is obtained.
Nowadays, there is a lack of the relative paper in this field. Therefore,
modified SCTP and the model of trans-mission speed rate-increased will
accelerate the academic research and applications.
Because of the multi-homed characteristic of SCTP (that is, one endpoint
has many ip addresses), an association (similar to a TCP connection) can have
many transmission paths. According to SCTP, there is only one primary path to
transmit data in the process of transmission, and other paths are on standby. The
primary path is always used to transmit data unless it’s failure. But in the
process of establishing an association, the choice of a primary path is a bit
blind,
so maybe it’s not the best path. What’s more the best path may switch in the
paths again and again.
Aimed at solving the problem that the delay-time of the primary path is not
the shortest, the scheme is put forward, and it can automatically switch the
primary path to the path with the shortest delay-time, which is marked as
www.docin.com 吉林大学硕士学位论文
VIscheme1.
The basic auto-handoff for the SCTP primary path is based on the specific
heartbeat mechanism of SCTP, which means the sender of SCTP sends the
Heart-beat Chunk in each transmission path at regular intervals and the receiver
sends back the Heartbeat-ACK Chunk as soon as it receives the Heartbeat
Chunk. When the sender receives the Heartbeat-ACK Chunk, SCTP can get the
RTT of the path. Comparing the RTT of each path, the primary path is switched
to the path with shortest RTT.
In the process of switching paths, the new path and the former one are
transmitting data simultaneously. The delay-time of the new path is shorter than
the former one, so the data sent later will reach the receiver earlier. Then the
receiver finds that the data is out-of-order, thinks some data are missed and
reports the situation to the sender. If the sender receives four out-of-order
reports, the sender will re-transmit. In fact, the data isn’t missed but arrives
later.
So the data which are re-transmitted are redundant.
Based on scheme1, the avoiding redundant re-trans- mission is put forward,
which is marked as scheme2.
If the sender receives one missing report, iNumMissingReports will add one.
If iNumMissingReports =4, SCTP will re-transmit. Redundant re-transmission
is avoided by avoiding iNumMissingReports adding one in the handoff period.
Here are the steps:
1: Define the redundant re-transmission chunk. All redundant
re-transmission chunks have been put into the transmission cache of the former
path. The TSN of chunks of the former path is smaller than one of first chunk of
the new path. It is named remaining data chunks of the former path.
2: Define the handoff period. The handoff period starts when the first data
chunk is transmitted in the new path and ends when all remaining data chunks
of former path have been transmitted and acknowledged. It is the period that
data are transmitted in both the new path and the former path simultaneously.
On scheme2, since the congestion window is small, the transmission speed
of the new path is low. SCTP rules the initial window of the new path as
2SMSS, however, the congestion window of former path is large(one decade
times or more) after the period of slow start. In addition, since all the paths
have
the same destination endpoint in the same period, and they are correlated, the
www.docin.comAbstract
VII congestion windows of all the paths can be reference for each other in part.
When the path is switching, the initial window of the new path broadens to the
half size of the congestion windows of the former one, the transmission speed
definitely increases.
Based on scheme2, the initial window of the new path is broadened to the
half size of the congestion windows of the former path, which is marked as
scheme3.
The NS of edition 2.30 was applied in our simulation.A SCTP transmission
network is construsted. The network has two endpoints. Between the two
endpoints, there are two transmission paths. At first, the bandwidth of each path
is 5M, and the delay-time is 50ms. SCTP establishes an association 0.5 second
later and starts to transmit data. At the 5th second the performance of the
primary path degrades, the bandwidth narrows to 1M and the delay-time
changes to 200ms. At the 8th second the transmission finishes. The same script
file are executed on scheme0(unmodified SCTP), scheme1, scheme2, and
scheme3 and the related data is got. On scheme0 the transmission is in a path
whose performance degrades but not failure. On scheme1, scheme2, and
scheme3 all the primary paths are automatically switched at the 5.99th second,
and then the transmission is in the new path whose delay-time is short. The
5.99th second is decided by the time when the sender receives the
Heartbeat-ACK in the assistant path.
According to the simulation data on NS, the relation of the number of
packets to time on the four schemes is got, which increases step-by-step.
Because the transmission time is same, the transmission speed increases
step-by-step.
Scheme1 is better than the scheme0, but the number of packets is the same
to scheme0 in a long time. This is because there is redundant re-transmission on
scheme1. Scheme2 avoids the redundant re-transmission, but the transmission
is intermittent at the beginning of handoff. This is because the congestion
window of the new path is too small. Scheme3 broadens the initial congestion
window, so the number of packets increases more. Scheme3 is the best.
Scheme3 realizes the auto-handoff for the primary path, and its transmission
speed is the highest, so it is significant to get the model of transmission speed
rate-increased.
By changing the end time of transmission, a lot of sampling data is got, after
www.docin.com 吉林大学硕士学位论文
VIIIprocessing the sampling data. The model of transmission speed rate-increased
is
constructed through analyzing the sampling data.
We can forecast the degree of the speed increased at any time after the
auto-handoff for the primary path by the model.
Modified SCTP and the model of transmission speed rate-increased will
accelerate academic research and practical applications.

keywords: SCTP, NS, The primary path, Auto-handoffwww.docin.com 致谢


致谢 首先感谢我的导师李玲副教授。在攻读硕士学位期间李老师从各个
方面给予了我极大的关心和指导。在李老师的帮助下我不仅在学业上取
得了进步而且从她那里学到了很多为人处世的道理这些都是我一生的
财富。
感谢国内外一同研究 SCTP研究 NS 的朋友通过与他们探讨我少
走了很多弯路使我受益非浅。
感谢同学在生活中给与我的关心和照顾。有了他们我的研究生生活
既充实又快乐
最后我要感谢我的父母。在我求学期间他们一直给我默默地关心
和支持我所取得的一切成绩都是和他们分不开的。他们是我努力学习的
动力我将用更好的成绩来回报他们。

www.docin.com

You might also like