流控制传输协议(SCTP
- 一、SCTP介绍
- 1.四路握手
- 1.SCTP_ADAPTION_LAYER套接字选项
-
- 2.SCTP_ASSOCINFO套接字选项
-
- 3.SCTP _AUTOCLOSE 套接字选项
-
- 4.SCTP _DEFAULT_SEND_PARAM 套接字选项
-
- 5.SCTP _DISABLE_FRAGMENTS套接字选项
-
- 6.SCTP_EVENTS套接字选项
- 7.SCTP _GET_PEER_ADDR_工NFO套接字选项
- 8.SCTP_I_WANT_MAPPED_V4_ADDR套接字选项
- 9.SCTP_INITMSG套接字选项
- 10.SCTP _MAXBURST套接字选项
- 11.SCTP_MAXSEG套接字选项
- 12.SCTP_NODELAY套接字选项
- 13.SCTP _PEER_ADDR_PARAMS套接字选项
- 14.SCTP _PRIMARY_ADDR套接字选项
- 15.SCTP_RTOINFO套接字选项
- 16.SCTP _SET_PEER_PRIMARY_ADDR套接字选项
- 17.SCTP_STATUS套接字选项
- 四、SCTP套接字编程
- 1.sctp_bindx函数
- SCTP一到多式流分回射服务器程序
一、SCTP介绍
-
SCTP在客户和服务器之间提供
关联(association)
,并像TCP那样给应用提供可靠性、排序、流性控制以及全双工的数据传送。 -
SCTP中使用“关联”一词取代“连接” 是为了避免这样的内涵:一个连接只涉及两个IP地址之间的通信。一个关联指代两个系统之间的一次通信,它可能因为SCTP支持多宿而涉及不止两个地址。
-
与TCP不同的是,SCTP是面向消息的(message-oriented)。它提供各个记录的按序递送服务。与UDP一样,由发送端写入的每条记录的长度随数据一道传递给接收端应用。
-
SCTP能够在所连接的端点之间提供多个流,每个流各自可靠地按序递送消息。一个流上某个消息的丢失不会阻塞同一关联其他流上消息的投递。这种做法与TCP正好相反,就TCP而言,在单一字节流中任何位置的字节丢失都将阻塞该连接上其后所有数据的递送,直到该丢失被修复为止。
-
SCTP还提供多宿特性,使得单个SCTP端点能够支持多个IP地址。该特性可以增强应对网络故樟的健壮性。一个端点可能有多个冗余的网络连接,每个网络又可能有各自接入因特网基础设施的连接。当该端点与另一个端点建立一个关联后,如果它的某个网络或某个跨越因特网的通路发生故障,SCTP就可以通过切换到使用已与该关联相关的另一个地址来规避所发生的故陓。
二、SCTP关联的建立和终止
SCTP的握手过程不同于TCP。
1.四路握手
-
服务器必须准备好接受外来的关联。通常调用socket、bind和listen这3个函数来完成,称为被动打开。
-
客户通过调用connect或者发送隐式打开该关联的消息进行主动打开。这使得客户SCTP发送 一个INIT消息(初始化),该消息告诉服务器客户的IP地址清单、初始序列号、用于标识本关联中所有分组的起始标记、客户请求的外出流的数目以及客户能够支持的外来流的数目。
-
服务器以 一 个
INIT ACK
消息确认客户的INIT消息,其中含有服务器的IP地址清单、初始序列号 、 起始标记、 服务器诮求的外出流的数目、服务器能够支持的外来流的数目以及一 个状态cookie状态cookie包含服务器用于确信本关联有效所需的所有状态,它是数字化签名过的,以确保其有效性。 -
客户以 一 个
COOKIE ECHO
消息回射服务器的状态cookie
。除COOKIE ECHO
外,该消息可能在同 一个分组中还捆绑了用户数据。 -
服务器以 一 个
COOKIE ACK
消息确认客户回射的cookie
是正确的,本关联于是建立。该消息也可能在同 — 个分组中还捆绑了用户数据。
在SCTP中使用四路握手为了避免拒绝服务器攻击。
2.关联终止
SCTP不像TCP那样允许**"半关闭”**的关联。当一端关闭某个关联时,另一端必须停止发送新的数据。关联关闭请求的接收端发送完已经排队的数据(如果有的话)后,完成关联的关闭。
-
SCTP没有类似于TCP的
TIME_WAlT
状态,因为SCTP使用了验证标记。 -
所有后续块都在捆绑它们的SCTP分组的公共首部标记了初始的INIT块和
INIT ACK
块中作为起始标记交换的验证标记; -
由来自旧连接的块通过所在SCTP分组的公共首部间接携带的验证标记对于新连接来说是不正确的。所以SCTP通过放置验证标记值就避免了TCP在TIME_WAIT状态保持整个连接的做法。
3.SCTP状态转换图
SCTP涉及关联建立和关联终止的操作状态图如下:
4.观察分组
下图为SCTP关联所发生的实际分组交换情况,包括关联建立、数据传送和关联终止3个阶段。
-
,客户在
COOKIEECHO
块所在分组中捎带了它的第一个DATA
块,服务器则在作为应答的COOKIE ACK
块所在分组中捎带了数据。 -
当网络应用采用一 到多接口式样时,
COOKIE ECHO
通常捎带一个或多个DATA块。 -
SCTP分组中信息的单位称为块(chunk)。块是自描述的,包含 一 个块类型、若干个块标记和一 个块长度。这样做方便了多个块的绑缚,只要把它们简单地组合到一个SCTP外出消息中。
5.接口模型
SCTP套接字分为:一到一套接字和一到多套接字,一到一套接字对应单独的SCTP关联。一对多套接字,一个给定套接字上可以同时有多个活跃的SCTP关联。
①.一到一形式
一到一形式的目的是将现有TCP应用程序移植到SCTP上。以下是这两者之间必须搞清的差异,特别是在把现有TCP应用程序移植到SCTP的这种形式上时。
-
任何TCP套接字选项必须转换成等效的SCTP套接字选项。两个较常见的选项是
TCP_NODELAY
和TCP_MAXSEG
, 它们应该映射成SCTP_NODELAY
和SCTP_MAXSEG
。 -
SCTP保存消息边界,因而应用层消息边界并非必需。例:基于TCP的某个应用协议可能先执行一个双字节的
write
系统调用,给出消息的长度x
,再调用一个x
字节的write
系统调用,写出消息数据本身。改用SCTP后,接收端SCTP将收到两个独立的消息(也就是说得有两次read系统调用才能返回全部数据:第一次返回一个双字节数据,第二次返回一个x字节消息)。 -
有些TCP应用进程使用半关闭来告知对端去往它的数据流已经结束。将这样的应用程序移植到SCTP需要额外重写应用层协议,让应用进程在应用数据流中告知对端该传输数据流已经结束。
-
send函数能够以普通方式使用。使用
sendto或sendmsg
函数时,指定的任何地址都被认为是对目的地主地址的重写。
下图所示为一到一套接字典型用法的时间线图。
-
服务器启动后,打开一个套接字,bind一个地址,然后就等着accept客户关联。
-
客户端启动,打开一个套接字,并初始化与服务器的一个关联。
-
我们假设客户向服务器发送一个请求,服务器处理该请求后向客户发回一个应答。这个循环待续到客户开始终止该关联为止。这样主动关闭关联之后,服务器或者退出,或者等待新的关联。
-
SCTP一到一-套接字的交互类似于TCP套接字。
-
一到一式SCTP套接字是一个类型为
SOCK_STREAM
,协议为IPPROTO_SCTP
的网际网套接字(即协议族为AF_INET或AF_INET6)。 -
关联事件(将在9.14节讨论的众多SCTP通知之 一 )可能被启用,因此要是应用进程不希望收到这些事件,就得使用SCTP_EVENTS套接字选项显式禁止它们。默认情况下启用的唯一事件是sctp_data_io_event它给recvmsg和sctp_recvmsg调用提供辅助数据。这个默认设
②.一到多形式
-
一到多形式:编写的服务器程序无需管理大量的套接字描述符。单个套接字描述符将代表多个关联,就像一个UDP套接字能够从多个客户接收消息那样。
- 在一到多式套接字上,用于标识单个关联的是一个关联标识。关联标识是一个类型为
sctp_assoc_t
的值,通常是一个整数,不透明的值,应用进程不应该使用不是由内核先前给予的任何关联标识。
- 在一到多式套接字上,用于标识单个关联的是一个关联标识。关联标识是一个类型为
一到多式套接字的用户应该掌握以下儿点。
-
客户关闭其关联时,其服务器也将自动关闭同一个关联,服务器主机内核中不再有该关联的状态。
-
可用于致使在四路握手的第三个或第四个分组中捎带用户数据的唯一办法就是使用一到多形式。
-
对于一个与它还没有关联存在的IP地址,任何以它为目的地的
sendto、senclrnsg或sctp_sendmsg
将导致对主动打开的尝试,从而(如果成功的话)建立一个与该地址的新关联。这种行为的发生与执行分组发送的这个应用进程是否曾调用过listen函数以请求被动打开无关。 -
用户必须使用
sendto、sendmsg或sctp_sendmsg
这3个分组发送函数,而不能使用send或write
这2个分组发送函数,除非已经使用sctp_peeloff
函数从一个一到多式套接字剥离出一个一到一式套接字。 -
任何时候调用其中任何一个分组发送函数时,所用的目的地址是由系统在关联建立阶段选定的主目的地址,除非调用者在所提供的
sctp_sndrcvinfo
结构中设置了MSG_ADDR_OVER
标志。为了提供这个结构,调用者必须使用伴随辅助数据的senclrnsg
函数或sctp_senclrnsg
函数。 -
关联事件可能被启用,因此要是应用进程不希望收到这些事件,就得使用
SCTP_EVENTS
套接字选项显式禁止它们。默认情况下启用的唯一件是sctp_data_io_event
,它给recvmsg和sctp_recvmsg
调用提供辅助数据。这个默认设置同时适用于 一 到一 形式和一 到多形式。
一到多套接字示意图:
-
服务器启动后打开一 个套接字,bind一个地址,调用listen以允许客户建立关联,然后就调用sctp_recvmsg阻塞于等待第个消息的到达。
-
客户启动后也打开一个套接字,并调用sctp_sendto, 它导致隐式建立关联,而数据请求由四路握手的第三个分组捎带给服务器。
-
服务器收到该请求后进行处理并向该客户发回一个应答。客户收到应答后关闭其套接字,从而终止其上的关联。服务器循环回去接收下一个消息。
本例子是迭代服务器模型,来自许多关联(许多客户)的(可能交错的)消息能够由单个控制线程处理。在SCTP中, 一 个一 到多套接字也能够结合使用sctp_peeloff
函数 以允许组合迭代服务器模型和并发服务器模型。关系如下:
-
sctp_peeloff
函数用于从一个 一到多套接字剥离出某个特定的关联(例如一个长期持续的会话),独自构成 一 个一到一 式套接字。-
剥离出的关联所在的 一 到一 套接字随后就可以遣送给它自己的线程,或者遣送给为它派生的进程(就像在并发模型中那样).
- 与此同时,主线程继续在原来的套接字上以迭代方式处理来自任何剩余关联的消息一到多式SCTP套接字是 一 个类型为
SOCK_SEQPACKET
,协议为IPPROTO_SCTP
的网际网套接字(即协议族为AF_INET或AF_INET6)。
- 与此同时,主线程继续在原来的套接字上以迭代方式处理来自任何剩余关联的消息一到多式SCTP套接字是 一 个类型为
-
6.SCTP选项
- SCTP使用参数和块方便增设可选特性。
- 新的特性通过添加这两个条目之一 加以定义,并允许通常的SCTP处理规则汇报未知的参数和未知的块。
- 参数类型字段和块类型字段的高两位指明SCTP接收端该如何处置未知的参数或未知的块。
- 新的特性通过添加这两个条目之一 加以定义,并允许通常的SCTP处理规则汇报未知的参数和未知的块。
当前如下两个对SCTP的扩展正在开发中心:
-
动态地址扩展,允许协作的SCTP端点从已有的某个关联中动态增删IP地址。
-
不完全可靠性扩展,允许协作的SCTP端点在应用进程的指导下限制数据的重传。当 一个消息变得过于·陈旧而无须发送时(按照应用进程的指导),该消息将被跳过而不再发送到对端。
三、SCTP套接字选项
1.SCTP_ADAPTION_LAYER套接字选项
-
在关联初始化期间,任何一个端点都可能指定一个适配层指示(adaptionlayer indication)。指示为32位无符号整数,可由两端的应用进程用来协调任何本地应用适配层。
-
本选项允许调用者获取或设置将由本端提供给对端的适配层指示。
-
获取本选项的值时,调用者得到的是本地套接字将提供给所有未来对端的值。要获取对端的适配层指示,应用进程必须预订适配层事件。
2.SCTP_ASSOCINFO套接字选项
本套接字选项可用于以下三个目的:
-
获取关于某个现有关联的信息。
-
改变某个已有关联的参数。
-
为未来的关联设置默认信息。
-
在获取关于某个现有关联的信息时,应该使用
sctp_opt_info
函数而不是getsockopt
函数。
sctp_assocparams
结构:
struct sctp_assocparams{
sctp_assoc_t sasoc_assoc_id; //存放待访问关联的标识(即关联ID);调用setsockopt时置0本字段,郑么sasoc_asocmaxrxt和sasoc_cookie_life字段代表将作为默认信息设置在相应套接字上的值。提供关联ID,返回的就是特定于该关联的信息,否则如果置0本字段,返回的就是默认的端点设置信息。
u_int16_t sasoc_asocrnaxrxt; //某个关联在已发送数据没有得到确认的情况下尝试重传的最大次数。
u_int16_t sasoc__number_peer_destinations;//存放对端目的地址数;它不能设置,只能获取。
u_int32_t sasoc_peer_rwnd;//存放对端的当前接收窗口 ;不能设置,只能获取。
u_int32_t sasoc_local_rwnd;//存放本地SCTP协议栈当前通告对端的接收窗口。不能设置,只能获取。
u_int32_t sasoc_cookie_life//存放送给对端的状态cookie以毫秒为单位的有效期
};
3.SCTP _AUTOCLOSE 套接字选项
-
选项允许获取或设置一 个SCTP端点的自动关闭时间。自动关闭时间是个SCTP关联在空闲时保持打开的秒数。
-
SCTP协议栈把空闲定义为一个关联的两个端点都没有在发送或接收用户数据的状态。自动关闭功能默认是禁止的。自动关防选项意在用于一 到多式SCTP接口 。
-
设置本选项时,传递给它的整数值为某个空闲关联被自动关防前的持续秒数,值为0表示禁止自动关闭。本选项仅仅影响由相应本地端点将来创建的关联,已有关联保持它们的现行设置不变。
-
自动关闭功能可由服务器用来强制关闭空闲的关联,服务器无需为此维护额外的状态。
-
使用本特性的服务器应该仔细估算它的所有关联预期的最长空闲时间。自动关闭时间设置过短会导致关联的过早关闭。 .
4.SCTP _DEFAULT_SEND_PARAM 套接字选项
- SCTP有许多可选的发送参数,它们通常作为辅助数据传递,或者由
sctp_sendrnsg
函数使用 (sctp_sendrnsg
通常作为库函数实现,它替用户传递辅助数据) - 希望发送大量消息且所有消息具有相同发送参数的应用进程可以使用本选项设置默认参数,从而避免使用辅助数据或执行
sctp_sendrnsg
调用。
sctp_sndrcvinfo结构:
struct sctp_sndrcvinfo{
u_int16_t sinfo_stream; //指定新的默认流,所有外出消息将被发送到该流中。
u_int16_t sinfo_ssn; // 在设置默认发送参数时被忽略。当使用recvmsg或sctp_recvmsg函数接收消息时,本字段将存放由对端置于SCTPDATA块的流序号(SSN)字段中的值。
u_int16_t sinfo_flags; //指定新的默认标志,它们将应用于所有消息发送。
u_int32_t sinfo_ppid; // 指定将置于所有外出消息中的SCTP净荷协议标识字段的默认值。
u_int32_t sinfo_context;//指定新的默认上下文。本字段是个本地标志,用于检索无法发送到对端的消息。
u_int32_t sinfo_timetolive;//指定新的默认生命期,它将应用于所有消息发送。SCTP协议栈使用本字段判定何时丢弃(尚未执行首次传送就)因过度拖延而失效的外出消息。如果同关联的两个跺点都支待部分可靠性选项,那么本生命期也用千指定完成首次传送后的消息的继续有效期。
u_int32_t sinfo_tsn; //在设置默认发送参数时被忽略。当使用recvmsg或sctp_recvmsg函数接收消息时,本字段将存放由对端置于SCTPDATA块的传输序(TSN)字段中的值
u_int32_t sinfo_cumtsn;//在设赏默认发送参数时被忽略。当使用recvmsg或sctp_recvmsg函数接收消息时,本字段将存放本地SCTP协议栈已与对端挂钩的当前累积TSN。
sctp_assoc_t sinfo_assoc_id;//指定请求者希望对其设置默认参数的关联标识.对于一到一式套接字,本字段被忽略 。
}
注:所有默认设置只影响没有指定sctp_sndrcvinfo
结构的消息发送。指定了该结构的消息发送(例如带辅助数据的sctp_sendmsg或sendmsg函数调用)将覆写默认设置 。除了进行默认设置,通过使用sctp_opt_info
函数,本选项也可用于获取当前的默认设置。
5.SCTP _DISABLE_FRAGMENTS套接字选项
SCTP通常把太大而不适合置于单个SCTP分组中的用户消息分割成多个DATA块。本选项将在发送端禁止这种行为。SCTP的默认行为与本选项被禁止等效,也就是说,SCTP通常会对用户消息执行分片。
6.SCTP_EVENTS套接字选项
-
本套接字选项允许调用者获取、开启或禁止各种SCTP通知,SCTP通知是由SCTP协议栈发送给应用进程的消息。
-
读取只需把
recvmsg
函数的msghdr
结构参数中的msg_flags
字段设置为MSG_NOTIFICATION
。 -
不准备使用
recvmsg
或sctp_recvmsg
函数应用进程不应该开启串件通知功能。 -
使用本选项传递 一 个
sctp_event_subscribe
结构就可以预订8类事件的通知。其中各0表示不预订1表示预订。
struct sctp_event_subscribe{
u_int8_t sctp_data_io_event;
u_int8_t sctp_association_event;
u_inc8_t sctp_address_event;
u_int8_t sctp_send_failure_event;
u_int8_t sctp_peer_error_event;
u_int8_t sctp_shutdown_event;
u_int8_t sctp_parcial_delivery_event;
u_int8_t sctp_adaption_layer_event;
}
7.SCTP _GET_PEER_ADDR_工NFO套接字选项
- 本选项仅用于获取某个给定对端地址的相关信息,包括拥塞窗口、平滑化后的RTT和MTU等。
- 调用者在其中的
spinfo_address
字段填入待查询的对端地址,并且为了便于移植,应该使用sctp_opt_info
函数而不是getsockopt
函数。 - 用途1:把一个IP地址结构转换成一个可用十其他调用的关联标识。
- 用途2:由应用进程跟踪一个多宿对端主机每个地址的性能,并把相应关联的主目的地址更新为其中性能最佳的一个。这些值也同样有利于日志记录和程序调试。
sctp_paddrinfo结构的格式如下:
struct sctp_paddrinfo{
sctp_assoc_t spinfo_assoc_id; //存放关联标识
struct sockaddr_storage spinfo_address; //由调用者设置
int32_t spinfo_state;
u_int32_t spinfo_cwnd;//表示为所指定对端地址维护的当前拥塞窗口。
u_inc32_t spinfo_srtt; //表示就所指定对端地址而言的平滑化后RTT的当前估计值。
u_int32_t spinfo_rto; //表示用于所指定对端地址的当前重传超时值。
u_int32_t spinfo_mtu; //表示由路径MTU发现功能发现的通往所指定对端地址的路径MTU的当前值。
};
spinfo_state存放的常值:
8.SCTP_I_WANT_MAPPED_V4_ADDR套接字选项
- 标志套接字选项用于为
AF_INET6
类型的套接字开启或禁止IPv4映射地址,其默认状态为开启。 - 注意,本选项开启时,所有IPv4地址在送往应用进程之前将被映射成一个IPv6地址。
- 本选项禁止时,SCTP套接字不会对IPv4地址进行映射,而是作为
sockaddr_in
结构直接传递。
9.SCTP_INITMSG套接字选项
本套接字选项用于获取或设置某个SCTP套接字在发送INIT
消息时所用的默认初始参数。sctp_initmsg
结构如下:
struct sctp_initmsg{
uint16_t sinit_num_ost:reams;//表示应用进程想要请求的外出SCTP流的数目
uint16_t sinit_max__instreams; //表示应用进程准备允许的外来SCTP流的最大数目。如果该值大千SCTP协议栈所支持的最大允许流数,那么它将被改为这个最大数。
uint16_t sinit_rnax_atc.empts; //表示SCTP协议栈应该重传多少次初始INIT消息才认为对端不可达。
uint16_t sinit_rnax_init_timeo;//表示用于INIT定时器的最大RTO值。在初始定时器进行指数退避期间,该值将替代RTO.rnax作为重传RTO极限。该值以毫秒为单位。
}
注意,当设置这些字段时,SCTP将忽略其中的任何0值。一到多式套接字的用户在关联隐性建立期间也可能在辅助数据中传递一个sctp_initmsg
结构。
10.SCTP _MAXBURST套接字选项
-
本套接字选项允许应用进程获取或设置用于分组发送的最大猝发大小。当SCTP向对端发送数据时,一次不能发送多于这个数目的分组,以免网络被分组淹没。
-
具体SCTP实现有两种方法应用这个限制:(1)把拥塞窗口缩减为当前飞行大小加上最大猝发大小与路径MTU的乘积;(2)把该值作为一个独立的微观控制量,在任意一个发送机会最多只发送这个数目的分组。
11.SCTP_MAXSEG套接字选项
-
本套接字选项允许应用进程获取或设宜用于SCTP分片的最大片段大小。
-
当某个SCTP发送端从其应用进程收到一个大于这个大小的消息时,它将把该消息分割成多个块,以便分别传送到对端。
-
SCTP发送端通常使用的这个大小是通达它的对端的所有路径各自的MTU中的最小值(每条路径对应一个对端地址)。设置本选项可以把这个大小降低到所指定的值。
-
注意,SCTP可能以比本选项所诸求的值更小的边界分割消息。当通达对端的某条路径的MTU变得比本选项所请求的值还要小时,这种偏小的分割就会发生。
-
最大片段大小是一个端点范围的设置,在一到多式接口中,它可能影响不止一个关联。
12.SCTP_NODELAY套接字选项
开启本选项将禁止SCTP的Nagle算法。本选项默认关闭(也就是说默认情况下Nagle算法是启动的)。
SCTP的Nagle算法与TCP的Nagle算法工作原理相同,区别在于前者对付多个DATA块,后者对付单个流上的字节
13.SCTP _PEER_ADDR_PARAMS套接字选项
本套接字选项允许应用进程获取或设置关于某个关联的对端地址的各种参数。选项sctp_paddrparams
结构定义如下:
//调用者必须在该结构中填写关联标识和/或一个对端地址,
struct sctp_paddrparam{
sctp_assoc_t spp_assoc_id; //存放在其上获取或设置参数信息的关联标识。如果该值为0,那么所访问的是端点默认参数,而不是特定于关联的参数。
struct sockaddr_storage spp_address;//指定其参数待获取或待设置的对端IP地址。如果spp_assoc_id字段值为O, 那么本字段被忽略。
u_int32_t spp_hbinterval; //表示心搏间隔时间。设萱该值为SCTP_NO_HB将禁止心搏,为SCTP_ISSUE_HB将按请求心搏,为其他值则将把心搏间隔重置为以毫秒为单位的新值。设置端点默认参数时,不能使用SCTP_ISSUE_HB这个值。
u_int16_t spp_pathmaxrxt; //表示在声明所指定对端地址为不活跃之前将尝试的重传次数。当主目的地址被声明为不活跃时,另外一个对端地址将被选为主目的地址。
};
14.SCTP _PRIMARY_ADDR套接字选项
本套接字选项用于获取或设置本地端点所用的主目的地址。主目的地址是本端发送给对端的所有消息的默认目的地址。
sctp_setprim
结构定义如下:
//调用者必须在该结构中填写关联标识,若是设置主目的地址则再填写一个将用作主目的地址的对端地址
struct stcp_setprim{
sctp_assoc_t ssp_assoc_id;//存放在其上获取或设置当前主目的地址的关联标识。对于一到一式套接字,本字段被忽略。
struct sockaddr_storage ssp_addr;//指定主目的地址(主目的地址必须是一个属于对端的地址)。使用setsockopt函数设置本选项时,本字段为请求者要求设置的主目的地址的新值,使用getsockopt函数获取本选项时,本字段为当前所用主目的地址的值。
};
//注:在只有一个本地地址与之关联的到一到一式套接字上获取本选项的值跟直接调用getsockname是相同的。
15.SCTP_RTOINFO套接字选项
本套接字选项用于获取或设置各种RTO信息,它们既可以是关于某个给定关联的设置,也可以是用于本地端点的默认设置。
为了便于移植,当获取信息时,调用者应该使用sctp_opt_info
函数而不是getsockopt
函数。是sctp_rtoinfo
结构定义如下:
struct sctp_rtoinfo{
sctp_assoc_t srto_assoc_id;//存放感兴趣关联的标识或0。若值为0,当前函数调用会对系统的默认参数产生影响。
sctp_assoc_t srto_initial;//存放用于对端地址的初始RTO值。初始RTO值在向对端发送INIT块时使用。该值以亳秒为单位且默认值为3000。
uint32_t srto_max;//存放在更新重传定时器时使用的最大RTO值。如果更新后的RTO值大于这个RTO最大值,那就把这个最大值作为新的RTO值。该值默认为60000。
uint32_t srto_min;//存放在启动重传定时器时使用的最小RTO值。任何时候RTO定时器一旦更改,就对照这个RTO最小值检查新值。如果新值小于最小值,那就把这个最小值作为新的RTO值。该值默认为1000。
}
//srto_initial、srto_max或srto_min值为0表示当前设定的默认值不应改变。
//所有时间值都以毫秒为单位。
16.SCTP _SET_PEER_PRIMARY_ADDR套接字选项
设置本套接字选项导致发送一个消息:请求对端把所指定的本地地址作为它的主目的地址。
sctp_setpeerprim
结构定义如下:
//用者必须在该结构中填写关联标识和一个请求对端标为其主目的地址的本地地址。这个本地地址必须已经绑定在本地端点。
struct sctp_setpeerprim{
sctp_assoc_t sspp_assoc_id;//指定在其上想要设笠主目的地址的关联标识。对于一到一式套接字,本字段被忽略。
struct sockaddr_storage sspp_addr;//r存放想要对端设置为主目的地址的本地地址。
};
//本特性是可选的,只有两端均支持才能运作。 如果本地端点不支持本特性,那就给调用者EOPNOTSUPP返回错误。
//如果远程端点不支持本特性,那就返回调用者EINVAL错误。
//本套接字选项只能设置,不能获取。
17.SCTP_STATUS套接字选项
本套接字选项用于获取某个SCTP关联的状态。为了便于移植,调用者应该使用sctp_opt_info
函数而不是getsockopt
函数。
sctp_status结构的格式如下:
//调用者必须在该结构中填写关联标识&#