• UNPv1_r3读书笔记: SCTP编程[转]


    原文网址: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虽然可以实现多播和广播,但那也是对某些地址赋予了多播或广播的属性,本质还是处理一个地址。

  • 相关阅读:
    kafka原理深入研究 (转 )
    redis——持久化篇
    IDEA 配置环境和相关工具整理(新手入门)
    Spring Data JPA(官方文档翻译)
    springboot:spring data jpa介绍
    JDK8-十大新特性-附demo
    JDK8新特性一览
    Maven中的pom.xml配置文件详解
    数据库面试题(更新中...)
    互联网协议系列
  • 原文地址:https://www.cnblogs.com/wangshuo/p/2024250.html
Copyright © 2020-2023  润新知