SCTP 套接字选项

    在 获取和设置套接字选项一节中,我们了解到 SCTP 套接字支持多个选项,接下来就将对其一一介绍。
    ** SCTP_ADAPTION_LAYER
    在关联初始化期间,任何一个端点都可能指定一个适配层指示,该指示是一个 32 位的无符号整数,可由两端的应用进程用来协调任何本地应用适配层。本选项允许调用者获取或设置将由本端提供给对端的适配层指示。获取本选项的值时,调用者得到的是本地套接字将提供给对端的值。要获取对端的适配层指示,应用进程必须预定适配层事件。
    ** SCTP_ASSOCINFO
    本选项可用于以下三个目的:(a)获取关于某个现有关联的信息,(b)改变某个已有关联的参数,(c)为未来的关联设置默认信息。在获取关于某个现有关联的信息时,应该使用 sctp_opt_info 函数而不是 getsockopt 函数。
    作为本选项的输入的是如下的 sctp_assocparams 结构。
struct sctp_assocparams{
    sctp_assoc_t  sasoc_assoc_id;
    u_int16_t     sasoc_asocmaxrxt;
    u_int16_t     sasoc_number_peer_destinations;
    u_int16_t     sasoc_peer_rwnd;
    u_int16_t     sasoc_local_rwnd;
    u_int32_t     sasoc_cookie_life;
};

    其中各字段的含义如下。
    ·sasoc_assoc_id:存放待访问关联的标识(即关联 ID)。如果在调用 setsockopt 时置 0 本字段,那么 sasoc_asocmaxrxt 和 sasoc_cookie_life 字段代表将作为默认信息设置在相应套接字上的值。如果在调用 getsockopt 时提供关联 ID,返回的就是特定于该关联的信息,否则如果置 0 本字段,返回的就是默认的端点设置信息。
    ·sasoc_asocmaxrxt:存放某个关联在已发送数据没有得到确认的情况下尝试重传的最大次数。
    ·sasoc_number_peer_destinations:存放对端目的地址数,不能设置,只能获取。
    ·sasoc_peer_rwnd:存放对端的当前接收窗口,是动态的,只能获取。
    ·sasoc_local_rwnd:存放本地 SCTP 协议栈当前通过对端的接收窗口,是动态的,并受 SO_SNDBUF 套接字选项的影响,也只能获取。
    ·sasoc_cookie_life:存放发送给对端的状态 cookie 以毫秒为单位的有效期。为了防止重放攻击,每个随 INIT-ACK 块送给对端的状态 cookie 都关联有一个生命期。原本默认为一分钟的生命期可以通过设置 sasoc_assoc_id 为 0 并设置本选项加以修改。
    ** SCTP_AUTOCLOSE
    本选项允许获取和设置一个 SCTP 端点的自动关闭时间,即一个 SCTP 关联在空闲时保持打开的秒数。自动关闭选项默认是禁止的,其意在用于一到多式 SCTP 接口。当设置本选项时,传递给它的整数值为某个空闲关联被自动关闭前的持续秒数,值为 0 表示禁止自动关闭。本选项仅影响由相应本地端点将来创建的关联,已有关联的设置保持不变。
    ** SCTP_DEFAULT_SEND_PARAM
    SCTP 有许多可选的发送参数,它们通常作为辅助数据传递,或者由 sctp_sendmsg 函数使用。希望发送大量消息且所有消息具有相同发送参数的应用进程可以使用本选项设置默认参数,从而避免使用辅助数据或调用 sctp_sendmsg。本选项接受 sctp_sndrcvinfo 结构。
struct sctp_sndrcvinfo{
    u_int16_t     sinfo_stream;
    u_int16_t     sinfo_ssn;
    u_int16_t     sinfo_flags;
    u_int32_t     sinfo_ppid;
    u_int32_t     sinfo_context;
    u_int32_t     sinfo_timetolive;
    u_int32_t     sinfo_tsn;
    u_int32_t     sinfo_cumtsn;
    sctp_assoc_t  sinfo_assoc_id;
};

    其中各字段的含义如下。
    ·sinfo_stream:指定新的默认流,所有外出消息都将被发送到该流中。
    ·sinfo_ssn:在设置默认发送参数时被忽略。当使用 recvmsg 或 sctp_recvmsg 函数接收消息时,本字段将存放由对端置于 SCTP DATA 块的流序号(stream sequence number)字段中的值。
    ·sinfo_flags:指定新的默认标志,它们将应用于所有消息发送。下图是可取的值。

    ·sinfo_ppid:指定将置于所有外出消息中的 SCTP 净荷协议标识(payload protocol identifier)字段的默认值。
    ·sinfo_context:指定新的默认上下文。这是一个本地标志,用于检测无法发送到对端的消息。
    ·sinfo_timetolive:指定新的默认生命期,它将应用于所有消息发送。SCTP 协议栈使用本字段判定何时丢弃(尚未执行首次传送就)因过度拖延而失效的外出消息。如果同一关联的两个端点都支持部分可靠性(partial reliability)选项,则本生命期也用于指定完成首次传送后的消息的继续有效期。
    ·sinfo_tsn:同 sinfo_ssn,不过存放的是 SCTP DATA 块的传输序号字段中的值。
    ·sinfo_cumtsn:同 sinfo_tsn,不过存放的是本地 SCTP 协议栈已与对端挂钩的当前累计 TSN。
    ·sinfo_assoc_id:指定请求者希望对其设置默认参数的关联标识。一到一式套接字会忽略本字段。
    注意,所有默认设置都只影响没有指定 sctp_sndrcvinfo 结构的消息发送。指定了该结构的消息发送(如带有辅助数据的 sctp_sendmsg 或 sendmsg 调用)将覆盖默认设置。除了进行默认设置,本选项还可通过 sctp_opt_info 函数获取当前的默认设置。
    ** SCTP_DISABLE_FRAGMENTS
    开启本选项可以禁止 SCTP 把太大而不适合置于单个 SCTP 分组中的用户消息分割成多个 DATA 块。之后对于过大的消息,SCTP 将向用户发送 EMSGSIZE 错误,并且不发送用户消息。那些希望自己控制消息大小的应用进程可以使用本选项,以便确保每个用户消息都适合置于单个 IP 分组中,但它们同时也必须准备好处理消息过大的出错情况。
    ** SCTP_EVENTS
    本选项允许调用者获取、开启或禁止各种 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_int8_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_partial_delivery_event;
    u_int8_t sctp_adaption_layer_event;
};

    下表汇总了这些事件,更多细节会在后面介绍。

    ** SCTP_GET_PEER_ADDR_INFO
    本选项仅用于获取某个给定对端地址的相关信息,包括拥塞窗口、平滑化后的 RTT 和 MTU 等,它使用如下的 sctp_paddrinfo 结构。
struct sctp_paddrinfo{
    sctp_assoc_t     apinfo_assoc_id;
    struct sockaddr_storage    spinfo_address;
    int32_t    spinfo_state;
    u_int32_t  spinfo_cwnd;
    u_int32_t  spinfo_srtt;
    u_int32_t  spinfo_rto;
    u_int32_t  spinfo_mtu;
};

    其中返回给调用者的各个字段的含义如下。
    ·spinfo_assoc_id 存放关联标识,它和通信开始 SCTP_COMM_UP 通知中提供的信息一致。
    ·spinfo_address 由调用者设置,用于告知 SCTP 套接字想要获取的对端地址的信息。调用返回时不应该改变其值。
    ·spinfo_state 存放下表所示的一个或多个常值,表示 SCTP 对端地址状态。

     其中未证实地址表示一个对端已作为有效地址列出,而本地 SCTP 端尚不能证实对端持有它的地址,直到发往该地址的心搏或用户数据得到确认为止。未证实的地址没有有效的重传超时值(retransmission timeout, RTO)。
    ·spinfo_cwnd 表示所指定的对端地址维护的当前拥塞窗口。
    ·spinfo_srtt 表示就所指定对端地址而言的平滑化后 RTT 的当前估计值。
    ·spinfo_rto 表示用于所指定对端地址的当前重传超时值。
    ·spinfo_mtu 表示由路径 MTU 发现功能发现的通往对端地址的路径 MTU 的当前值。
    本选项的一个有意思的用途是:把一个 IP 地址结构转换成一个可用于其他调用的关联标识。另一个可能用途是:由应用进程跟踪一个多宿对端主机每个地址的性能,并把相应关联的主目的地址更新为其中性能最佳的一个。这些值同样有利于日志记录和调试。
    ** SCTP_I_WANT_MAPPED_V4_ADDR
    本选项用于为 AF_INET6 类型的套接字开启或禁止 IPv4 映射地址,默认为开启。开启本选项时,所有 IPv4 地址在送往应用进程之前将被映射成一个 IPv6 地址,否则就以 sockaddr_in 结构直接传递。
    ** SCTP_INITMSG
    本选项用于获取或设置某个 SCTP 套接字在发送 INIT 消息时所用的默认初始参数,其使用的 sctp_initmsg 结构定义如下。
struct sctp_initmsg{
    uint16_t sinit_num_ostreams;
    uint16_t sinit_max_instreams;
    uint16_t sinit_max_attempts;
    uint16_t sinit_max_init_timeo;
};

    其中各字段的含义如下。
    ·sinit_num_ostreams 表示应用进程想要请求的外出 SCTP 流的数目。该值要等到相应关联完成初始握手后才得到确认,而且可能因为对端的限制而向下协调。
    ·sinit_max_instreams 表示应用进程准备允许的外来 SCTP 流的最大数目,但不会超过 SCTP 协议栈所支持的最大允许流数。
    ·sinit_max_attempts 表示 SCTP 协议栈应该重传多少次初始 INIT 消息才认为对端不可达。
    ·sinit_max_init_timeo 表示用于 INIT 定时器的最大 RTO 值。在初始定时器进行指数退避期间,该值将代替 RTO.max 作为重传 RTO 极限。该值以毫秒为单位。
    注意,当设置这些字段时,SCTP 将忽略其中的任何 0 值。一到多式套接字的用户在关联隐性建立期间也可能在辅助数据中传递一个 sctp_initmsg 结构。
    ** SCTP_MAXBURST
    本选项用于获取或设置分组发送的最大猝发大小。当 SCTP 向对端发送数据时,一次不能发送多于这个数目的分组,以免网络被分组淹没。
    ** SCTP_MAXSEG
    本选项用于获取或设置 SCTP 分片的最大片段大小,类似于 TCP 的 TCP_MAXSEG 选项。SCTP 发送端使用的这个大小通常是通达它的对端的所有路径各自的 MTU 中的最小值。
    ** SCTP_NODELAY
    开启本选项将禁止 SCTP 的 Nagle 算法(该算法默认开启)。SCTP 的 Nagle 算法与 TCP 的类似,区别在于前者对付多个 DATA 块,后者对付单个流上的字节。
    ** SCTP_PEER_ADDR_PARAMS
    本选项可以获取或设置关于某个关联的对端地址的各种参数,与之相关的是如下的 sctp_padrparams 结构,调用者必须在该结构中填写关联标识和/或一个对端地址。
struct sctp_paddrparams{
    sctp_assoc_t spp_assoc_id;
    struct sockaddr_storage spp_address;
    u_int32_t spp_hbinterval;
    u_int16_t spp_pathmaxrxt;
};

    其中各字段的含义如下。
    ·spp_assoc_id 存放要在其上获取或设置参数信息的关联标识。如果该值为 0,那么所访问的是端点默认参数,而不是特定于关联的参数。
    ·spp_address 指定对端 IP 地址,如果 spp_assoc_id 字段为 0,则忽略该字段。
    ·spp_hbinterval 表示心搏间隔时间。设置该值为 SCTP_NO_HB 将禁止心搏,为 SCTP_ISSUE_HB 将按请求心搏,为其他值则将把心搏间隔重置为以毫秒为单位的新值。设置端点默认参数时,不能使用 SCTP_ISSUE_HB 这个值。
    ·spp_pathmaxrxt 表示在声明所指定对端地址为不活跃之前将尝试的重传次数。当主目的地址被声明为不活跃时,另外一个对端地址将被选为主目的地址。
    ** SCTP_PRIMARY_ADDR
    本选项用于获取或设置本地端点所用的主目的地址,其使用如下的 sctp_setprim 结构,调用者必须填写其中的关联标识,若是设置主目的地址则再填写一个将用作主目的地址的对端地址。
struct sctp_setprim{
    sctp_assoc_t    ssp_assoc_id;
    struct sockaddr_storage ssp_addr;
};

    ·ssp_assoc_id 存放关联标识。对于一到一式套接字,本字段会被忽略。
    ·ssp_addr 存放获取到的或将要设置的主目的地址。
    ** SCTP_RTOINFO
    本选项用于获取或设置各种 RTO 信息,它们既可以是关于某个给定关联的设置,也可以是用于本地端点的默认设置。为便于移植,应该使用 sctp_opt_info 函数而非 getsockopt 函数来获取信息。该选项使用如下的 sctp_rtoinfo 结构。
struct sctp_rtoinfo{
    sctp_assoc_t    srto_assoc_id;
    uint32_t        srto_initial;
    uint32_t        srto_max;
    uint32_t        srto_min;
};

    ·srto_assoc_id 存放关联标识或 0。若为 0,则当前函数调用会影响系统的默认参数。
    ·srto_initial 存放用于对端地址的初始 RTO 值。初始 RTO 值在向对端发送 INIT 块时使用,该值以毫秒为单位且默认值为 3000。
    ·srto_max 存放在更新重传定时器时使用的最大 RTO 值,默认为 60000。
    ·srto_min 存放在启动重传定时器时使用的最小 RTO 值,默认为 1000。
    srto_initial、srto_max 和 srto_min 的值为 0 都表示当前设定的默认值不变。
    ** SCTP_SET_PEER_PRIMARY_ADDR
    设置本选项会请求对端把所指定的本地地址作为它的主目的地址,这个特性只有两端均支持才能运作。如果本端不支持,会返回 EOPNOTSUPP 错误,对端不支持则返回 EINVAL 错误。而且本选项只能设置,不能获取。它使用如下的 sctp_setpeerprim 结构。
struct sctp_setpeerprim{
    sctp_assoc_t    sspp_assoc_id;
    struct sockaddr_storage sspp_addr;
};

    ·sspp_assoc_id 指定关联标识。对于一对一式套接字,本字段被忽略。
    ·sspp_addr 存放想要对端设置为主目的地址的本地地址。
    ** SCTP_STATUS
    本选项可用于获取某个 SCTP 关联的状态。为便于移植,调用者应该使用 sctp_opt_info 函数代替 getsockopt 函数来设置。它使用如下的 sctp_status 结构,调用者必须填写其中的关联标识,关于这个关联的信息将在返回时被填写到其中的各个字段中。
struct sctp_status{
    sctp_assoc_t sstat_assoc_id;
    int32_t      sstat_state;
    u_int32_t    sstat_rwnd;
    u_int16_t    sstat_unackdata;
    u_int16_t    sstat_penddata;
    u_int16_t    sstat_instrms;
    u_int16_t    sstat_outstrms;
    u_int32_t    sstat_fragmentation_point;
    struct sctp_paddrinfo    sstat_primary;
};

    ·sstat_assoc_id 存放关联标识。
    ·sstat_state 存放下表所示的常值之一,指出关联的总体状态。

    ·sstat_rwnd 存放对对端接收窗口的当前估计。
    ·sstat_unackdata 存放等着对端处理的未确认 DATA 块数目。
    ·sstat_penddata 存放本端暂存并等着应用进程读取的未读 DATA 块数目。
    ·sstat_instrms 存放对端用于向本端发送数据的流的数目。
    ·sstat_outstrms 存放本端可用于向对端发送数据的流的数目。
    ·sstat_fragmentation_point 存放本地 SCTP 端点将其用作用户消息分割点的当前值。该值通常是所有目的地址的最小 MTU,或者是由本地应用进程使用 SCTP_MAXSEG 选项设置的更小的值。
    ·sstat_primary 存放当前的主目的地址。

猜你喜欢

转载自aisxyz.iteye.com/blog/2408978
今日推荐