SCTP 套接字编程基础概念

    SCTP 套接字分为一到一套接字和一到多套接字。提供一到一形式的目的是为了方便将现有 TCP 应用程序移植到 SCTP 上,其交互方式类似于 TCP 套接字,只是其建立连接时需要经过四路握手。一到一式 SCTP 套接字是一个类型为 SOCK_STREAM,协议为 IPPROTO_SCTP 的网际网套接字(即协议族为 AF_INET 或 AF_INET6),而一到多式 SCTP 套接字是一个类型为 SOCK_SEQPACKET,协议为 IPPROTO_SCTP 的网际网套接字。
    一到多式 SCTP 套接字可使服务器程序无需管理大量的套接字描述符,单个套接字描述符将代表多个关联,就像一个 UDP 套接字能够从多个客户接收消息那样。在一到多式套接字上,用于标识单个关联的是一个类型为 sctp_assoc_t 的关联标识,它通常是一个不透明的整数值,应用进程不应该使用不是由内核先前给予的任何关联标识。一到多式套接字的用户应该注意以下几点。
    (1)当一个客户关闭其关联时,其服务器也将自动关闭同一个关联,服务器主机内核中不再有该关联的状态。
    (2)可用于在四路握手的第三个或第四个分组中捎带用户数据的唯一办法就是使用一到多形式。
    (3)对于一个与它还没有关联存在的 IP 地址,任何以它为目的地的 sendto、sendmsg 或 sctp_sendmsg 都将尝试主动打开,以建立一个与该地址的新关联。这种行为的发生与执行分组发送的这个应用进程是否曾调用过 listen 函数以请求被动打开无关。
    (4)用户必须使用 sendto、sendmsg 或 sctp_sendmsg 这三个分组发送函数,而不能使用 send 或 write,除非已经使用 sctp_peeloff 函数从一个一到多式套接字剥离出一个一到一式套接字。
    (5)任何时候调用其中任何一个分组发送函数时,所用的目的地址是由系统在关联建立阶段选定的主目的地址,除非调用者在所提供的 sctp_sndrcvinfo 结构中设置了 MSG_ADDR_OVER 标志。为了提供这个结构,调用者必须使用伴随辅助数据的 sendmsg 或 sctp_sendmsg 函数。
    (6)关联事件(即众多 SCTP 通知之一)可能被启用,因此要是不希望收到这些事件,就得使用 SCTP_EVENTS 套接字选项显示禁止它们。默认情况下启用的唯一事件是 sctp_data_io_event,它给 recvmsg 和 sctp_recvmsg 调用提供辅助数据。该默认设置同时适用于一到一形式和一到多形式。
    下图是一到多套接字典型用法的时间线图:服务器启动后打开一个套接字,bind 一个地址,调用 listen 监听关联,然后就调用 sctp_recvmsg 阻塞等待第一个消息的到达。客户启动后也打开一个套接字,并调用 sctp_sendto,它导致隐式建立关联,而数据请求由四路握手的第三个分组捎带给服务器。服务器收到该请求后进行处理并向客户发回一个应答,客户收到应答后关闭其套接字,从而终止其上的关联,服务器循环回去接收下一个消息。

    本例子展示的是一个迭代服务器。在 SCTP 中,一个一到多套接字也能够结合使用 sctp_peeloff 函数以允许组合迭代服务器模型和并发服务器模型,它们的关系如下。
    (1)sctp_peeloff 函数用于从一个一到多套接字剥离出某个特定的关联(例如一个长期持续的会话),独自构成一个一到一式套接字。
    (2)剥离出的关联所在的一到一套接字随后就可以派送给它自己的线程或进程。
    (3)主线程继续在原来的套接字上以迭代方式处理来自任何剩余关联的消息。

猜你喜欢

转载自aisxyz.iteye.com/blog/2407962