搞SCTP开发看哪个协议标准

搞SCTP开发看哪个协议标准

 

作者:千里孤行(http://blog.csdn.net/yanghehong)

 

 

如果是自己开发SCTP协议栈本身,那基本上要依照RFC 2960 Stream Control Transmission Protocol (SCTP协议)RFC 3309 Stream Control Transmission Protocol (SCTP) Checksum Change (SCTP校验和) 来做。因为SCTP就是为传输电信网络信令,而设计出来的。所以估计在早期,电信设备商有自己开发SCTP协议栈的需求,大量应用于信令网关以及其他电信网络设备。

 

后来,很多操作系统也支持SCTP了,linux kernel 2.6就内置了SCTP协议。这个时候来做SCTP上其他协议的开发,那就可以考虑直接使用内核提供的SCTP接口来做,而不一定需要独立开发SCTP协议栈。

 

前一阵,有个项目,在第三方(某著名电信网络协议栈软件提供商)提供的Diamter基本协议的代码的基础上,做LTE网络上的一些接口Diamter应用。Diamter协议的思想是在基本协议(RFC 3588)里头定义了一个基本的有一定可扩展性的framework,基本的消息,消息元素(AVP)和连接的建立。而各种场合以及接口的应用,再在基本协议的framework的基础上定义自己特定的消息,AVP等等,作为特定接口的协议标准。

 

该第三方提供的Diamter基本协议栈代码,会使用linux kernel的SCTP协议栈做传输,里头自然有代码对SCTP连接做管理。当时,就发现该第三方代码对SCTP连接管理部分的代码有bug。

 

linux kernel的SCTP协议栈,做成socket风格的接口给应用程序使用。

 

IETF的SCTP的socekt接口规范draft-ietf-tsvwg-sctpsocket-19.txt里头说到,除了可以用socket接口建立sctp连接,收发数据之外,还可以有一些相关的事件的notification可以报给应用程序/上层。只要对socket的选项做相应的设置。

 

比如调用connect建立SCTP association的时候,如果失败,出来有错误返回值之外,还会有notification上报。这些notification通过跟数据一样的接收, 比如recvmsg(),传给上层。如果你做了类似下面这样的设置 (draft-ietf-tsvwg-sctpsocket-19.txt 里头的示例代码):

   {
     struct sctp_event_subscribe event;

     memset(&event,0,sizeof(event));

     event.sctp_data_io_event = 1;
     event.sctp_association_event = 1;

     setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(event));
   }
  
  
当时采用的第三方代码的问题,基本上就是,一边设置了对association事件的兴趣,一方面有没正确对待处理它们。当association建立失败的时候,就把相关控制接口删掉,以致后面notification收上来的时候,找不到相应的控制结构,就乱了。。。最后的结果是,连接断开后,不会重新尝试建立。而Diamter协议时规定当传输连接断开后,要自动尝试重新建立的。


所以,如果是在linux kernel的SCTP协议栈上座应用开发,那除了最开始提到的RFC 2960 Stream Control Transmission Protocol 之外,可能还要看看draft-ietf-tsvwg-sctpsocket-19.txt

BTW.google了一下,发现RFC 2960有了更新版本,RFC 4960 Stream Control Transmission Protocol。其实看它上面写的日期,07年就出来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值