SCTP编程不同方式
2011-07-29 14:40
120 查看
http://archive.cnblogs.com/a/2024250/
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虽然可以实现多播和广播,但那也是对某些地址赋予了多播或广播的属性,本质还是处理一个地址。
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虽然可以实现多播和广播,但那也是对某些地址赋予了多播或广播的属性,本质还是处理一个地址。
相关文章推荐
- 不同database排序方式,不同语言,如何解决国际化编程问题
- java Thread编程(三) 同步的两种不同实现方式
- java Thread编程(三) 同步的两种不同实现方式
- Linux 文件编程的两种不同方式
- 由模板元编程看 VC 和 GCC 编译方式的不同
- Python包管理不同方式的区别
- 我的Portlet 和Servlet的Eclipse发布方式不同,不能忘了,否则Portlet Java代码部分的内容不变化。
- 非编程天才参与开源项目的 14 种方式
- 关于servlet和jsp路径表达方式的不同
- PHP中将对数据库的操作,封装成一个工具类以及学会使用面向对象的方式进行编程
- 两种Spring事务管理方式:编程式、声明式 跟spring aop管理事务有什么不同?
- [Storage] 不同阵列类型所能提供的IOPS计算方式
- 不同语言,系统通过共享内存方式实现信息交互
- Linux串口编程(中断方式和select方式
- IKAnalyzer 中文分词的不同版本切词方式
- 网络编程之:IP的ULONG方式字符串方式的相互转化
- F#探险之旅(一):选择不同的开发方式
- IBM Rational Software Architect 通过编程方式生成UML模型
- Delphi 函数传递参数的不同方式
- ASP.NET MVC下的四种验证编程方式