原文网址:http://cxw06023273.iteye.com/blog/867304
SCTP协议在UNP第2版中还未提及,是在第3版中新增加的,在第9、10、23章介绍SCTP。
SCTP就好象是TCP和UDP的综合体,既可以单播也能多播,而且连接建立过程使用4次握手而不是TCP的3次握手,在相当程度上防止了类似TCP中的syn flood的攻击方法。
SCTP是面向消息而不是面向连接的,而且是用关联(associate)代替连接的概念,关联即可以是一对一的,也可以是一对多的。 SCTP提供可靠性,排序和流量控制等功能,但不是象TCP那样严格防止数据丢失情况,而是允许丢失消息而不阻塞,这个特性使得SCTP更适合于多媒体数据的传输,本来SCTP最初就是为IP电话设计的。目前linux 2.6内核中已经增加了对SCTP协议的支持。
SCTP的套接口两类:一对一(类似TCP)和一对多(类似UDP)。
一对一方式的SCTP的编程基本和TCP类似,只是打开的socket是SCTP协议的流接口:
socket(AF_INET, SOCK_SREAM, IPPROTO_SCTP)
然后客户端可以用connect()连接服务器, write(), read()读写,close()关闭套接口
服务器端用 bind()绑定端口,listen()监听,accept()接受连接,write()/read()读写,close()关闭,这和普通TCP程序是相同的。由于SCTP是面向消息的,因此这种情况下仍和UDP一样,一方发几个消息,对方就会收几个消息,而不是象TCP那样可能会进行数据合并。
注意SCTP不提供TCP那样的半关闭,每一方调用shutdown()后都会关闭SCTP关联而不是象TCP那样半连接。
一对多方式的SCTP编程和UDP类似,打开的是SCTP的有序分组接口:
socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)
用的socket(), bin(), listen(), close()等函数和原来一样,但发送接收数据是用sctp_sendto(),sctp_sendmsg()和sctp_recvmsg()这些SCTP专用函数。
SCTP可用sctp_bindx()绑定到一组地址而不是单个或全部地址;用sctp_connectx()连接多个地址。
SCTP使用通知(notification)来跟踪关联的状态,通知也是通过recvmsg()或sctp_recvmsg()函数得到的,和网络数据混杂,函数返回的标志msg_flags中有标志表示是数据还是通知,这是和TCP、UDP编程不同的。
SCTP支持自动关闭功能,相当于TCP中的超时断开,当关联在任何方向都没有数据超过一定时间后自动关闭,这通过setsockopt()函数设置SCTP_AUTOCLOSE属性来实现。
SCTP在传输大数据时可能因为资源不够而采取部分抵送方式发送数据,接收方相应要检查相应接收标志以保证能正确完整接收。
SCTP可以无序发送数据, 在sctp_sendmsg()函数中设置MSG_UNORDERED标志即可,这时SCTP数据中不带序列号。
SCTP和TCP一样支持心跳保活机制,也有很多定时器检测关联是否失效。
SCTP最大的特点就是同时处理多个地址的通信的能力,TCP就只能是一对一,UDP虽然可以实现多播和广播,但那也是对某些地址赋予了多播或广播的属性,本质还是处理一个地址。