SCTP协议网络编程
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 Cookiesysctl -w net.ipv4.tcp_syncookies=1# 永久启用(在/etc/sysctl.conf中)net.ipv4.tcp_syncookies = 1
openEuler官方文档里说是默认已加固net.ipv4.tcp_syncookies选项,但是我本地wsl安装的系统文件/etc/sysctl.conf是空的,这是为什么?
SCTP链接的关闭过程
不会存在半关闭的状态。
状态转移图