SCTP协议网络编程

发布于:2025-07-14 ⋅ 阅读:(19) ⋅ 点赞:(0)

SCTP套接字分为:一到一套接字和一到多套接字。

一到一套接字对应一个单独的SCTP关联,这种映射类似于TCP套接字和TCP链接的对应关系。

一到多套接字,可以同时有多个活跃的SCTP关联。这种映射类似于绑定了某个特定端口的UDP套接字能够从若干个同时在发送数据的远程UDP端点接受彼此交错的数据报。

使用哪种接口形式需要考虑下面几个问题:

  • 服务器程序是迭代的还是并发的?
  • 服务器希望管理多少套接字描述符?
  • 是否想在四次握手中第三次或者第四次中分组交换用户数据?
  • 应用进程要维护多少个链接装填?

使用一到一套接字接口时与TCP模型的区别:

  • TCP套接字选项接口要换成SCTP套接字选项接口。
  • SCTP有消息边界,TCP没有,比如一个TCP数据包头两个字节会表示消息长度,但是SCTP则会发送两次消息,第一个表示消息长度,第二个才是数据内容。
  • TCP链接可以在半关闭状态中告知对方数据流结束,SCTP则需要在应用层明确告知对方。
  • send函数能够以普通方式使用,使用sendto或者sendmsg函数时,指定的任何地址都被认为是对目的地主地址的重写。

一到多形式需要注意以下几点:

当一个客户关闭其关联时,服务器也自动关闭同一个关联,服务器内核不再有该关联的状态。

如果想在四次握手中第三次或者第四次时交换用户数据,必须使用一对多形式。

 对于一个还没关联的IP,如果调用了sendto,sendmsg或者sctp_sendmsg会主动尝试打开,并建立一个与该地址的新关联。这个机制与该进程是否调用过listen函数无关。

程序员必须使用sendto,sendmsg或者sctp_sendmsg这三个发送函数,不能用send或者write。

调用发送函数时,目的地址是建立关联时设置的主目的地址,除非在sctp_sndrcvinfo中设置了MSG_ADDR_OVER标志。

关联事件通知默认是开启的,如果想禁用,使用sctp_events套接字选项设置。默认启用的事件是sctp_data_io_event。

四次握手

四次握手的好处在于能防止SYN洪泛攻击。

syn之所以能造成洪泛攻击,是因为第一次握手的时候,服务器就分配了TCB块,内存缓冲,和超时重传定时器等待链接的建立,攻击者可以不断模拟第一次握手达到耗尽服务器内存和CPU的目的。

不过linux2.2之后tcp协议就支持了cookie机制,默认情况下是禁用的,但在半连接队列满时会自动启用,也可以修改系统设置:

    # 查看当前配置
    sysctl net.ipv4.tcp_syncookies
    
    # 启用SYN Cookie
    sysctl -w net.ipv4.tcp_syncookies=1
    
    # 永久启用(在/etc/sysctl.conf中)
    net.ipv4.tcp_syncookies = 1

openEuler官方文档里说是默认已加固net.ipv4.tcp_syncookies选项,但是我本地wsl安装的系统文件/etc/sysctl.conf是空的,这是为什么?

SCTP链接的关闭过程

不会存在半关闭的状态。

状态转移图


网站公告

今日签到

点亮在社区的每一天
去签到