WebRTC 流控制传输协议(SCTP)
作者:追风剑情 发布于:2024-2-26 16:25 分类:Unity3d
WebRTC数据通道是一种直接建立在浏览器之间的传输通道,专门用于传输非媒体流的数据。它为 Web开发人员提供了一种灵活且可配置的方式,可绕开服务器直接交互数据。使用信令服务器也可以传输数据,但相比基于Socket.IO的信令服务器,数据通道具有以下特点。
- 数据交换不经过服务器,不受服务器性能及带宽瓶颈的限制,同时减少了数据被拦 截的概率。
- 底层传输使用了 DTLS,具有较高的安全性。
- 上层使用SCTP,默认使用可靠且有序的方式进行数据传输。
数据通道支持传输字符串、文件、图片等数据。数据通道API的使用方式与WebSocket非常相似,但是 WebSocket运行于TCP之上,而数据通道则运行于SCTP之上。
流控制传输协议(Stream Control Transmission Protocol,SCTP)是在 2000年由 IETF 的 SIGTRAN 工作组定义的一个传输层协议。它是面向连接、端到端、全双工、带有流量和拥塞控制的可靠传输协议,与TCP和UDP处于同一级别,可以直接运行在IP之上。
SCTP的连接称为关联。SCTP支持多流机制,一个关联可以有多个流,每个流都给定一个编号,编号包含在SCTP报文中。关联中的流相互独立,一个流出现阻塞不会影响同一关联中的其他流。相比之下,类似的阻塞问题在TCP中却很容易出现。
SCTP 与 TCP、UDP 的对比 | |||
对比项 | TCP | UDP | SCTP |
可靠性 | 可靠 | 不可靠 | 可配置可靠、不可靠两种模式。默认使用可靠模式 |
数据包分发 | 有序 | 无序 | 可配置有序、无序两种方式。默认使用有序方式 |
传输 | 面向字节 | 面向消息 | 面向消息 |
流控 | 支持 | 不支持 | 支持 |
拥塞控制 | 支持 | 不支持 | 支持 |
SCTP采用的是类似TCP的流控和拥塞控制机制,但有所增强。整个传输过程分为慢启动阶段和拥塞避免阶段。与TCP不同的是,SCTP的拥塞窗口的初始值是2个MTU,可以获得比 TCP更快的窗口增长。SCTP的拥塞控制采用了选择确认(SACK)快速重传和快速恢复组合的方式,是TCP各种主流改进机制的集成。因为SCTP采用了块结构和控制块机制,所以可以比TCP有更高的传输性能。由于SCTP有多条通往对端的路径,所以在发送端,它对每一条路径都有一套拥塞控制参数。这类似于有多个通往对端的TCP连接,SCTP为多条路径的流量控制和拥塞控制提供统一的管理机制。
1.SCTP 关联
SCTP提供多宿主特性,单个SCTP端点能够支持多个IP地址。该特性为应用程序提供了比TCP更高的可用性。如果一台主机有多个网络接口,且能够通过多个IP地址访问该主机,则这台主机就是多宿主主机。
SCTP使用“关联”一词代替TCP使用的“连接”,这样做的原因是,一个连接只涉及两个IP地址间端到端的通信,而一个关联指代两台主机之间的通信,它可能涉及两个以上IP地址的通信。当端点之间建立一个关联之后,如果某个网络链路发生故障,SCTP就可以切换到关联的另一个地址继续提供服务,从而避免了网络故障导致的服务中断。
SCTP通过自带的心跳机制(heartbeat)可以探测网络链路的可用性,如果某条链路上的心跳超出设定值仍没有响应,则认为该链路不可用。
2.关联的建立与关闭
建立SCTP关联须通过4次握手,关闭SCTP的关联则需要3次握手,同时,数据只有在关联建立之后和关联关闭之前才可以发送。与TCP不同,SCTP不支持半连接状态,也就是说任何一方关闭关联后,对方便不能再发送数据了。下图展示了TCP和SCTP的建立连接过程。
TCP的3次握手带来了一些安全问题。为了建立TCP连接,首先客户端向服务器端发送一个SYN报文,然后服务器端回复SYN-ACK报文进行确认,接着客户端使用ACK报文确认已接收到报文,最终成功建立连接。如果恶意客户端使用虚假的源地址伪造IP报文,TCP的安全问题就暴露出来了。例如,恶意客户端发送大量SYN报文,对服务器端造成攻击。服务器端收到SYN报文后,要为连接分配资源,在大量产生SYN报文的情况下最终耗尽自己的资源,无法处理新的请求。这种情况就是遭到了SYN Flooding 攻击。
SCTP可以通过4次握手的机制及引人 cookie 的概念,有效阻止 SYN Flooding 攻击。在 SCTP 中,客户端使用一个 INIT 报文请求建立关联,服务器端收到 INIT 报文后使用 INIT-ACK 报文进行响应,其中包括了 cookie(关联的唯一标识)。客户端随后使用 COOKIE-ECHO 报文进行响应,其中包含了服务器端发送的cookie。现在,服务器端可以为这个关联分配资源了,并通过向客户端发送一个 COOKIE-ACK 报文对其进行响应,最后成功建立关联。
为了避免 SYN Flooding 攻击,SCTP还采用了一种比较“聪明”的办法,即服务器端不维护半连接信息,而是把半连接信息发送给客户端,如果客户端确实需要建立这个连接。再把半连接信息返回服务器端,这时服务器端就可以根据返回的半连接信息建立连接了。
下图展示了TCP与SCTP关闭过程的对比。在TCP中,建立连接的一方可以关闭自己的套接字(socket),然后发送FIN报文说明这个端点不会再发送数据,但是在关闭套接字之前,它仍然可以继续接收数据,这个状态被称为TCP连接的半关闭状态。
实际上,应用程序很少使用这种半关闭状态,因此SCTP的设计者选择放弃这种状态并将其替换成一个显式的终结序列。在SCTP中,当一方关闭自己的套接字时,会产生一个SHUTDOWN原语,此时建立关联的双方需要全部关闭,且将来任何一方都不允许再进行数据传输了。
3.数据块
SCTP是一种面向消息的传输协议,从上层应用传递下来的数据以消息的形式传输。为便于传输,SCTP提供消息的拆分和组装,以及消息的传输功能。
SCTP进行数据传输的基本单位是块。每个SCTP包含一个SCTP公共标头、一个或多个块。块有两种基本类型: 控制块和数据块。控制块用于SCTP的连接控制,如连接的建立、关闭、传输路径的维护等;数据块用于传送应用层的用户数据。上层用户的每一个消息均被封装在一个数据块中,如果消息长度大于传输路径的最大传输单元(MTU),则消息将被拆分成多个数据块传输,在接收端组装后再向上层提交。如果消息较短,则多个消息可以放入同一个 SCTP 包中,但要求总体大小不能超过MTU,即多个数据块共用一个头部,从而提高传输效率。数据块可以和控制块封装在同一个SCTP包进行传输。
SCTP数据包公共的标头部分占用数据包的前12个字节,如下表所示。
SCTP 数据包标头 | ||||
位 | 0-7 | 8-15 | 16-23 | 24-31 |
0 | 源端口 | 目标端口 | ||
32 | 校验标签 | |||
64 | 校验和 | |||
96 | 块1类型 | 块1标记 | 块1长度 | |
128 | 块1数据 | |||
... | 块N类型 | 块N标记 | 块N长度 | |
... | 块N数据 |
标头各个字段的说明如下。
- 源端口: 发送数据的源端口。
- 目标端口: 接收数据的目标端口。
- 校验标签: 32位随机值,用于区分数据包。
- 校验和: 使用循环冗余校验算法(CRC32)检测在数据传输过程中可能引人的错误。
- 块类型: 数据块传输内容的类型,长度为1个字节。
- 块标记: 由8个标志位组成,其定义随块类型而变化。默认值为零,表示上层应用没有为数据指定标识符。
- 块长度: 指定块的总长度(以字节为单位)。
- 块数据: 实际传输的数据块。
标签: Unity3d
日历
最新文章
随机文章
热门文章
分类
存档
- 2024年11月(3)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号