SCTP 库的简述和代码

来源:互联网 发布:php入门知识 编辑:程序博客网 时间:2024/05/01 21:28

 http://my.oschina.net/jundai/blog/15174

SCTP和TCP比较

SCTP好处:

1. SCTP 做了TCP类似的事情, 但他比TCP有更强的可靠性 (多址 multihome)

如果丢了包, TCP可以通过重传帮你拣回来. 如果电信出了问题呢?比方说,电信网络出故障了,那就没办法了.

网络故障,软件确实不好解决. 不过, 如果你是有钱人, 你可以再搞个有线宽带(有人说,有线也用电信的核心网, 是真的吗?)

这样,你有两个IP, 一个电信,一个有线. 如果使用SCTP,你可以给你的应用程序分两个IP,这两个IP用于同一个偶联(association, SCTP的术语),相当于你的socket绑了两个地址. 这样,只要其中一个还在,你的数据流就不会断.

 

2. SCTP 支持多流, 即使某个流由于对方处理不及堵塞了,其他流还可以继续传输.

多流,参照TCP来讲,就是, 一个socket, 逻辑上给多个通道.

首先,如果网络堵塞,该堵的还是要堵. 不过, 如果使用SCTP,那么, 如果这样的堵塞是由于两端软件处理能力的问题, 那么, 你可以把关键的数据放在一个特别的流中, 比方说,你有视频数据还有聊天文字要传输,你把文字放在单独一个流中,可以避免视频把你的文字给堵塞了.(一个简单的例子, SIGTRAN协议组使用0做控制通道, 1~流做数据)

 

3. SCTP是基于包发送的

对于使用SCTP的人来说, 他比TCP方便的地方还在于,他是基于包的, TCP 是基于流的, 比方说, 发送"Hello"到对端, 理论上TCP可能会发送"He",然后再发剩下的"llo". 你要自己定义包格式来解决这个问题, (比方说, H323协议中使用TPKT), 虽然不复杂,但是麻烦.

 

4. SCTP流控比TCP先进一些.

毕竟新一点.

 

5. 安全性 SCTP > TCP

首先, SCTP没有client/server的说法, 下面的服务端,只是为了方便描述, 指收到初始连接请求(INIT)的一方

针对TCP的半开连接攻击, 在SCTP中不成立.  因为SCTP使用cookie机制. 攻击TCP的一种方式是, 发些假连接, 让服务器端为你的假连接分配资源,比方说内存. 这样, 你就可以以很小的代价(或者说无代价, 服务器端有资源分配, 你无须分配保持连接所须的资源)让服务器挂掉.

对SCTP, 攻击方发送的请求,他会回你一个包, 包含建立连接所需的数据(cookie), 然后, 不做任何资源分配.

TCP: 攻击方的代价是组包,服务器端, 分配资源 (挂)

SCTP: 服务器不分配资源.

cookie数据都是认证过的. 你无法伪造. 方法是, 定义一个私密的钥匙, 然后,把这个钥匙和数据等做MD5散列. 可以看到散列结果,无法倒推私钥,所以无法仿冒. 真正的连接不想改cookie数据, 所以他无须关心此私钥,他只需原样发回cookie就是. 仿冒者想改cookie数据,所以,他想知道次私钥,然后用他构造一个假cookie发回来.不幸运的是, 他不是南京(是哪个大学的教授的? 真高科技)的那个牛人, 就是MD5算法他也无法找到冲突,更别说SCTP可能更喜欢SHA.

 

SCTP差的地方:

打个比方, 你可以写出QQ, 但你不能成为小马哥, 为何? 除了 命运, 能力, 等等. 一个原因是先发优势, TCP用的人多啊.

 

SCTP over UDP

为什么呢? UDP可以打个洞, 穿透 NAT (部分,咱不严格的讲,就是可以). 但UDP不可靠, 地球人都知道.

那SCTPoverUDP呢, 可以整一个. 本文从这里进入正题.

------------------------------- 正题华丽的分割线 -------------------------------------------------

1. 状态机

协议软件千千万, 状态机万万千.  写协议软件的兄弟姐妹都知道, 怎么处理状态机很大程度上决定了协议软件的主要架构.

咱写C的, 好多很炫的方法用不上,