网络编程学习(六)

SCTP是一个可靠的面向消息的协议,在端点之间提供多个流,并为多宿提供传输级支持。

尽管SCTP和TCP之间存在一些本质性的差别,然而SCTP的一到一接口与TCP提供的应用接口非常接近。

SCTP套接字分为:一到一套接字;一到多套接字

一到一套接字对应一个单独的SCTP关联。这种映射类似于TCP套接字和TCP连接的对应关系。

对于一到多套接字,一个给定套接字上可以同时有多个活跃的SCTP关联。这种映射类似于绑定了某个特定端口的UDP套接字能够从若干个同时在发送数据的远程UDP端点接受彼此交错的数据报。

对于一对多套接字:

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_EVENTS套接字选项显示禁止它们。默认情况下启动的唯一事件是sctp_data_io_event,它给recvmsg和sctp_recvmsg调用提供辅助数据。这个默认设置同时适用于一到一形式和一到多形式。


在SCTP中,一个一到多套接字也能够结合使用sctp_peeloff函数以允许组合迭代服务器模型和并发服务器模型

1.sctp_peeloff函数用于从一个一到多套接字剥离出某个特定的关联,独自构成一个一到一式套接字

2.剥离出的关联所在的一到一套接字随后就可以遣送给自己的线程,或者遣送给为它派生的进程

3.与此同时,主线程继续在原来的套接字上以迭代方式处理来自任何剩余关联的消息

一到一式套接字是一个类型为SOCK_STREAM,协议为IPPROTO_SCTP的网际网套接字(即协议族为AF_INET或AF_INET6)

一到多式套接字是一个类型为SOCK_SEQPACKET,协议为IPPROTO_SCTP的网际网套接字(即协议族为AF_INET或AF_INET6)


如果在一个监听套接字上执行sctp_bindx调用,那么将来产生的关联将使用新的地址配置,已经存在的关联则不受影响。

传递给sctp_bindx的两个标志是互斥的,如果同时指定,调用就会失败,返回的错误码为EINVAL。所有套接字地址结构的端口号必须相同,而且必须与已经绑定的端口号相匹配,否则调用就会失败,返回EINVAL错误码。

如果一个端点支持动态地址特性,指定SCTP_BINDX_ADD_ADDR或SCTP_BINDX_REM_ADDR标志调用sctp_bindx将导致该端点向对端发送一个合适的消息,以修改对端的地址列表。由于增减一个已连接关联的地址只是一个可选的功能,因此不支持本功能的实现将返回EOPNOTSUPP。注意,本功能正确操作要求两个端点都支持这个特性(对于支持动态接口供给的系统可能有用)


sctp_connectx函数用于连接到一个多宿对端主机

sctp_getpaddrs函数可以知道对端的所有地址(getpeername,当用于SCTP时它仅仅返回主目的地址)

sctp_freepaddrs函数释放由sctp_getpaddrs函数分配的资源

sctp_getpaddrs函数用于获取属于某个关联的本地地址

sctp_freeladdrs函数释放由sctp_getpaddrs函数分配的资源

通过使用伴随辅助数据的sendmsg函数,应用进程能够控制SCTP的各种特性。sctp_sendmsg的使用者则以指定更多参数为代价简化了发送方法,这种方法比分配必要的辅助数据空间并在msghdr结构中设置合适的结构容易些。注意,如果实现把sctp_sendmsg函数映射成sendmsg函数,那么sendmsg的flags参数被设为0。

与sctp_sendmsg一眼,sctp_recvmsg函数也为SCTP的高级特性提供一个更方便用户的接口。使用本函数不仅能获取对端的地址,也能获取通常伴随recvmsg函数调用返回的msg_flags参数(例如MSG_NOTIFICATION和MSG_EOR等)。本函数也允许获取已读入消息缓冲区中的伴随所接受消息的sctp_sndrcvinfo结构。注意,如果应用进程想要接受sctp_sndrcvinfo信息,那么必须使用SCTP_EVENTS套接字选项预定sctp_data_io_event(默认情况下开启)。

同样需要注意,如果实现把sctp_recvmsg函数映射成recvmsg函数,那么recvmsg的flags参数被设为0。

sctp_opt_info函数是为无法为SCTP使用getsockopt函数的那些实现提供的。getsockopt无法支持SCTP的原因在于有些SCTP套接字选项(例如SCTP_STATUS)需要一个入出(in_out)变量传递关联标识。

对于无法为getsockopt函数提供入出变量的系统来说,只能使用sctp_opt_info函数。对于FreeBSD之类允许在套接字选项中使用出入变量的系统来说,sctp_opt_info是一个把参数重新包装到合适的getsockopt调用中的库函数。从可移植性考虑,应用程序应该对需要入出变量的所有选项(7.10)使用sctp_opt_info函数。

sctp_peeloff 有可能从一个一到多式套接字中抽取一个关联,构成单独一个一到一式套接字。其语义很想带有一个额外参数的accept函数。


SCTP shutdown函数的howto参数语义:

SHUT_RD 与TCP相同

SHUT_WR 禁止后续发送操作,激活SCTP关联终止过程,以此终止当前关联。注意,本操作不提供半关闭状态,不过允许本地端点读取已经排队的数据,这些数据是对端在收到SCTP的SHUTDOWN消息之前发送给本端的

SHUT_RDWR 禁止所有read操作和write操作,激活SCTP关联终止过程。传送到本地端点的任何已经排队的数据都得到确认,然后悄然丢弃。


通知:

SCTP_ASSOC_CHANGE 告知应用进程关联本身发生变动:或者已开始一个新的关联,或者已结束一个现有的关联

SCTP_PEER_ADDR_CHANGE 告知对端的某个地址经历了状态变动。这种变动既可以是失败性质(例如目的地不对所发送的消息作出响应),也可以是恢复性质(例如早先处于故障状态的某个目的地恢复正常)。

SCTP_REMOTE_ERROR 远程端点可能给本地端点发送一个操作性错误消息。这些消息可以指示当前关联的各种出错条件。当开启本通知时,整个错误块将以内嵌格式传递给应用进程。

SCTP_SEND_FAILED 无法递送到对端的消息通过本通知送回用户。本通知之后不久通常跟有一个关联故障通知。大多数情况下一个消息不能被递送的唯一原因是关联已经失效。关联有效前提下消息递送失败的唯一情况是使用了SCTP的部分可靠性扩展。

SCTP_SHUTDOWN_EVENT 当对端发送一个SHUTDOWN块到本地端点时,本通知被传递给应用进程。本通知告知应用进程在相应套接字上不再接受新的数据。所有当前已排队的数据将被发送出去,发送完毕后相应关联就被终止。

SCTP_ADAPTION_INDICATION 有些实现支持适应层指示参数。该参数在INIT和INIT-ACK中交换,用于通知对端将执行什么类型的应用适应行为。

SCTP_PARTIAL_DELIVERY_EVENT 部分传递应用程序接口用于经由套接字缓冲区向用户传递大消息。能够如此递送消息的实现称为具备部分递送API。

pdapi_indication存放发生的事件,目前该字段的唯一有效值是SCTP_PARTIAL_DELIVERY_ABORTED,它指出当前活跃的部分递送已被终止。

部分递送API由SCTP实现如此调用:置空msg_flags字段发送一个消息的各部分数据,直到准备递送最后一部分数据为止。发送最后一部分数据时把msg_flags字段设置为MSG_EOR。注意,如果应用进程准备接受大消息,那就应该使用recvmsg或sctp_recvmsg,以便查看msg_flags字段确定是否出现本条件。


SCTP为应用程序开发人员提供了两个接口式样:为便于移植到SCTP而基本上与现有TCP应用程序兼容的一到一式,以及允许发挥SCTP所有特性的一到多式。sctp_peeloff函数提供了从一种式样的关联中抽取出另一种式样的关联的一种方法。SCTP还提供了不少传输事件通知,应用进程可以预定它们。这些事件有助于应用进程更好地管理所维护的关联。


你可能感兴趣的:(网路编程)