SCTP协议详解与实例

1.SCTP是什么?

只要是接触过编程的人,当你问他传输层都有哪些协议?我想几乎很多人会说TCP,IP协议而很少有人知道SCTP(流控制传输协议)这个和上述俩个协议具有相同地位的协议。
SCTP提供的服务与TCP,UDP类似,或者甚至可以理解为其是TCP与UDP协议各自优点的组合后的产物。

2.SCTP的特点

(1)SCTP连接的建立

SCTP协议建立连接可调用

int sctp_connectx(int sd, struct sockaddr *addrs, int addrcnt);
//或者直接发送消息就可建立连接
int sctp_sendmsg(int s, const void *msg, size_t len, struct sockaddr *to,
         socklen_t tolen, uint32_t ppid, uint32_t flags,
         uint16_t stream_no, uint32_t timetolive, uint32_t context);

介绍完建立连接的接口,那么就来谈谈其连接建立的具体过程,废话不多说,先给出其建立连接过程的示意图
这里写图片描述
SCTP连接建立的过程如上图所示:

(1)客户端给服务器发送一个INIT初始化消息,消息中包含有客户端要告诉服务器自己的IP地址的清单,初始化列号(可以和TCP初始化序列一样来理解),用于表示本关联中的所有分组的其实标志,客户请求以及能够支持流的数目等
(2)服务器给客户端回一个INIT ACK来确认刚收到的消息,并且还有和刚才客户端给服务器发的所有种类的服务器自己的信息,除此之外还会还有一个状态cookie
(3)客户端收到状态cookie之后,给服务器回一个COOKIE ECHO 并且此时还可以在此数据包中包含用户数据
(4)服务器收到客户端给其发的COOKIE ECHO之后在给其发个COOKIE ACK 此时同样也可以携带数据

至此一个SCTP关联就建立成功

(2)SCTP断开连接

SCTP断开连接和TCP的接口相同都是调用shutdown(),但是语义却不同其how参数对SCTP来说都是读写都禁掉
其具体流程如下图
这里写图片描述

SCTP不像TCP那样允许”半关闭的关联”。当一端关闭某个关联时,另一段必须停止发送数据。

(3)多宿主

TCP为客户与服务器之间提供连接,从而可以使双方安全的传送数据,而SCTP将连接改为了”关联”。

要解释清楚为什么SCTP将TCP的连接改为”关联”我打算从他们的bind(绑定接口)来说明原因,先以服务器调用bind为例,
TCP的bind接口如下

int bind(int sockfd,const struct sockaddr *my_addr,socklen_t addrlen);

SCTP的bind接口如下

int sctp_bindx(int sockfd, struct sockaddr *my_addrs, int addrcnt, int flags);

上面给出了TCP和STCP对应的绑定套接字的接口,我们逐一的对比其参数
(1)首先二者的第一个参数sockfd含义相同,都是指待绑定的套接字
(2)bind中的参数my_addr指的是要把哪个插座(IP地址和端口号)绑定到sockfd上,这相当与给了sockfd一个身份,之后网络中就可以唯一的标识该sockfd了,而sctp_bindx中对应位置的参数名变为my_addrs,细心的读者会发现这个参数变为了复数了。没错该参数并不是单一的某个sockaddr结构体的地址,而是sockaddr结构体数组的首地址,参数addrcnt表示该数组中元素的个数。既然相比TCP的bind接口,此处为多个地址,我们也不难理解sctp_bindx所做的工作是将这些地址都绑定到sockfd上。这样其和TCP的第一个不同点就出来了。即TCP的bind之后的socket只有一个身份(只绑定了一个地址),而SCTP bind之后socket有多个身份(绑定了多个地址)。关于flags参数我们之后在补充

上述中我们的俩种协议的服务器调用bind接口有所区别,那么SCTP其对应的客户端建立连接时调用的connect接口也类似稍有不同
sctpconnect接口

int sctp_connectx(int sd, struct sockaddr *addrs, int addrcnt);

可以看出SCTP在建立连接时addrs也为一个sockaddr结构体数组

那么SCTP相较TCP的绑定端口和连接时使用了地址数组有什么用意呢?没错这就是我们这里最终想要说明的其多宿主的特性。服务器调用多个地址来标识自己,客户端可以和每一个地址建立一个路径。这样当客户端的哪条路劲失效时,可以自动切换到另一条路径上,应用程序甚至都不必知道发生了故障,

  • 5
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Linux中的SCTP(Stream Control Transmission Protocol)是一种可靠传输协议,它提供了面向消息的传输机制,适用于多播和多路径通信。在Linux中,你可以使用setsockopt函数来设置SCTP套接字选项。 在SCTP中,可以使用setsockopt函数来设置以下选项: 1. SCTP_INITMSG:用于设置SCTP套接字的初始化参数。主要包括最大传输单元(MTU)大小、初始传输窗口大小等。 2. SCTP_EVENTS:用于设置SCTP套接字的事件通知选项。可以设置关于数据到达、连接状态改变、错误发生等事件的通知方式。 3. SCTP_SOCKOPT_PEER_ADDR_PARAMS:用于设置SCTP套接字的对端地址参数。可以设置对端地址的最大重传次数、传输超时时间等。 4. SCTP_SOCKOPT_PEER_ADDR_THLDS:用于设置SCTP套接字的对端地址阈值参数。可以设置对端地址的最大重传次数和最小重传时间等。 5. SCTP_DELAYED_ACK_TIME:用于设置SCTP套接字的延迟应答时间。可以设置发送方等待接收方应答的时间间隔。 6. SCTP_MAXSEG:用于设置SCTP套接字的最大分段大小。可以设置发送或接收数据包的最大大小。 7. SCTP_ASSOCINFO:用于设置SCTP关联信息。可以设置关联的最大传输单元大小、心跳间隔等。 8. SCTP_RTOINFO:用于设置SCTP的重传超时信息。可以设置重传超时的初始值、最小值和最大值等。 以上仅是一些常见的SCTP套接字选项,根据具体需求,还可以设置其他选项。你可以参考Linux的相关文档或手册来详细了解每个选项的具体含义和使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值