- 浏览: 142213 次
文章分类
最新评论
SCTP 提供了多种可用的通知,用户可经由这些通知追踪相关关联的状态。通知传递的是传输级的事件,包括网络状态变动、关联启动、远程操作错误以及消息不可递送。不论是一到一式还是一到多式接口,默认情况下除 sctp_data_io_event 外的所有事件都是禁止的。
使用SCTP 套接字选项一节中提到的 SCTP_EVENTS 选项可以预定 8 个事件,其中 7 个产生称为通知的额外数据,通知本身可经由普通的套接字描述符获取。当产生它们的事件发生时,这些通知就会内嵌在数据中加入到套接字描述符。在预订相应通知的前提下读取某个套接字时,用户数据和通知将在套接字缓冲区中交错出现,所以为了区分数据和通知,应该使用 recvmsg 或 sctp_recvmsg 函数。如果所返回的数据是一个事件通知,那么这两个函数返回的 msg_flags 参数将含有 MSG_NOTIFICATION 标志。
每种通知都采用标签-长度-值(tag-length-value,TLV)格式,其中前 8 个字节给出通知的类型和总长度。开启 sctp_data_io_event 事件将导致每次读入用户数据都收到一个 sctp_sndrcvinfo 结构。一般情况下这些信息通过调用 recvmsg 函数作为辅助数据获取,或者也可以利用 sctp_recvmsg 函数的 sctp_sndrcvinfo 结构来获取。通知的格式如下。
sn_header 字段用于解释类型值,以便译解出所处理的实际消息。下表给出了 sn_header.sn_type 的取值与 SCTP_EVENTS 套接字选项中使用的预订字段之间的对应关系。
每种通知都有各自的结构,给出了在传输中发生的相应事件的具体信息。
* SCTP_ASSOC_CHANGE
本通知告知应用进程关联本身发生变动:或者已开始一个新的关联,或者已结束一个现有的关联。它提供的信息定义如下。
其中 sac_state 给出关联上发生的事件类型状态,取如下值之一。
(1)SCTP_COMM_UP:表示某个新的关联刚刚启动,此时的内入流和外出流字段分别指出各自方向有多少流可用,关联标识字段给出这个关联在本地 SCTP 栈的唯一访问标识。
(2)SCTP_COMM_LOST:表示由关联标识字段给出的关联已经关闭,原因既可以是触发了某个不可达门限(例如本地 SCTP 端点多次超时触及门限,表明对端不再可达),也可以是对端执行了对于该关联的终止性关闭(通常使用 SO_LINGER 套接字选项或以 MSG_ABORT 标志使用 sendmsg)。特定于用户的消息将存放在本通知的 sac_info 字段中。
(3)SCTP_RESTART:表示对端已经重启。应用进程应该验证每个方向流的数目,因为这些值可能在重启过程中发生变动。
(4)SCTP_SHUTDOWN_COMP:表示由本地端点激发的关联终止过程(或者通过调用 shutdown 函数,或者通过以 MSG_EOF 标志使用 sendmsg 函数)已经结束。对于一到一式接口,收到本通知后,相应套接字描述符可再次用于连接到另一个对端。
(5)SCTP_CANT_STR_ASSOC:表示对端对于本端的关联建立尝试(例如 INIT 消息)未曾给出响应。
sac_error 存放导致本地关联变动的 SCTP 协议错误起因代码。sac_outbound_streams 和 sac_inbound_streams 存放本关联上每个方向协定的流数目。sac_assoc_id 存放本关联的唯一标识。sac_info 字段存放用户可用的其他信息,比如如果某个关联被对端的某个用户自定义错误终止,这个错误就会存放在该字段中。
* SCTP_PEER_ADDR_CHANGE
本通知告知对端的某个地址经历了状态变动,这种变动既可以是失败性质(例如目的地不对所发送的消息作出响应),也可以是恢复性质(例如早先处于故障状态的某个目的地恢复正常)。伴随地址变动的结构如下。
其中 spc_aaddr 字段存放本事件所影响的对端地址。spc_state 字段存放下表所示的值之一。
当一个地址被声明为 SCTP_ADDR_UNREACHABLE 状态时,发送到该地址的任何数据都会被重新路由到一个候选地址。另外,其中一些状态(如 SCTP_ADDR_ADDED 和 SCTP_ADDR_REMOVED)仅仅适用于支持动态地址选项的 SCTP 实现。
spc_error 存放用于提供关于事件更详细信息的通知错误代码,spc_assoc_id 存放关联标识。
* SCTP_REMOTE_ERROR
远程端点可能给本端发送一个操作性错误消息,这些消息可以指示当前关联的各种出错条件。当开启本通知时,整个错误块将以内嵌格式传递给应用进程。本消息的格式如下。
其中 sre_error 存放 SCTP 协议错误起因代码,sre_assoc_id 存放关联标识,sre_data 以内嵌格式存放完整的错误。
* SCTP_SEND_FAILED
无法递送到对端的消息会通过本通知送还给用户,这之后通常还会跟有一个关联故障通知。多数情况下一个消息不能被递送的唯一原因是关联已经失效,关联有效的前提下消息递送失败的唯一情况是使用了 SCTP 的部分可靠性扩展。它提供的结构如下。
其中 ssf_flags 可取以下两个值之一。
(1)SCTP_DATA_UNSENT:表示相应消息无法发送到对端(例如流控导致该消息无法在其生命期终止前送出)。
(2)SCTP_DATA_SENT:表示相应消息已经至少发送到对端一次,然而对端一直没有确认。
这种区分对于事务性协议可能比较重要,因为它们可能需要基于是否收到某个给定消息而采取不同的行为以恢复一个破裂的连接。ssf_error 字段若不为 0,则存放一个特定于本通知的错误代码,ssf_info 若有的话提供的是发送数据时传递给内核的信息(例如流数目、上下文等),ssf_assoc_id 存放关联标识,ssf_data 存放未能递送的消息本身。
* SCTP_SHUTDOWN_EVENT
本通知会在对端发送一个 SHUTDOWN 块到本地端点时传递给应用进程,它告知应用进程在相应套接字上不再接受新的数据。所有当前已排队的数据将被发送出去,发送完毕后相应关联就被终止。本通知的格式如下。
其中 sse_assoc_id 存放即将关闭的那个关联的关联标识。
* SCTP_ADAPTION_INDICATION
有些实现支持适应层指示参数,该参数在 INIT 和 INIT_ACK 中交换,用于通知对端将执行什么类型的应用适应行为。本通知的格式如下。
其中 sai_assoc_id 给出了本适应层通知的关联标识,sai_adaption_ind 给出对端在 INIT 或 INIT_ACK 消息中传递给本地主机的 32 为整数。外出适应层使用 SCTP_ADAPTION_LAYER 套接字选项设置。
* SCTP_PARTIAL_DELIVERY_EVENT
部分递送应用程序接口用于经由套接字缓冲区向用户传送大消息。一个支持在整个消息到达之前就可以开始递送它的实现称为具备部分递送 API。SCTP 实现如此调用部分递送 API:置空 msg_flags 字段,然后发送一个消息的各部分数据,在发送最后一部分数据时把 msg_flags 字段设置为 MSG_EOR。注意,如果应用进程准备接收大消息,应该使用 recvmsg 或 sctp_recvmsg 函数,以便查看 msg_flags 字段确定是否出现本条件。
部分递送 API 有时需要向应用进程传递状态信息。比如如果需要终止一次部分递送 API 调用,本通知就得送给接收应用进程。本通知的格式如下。
其中,pdapi_assoc_id 给出部分递送 API 事件发生的关联标识,pdapi_indication 存放发生的事件,目前该字段的唯一有效值是 SCTP_PARTIAL_DELIVERY_ABORTED,它指出当前活跃的部分递送已被终止。
使用SCTP 套接字选项一节中提到的 SCTP_EVENTS 选项可以预定 8 个事件,其中 7 个产生称为通知的额外数据,通知本身可经由普通的套接字描述符获取。当产生它们的事件发生时,这些通知就会内嵌在数据中加入到套接字描述符。在预订相应通知的前提下读取某个套接字时,用户数据和通知将在套接字缓冲区中交错出现,所以为了区分数据和通知,应该使用 recvmsg 或 sctp_recvmsg 函数。如果所返回的数据是一个事件通知,那么这两个函数返回的 msg_flags 参数将含有 MSG_NOTIFICATION 标志。
每种通知都采用标签-长度-值(tag-length-value,TLV)格式,其中前 8 个字节给出通知的类型和总长度。开启 sctp_data_io_event 事件将导致每次读入用户数据都收到一个 sctp_sndrcvinfo 结构。一般情况下这些信息通过调用 recvmsg 函数作为辅助数据获取,或者也可以利用 sctp_recvmsg 函数的 sctp_sndrcvinfo 结构来获取。通知的格式如下。
union sctp_notification{ // notification event struct sctp_tlv sn_header; struct sctp_assoc_change sn_assoc_change; struct sctp_paddr_change sn_paddr_change; struct sctp_remote_error sn_remote_error; struct sctp_send_failed sn_send_failed; struct sctp_shutdown_event sn_shutdown_event; struct sctp_adaption_event sn_adaption_event; struct sctp_pdapi_event sn_pdapi_event; }; struct sctp_tlv{ u_int16_t sn_type; u_int16_t sn_flags; u_int32_t sn_length; };
sn_header 字段用于解释类型值,以便译解出所处理的实际消息。下表给出了 sn_header.sn_type 的取值与 SCTP_EVENTS 套接字选项中使用的预订字段之间的对应关系。
每种通知都有各自的结构,给出了在传输中发生的相应事件的具体信息。
* SCTP_ASSOC_CHANGE
本通知告知应用进程关联本身发生变动:或者已开始一个新的关联,或者已结束一个现有的关联。它提供的信息定义如下。
struct sctp_assoc_change{ u_int16_t sac_type; u_int16_t sac_flags; u_int32_t sac_length; u_int16_t sac_state; u_int16_t sac_error; u_int16_t sac_outbound_streams; u_int16_t sac_inbound_streams; sctp_assoc_t sac_asoc_id; u_int8_t sac_info[]; };
其中 sac_state 给出关联上发生的事件类型状态,取如下值之一。
(1)SCTP_COMM_UP:表示某个新的关联刚刚启动,此时的内入流和外出流字段分别指出各自方向有多少流可用,关联标识字段给出这个关联在本地 SCTP 栈的唯一访问标识。
(2)SCTP_COMM_LOST:表示由关联标识字段给出的关联已经关闭,原因既可以是触发了某个不可达门限(例如本地 SCTP 端点多次超时触及门限,表明对端不再可达),也可以是对端执行了对于该关联的终止性关闭(通常使用 SO_LINGER 套接字选项或以 MSG_ABORT 标志使用 sendmsg)。特定于用户的消息将存放在本通知的 sac_info 字段中。
(3)SCTP_RESTART:表示对端已经重启。应用进程应该验证每个方向流的数目,因为这些值可能在重启过程中发生变动。
(4)SCTP_SHUTDOWN_COMP:表示由本地端点激发的关联终止过程(或者通过调用 shutdown 函数,或者通过以 MSG_EOF 标志使用 sendmsg 函数)已经结束。对于一到一式接口,收到本通知后,相应套接字描述符可再次用于连接到另一个对端。
(5)SCTP_CANT_STR_ASSOC:表示对端对于本端的关联建立尝试(例如 INIT 消息)未曾给出响应。
sac_error 存放导致本地关联变动的 SCTP 协议错误起因代码。sac_outbound_streams 和 sac_inbound_streams 存放本关联上每个方向协定的流数目。sac_assoc_id 存放本关联的唯一标识。sac_info 字段存放用户可用的其他信息,比如如果某个关联被对端的某个用户自定义错误终止,这个错误就会存放在该字段中。
* SCTP_PEER_ADDR_CHANGE
本通知告知对端的某个地址经历了状态变动,这种变动既可以是失败性质(例如目的地不对所发送的消息作出响应),也可以是恢复性质(例如早先处于故障状态的某个目的地恢复正常)。伴随地址变动的结构如下。
struct sctp_paddr_change{ u_int16_t spc_type; u_int16_t spc_flags; u_int32_t spc_length; struct sockaddr_storage spc_aaddr; u_int32_t spc_state; u_int32_t spc_error; sctp_assoc_t spc_assoc_id; };
其中 spc_aaddr 字段存放本事件所影响的对端地址。spc_state 字段存放下表所示的值之一。
当一个地址被声明为 SCTP_ADDR_UNREACHABLE 状态时,发送到该地址的任何数据都会被重新路由到一个候选地址。另外,其中一些状态(如 SCTP_ADDR_ADDED 和 SCTP_ADDR_REMOVED)仅仅适用于支持动态地址选项的 SCTP 实现。
spc_error 存放用于提供关于事件更详细信息的通知错误代码,spc_assoc_id 存放关联标识。
* SCTP_REMOTE_ERROR
远程端点可能给本端发送一个操作性错误消息,这些消息可以指示当前关联的各种出错条件。当开启本通知时,整个错误块将以内嵌格式传递给应用进程。本消息的格式如下。
struct sctp_remote_error{ u_int16_t sre_type; u_int16_t sre_flags; u_int32_t sre_length; u_int16_t sre_error; sctp_assoc_t sre_assoc_id; u_int8_t sre_data[]; };
其中 sre_error 存放 SCTP 协议错误起因代码,sre_assoc_id 存放关联标识,sre_data 以内嵌格式存放完整的错误。
* SCTP_SEND_FAILED
无法递送到对端的消息会通过本通知送还给用户,这之后通常还会跟有一个关联故障通知。多数情况下一个消息不能被递送的唯一原因是关联已经失效,关联有效的前提下消息递送失败的唯一情况是使用了 SCTP 的部分可靠性扩展。它提供的结构如下。
struct sctp_send_failed{ u_int16_t ssf_type; u_int16_t ssf_flags; u_int32_t ssf_length; u_int32_t ssf_error; struct sctp_sndrcvinfo ssf_info; sctp_assoc_t ssf_assoc_id; u_int3_t ssf_data[]; };
其中 ssf_flags 可取以下两个值之一。
(1)SCTP_DATA_UNSENT:表示相应消息无法发送到对端(例如流控导致该消息无法在其生命期终止前送出)。
(2)SCTP_DATA_SENT:表示相应消息已经至少发送到对端一次,然而对端一直没有确认。
这种区分对于事务性协议可能比较重要,因为它们可能需要基于是否收到某个给定消息而采取不同的行为以恢复一个破裂的连接。ssf_error 字段若不为 0,则存放一个特定于本通知的错误代码,ssf_info 若有的话提供的是发送数据时传递给内核的信息(例如流数目、上下文等),ssf_assoc_id 存放关联标识,ssf_data 存放未能递送的消息本身。
* SCTP_SHUTDOWN_EVENT
本通知会在对端发送一个 SHUTDOWN 块到本地端点时传递给应用进程,它告知应用进程在相应套接字上不再接受新的数据。所有当前已排队的数据将被发送出去,发送完毕后相应关联就被终止。本通知的格式如下。
struct sctp_shutdown_event{ uint16_t sse_type; uint16_t sse_flags; uint32_t see_length; sctp_assoc_t sse_assoc_id; };
其中 sse_assoc_id 存放即将关闭的那个关联的关联标识。
* SCTP_ADAPTION_INDICATION
有些实现支持适应层指示参数,该参数在 INIT 和 INIT_ACK 中交换,用于通知对端将执行什么类型的应用适应行为。本通知的格式如下。
struct sctp_adaption_event{ u_int16_t sai_type; u_int16_t sai_flags; u_int32_t sai_length; u_int32_t sai_adaption_ind; sctp_assoc_t sai_assoc_id; };
其中 sai_assoc_id 给出了本适应层通知的关联标识,sai_adaption_ind 给出对端在 INIT 或 INIT_ACK 消息中传递给本地主机的 32 为整数。外出适应层使用 SCTP_ADAPTION_LAYER 套接字选项设置。
* SCTP_PARTIAL_DELIVERY_EVENT
部分递送应用程序接口用于经由套接字缓冲区向用户传送大消息。一个支持在整个消息到达之前就可以开始递送它的实现称为具备部分递送 API。SCTP 实现如此调用部分递送 API:置空 msg_flags 字段,然后发送一个消息的各部分数据,在发送最后一部分数据时把 msg_flags 字段设置为 MSG_EOR。注意,如果应用进程准备接收大消息,应该使用 recvmsg 或 sctp_recvmsg 函数,以便查看 msg_flags 字段确定是否出现本条件。
部分递送 API 有时需要向应用进程传递状态信息。比如如果需要终止一次部分递送 API 调用,本通知就得送给接收应用进程。本通知的格式如下。
struct sctp_pdapi_event{ uint16_t pdapi_type; uint16_t pdapi_flags; uint32_t pdapi_length; uint32_t pdapi_indication; sctp_assoc_t pdapi_assoc_id; };
其中,pdapi_assoc_id 给出部分递送 API 事件发生的关联标识,pdapi_indication 存放发生的事件,目前该字段的唯一有效值是 SCTP_PARTIAL_DELIVERY_ABORTED,它指出当前活跃的部分递送已被终止。
发表评论
-
Unix 域套接字与描述符的传递
2019-03-27 23:59 716在Unix 域套接字概述一节中介绍了什么是 U ... -
Unix 域套接字概述
2019-03-12 22:48 981Unix 域协议并不是一个实际的协议族,而是在 ... -
kqueue 接口
2019-03-06 00:47 696kqueue 接口是 ... -
辅助数据
2019-02-28 00:40 691辅助数据(a ... -
recv/send 和 recvmsg/sendmsg 函数
2019-01-22 00:40 1578recv 和 send ... -
inetd 守护进程介绍
2019-01-09 21:51 1061在 4.3 BSD 系统之前,很多网络服务都是 ... -
主机名与 IP 地址的转换(续)
2018-12-25 00:37 959在主机名与 IP 地址的转换一节中提到的 ge ... -
主机名与 IP 地址的转换
2018-11-14 00:20 2327在网络编程中,尽管大部分情况下操作的都是 IP ... -
SCTP 套接字选项
2018-02-04 09:35 1704在获取和设置套接 ... -
SCTP 套接字编程基础函数
2018-02-04 10:08 1060SCTP 服务器可以使 ... -
SCTP 套接字编程基础概念
2018-01-18 00:10 566SCTP 套接字分为一到一套接字和一到多套接字。提供一 ... -
UDP套接字编程基础
2018-01-14 10:37 576下图显示了使用 UDP 套接字编写客户/服务器程序时的 ... -
通用套接字选项
2018-01-02 00:46 555在获取和设置套接 ... -
获取和设置套接字选项
2017-12-29 08:21 444下面几种方法可用 ... -
I/O 复用之 poll 函数
2017-12-27 00:20 427poll 函数提供的功能与 select 类似,不过在 ... -
I/O 复用之select 函数
2017-12-12 00:32 519select 函数允许进 ... -
Unix 5 种 IO 模型概述
2017-11-19 01:44 307Unix 下有 5 种可用 ... -
套接字创建、连接和关闭函数
2017-08-13 17:16 669下图是一对 TCP 客户与服务器进程之间发生的一些典型 ... -
字节转换和填充函数
2017-08-06 01:09 433网络编程中,为保证发送协议栈和接收协议栈就如 32 位 ... -
IPv4 和 IPv6 的套接字地址结构
2017-08-01 21:03 742大多数套接字函数 ...
相关推荐
5. 事件通知:通过注册SCTP事件回调,应用可以获取关于连接状态、数据传递、错误等事件的通知,进行相应的处理。 在实际应用中,开发SCTP程序可能涉及到以下几个步骤: 1. 创建SCTP套接字并绑定到指定端口。 2. ...
通知原语则是SCTP向用户发送的事件通知,如偶联建立成功、偶联关闭、数据接收确认等。 5. SCTP协议消息 SCTP协议消息包括消息结构、数据块格式以及端点维护的参数和建议值。数据块是SCTP协议消息的基本组成单位,...
通知原语是SCTP协议栈向用户报告状态变化或事件的通知,如偶联建立成功、收到数据或偶联关闭的通知等。 SCTP协议消息的结构设计用于保证可靠性和效率,其数据块格式包含了多种类型的数据块,如INIT、INITACK、DATA...
IP, UDP, TCP, SCTP 协议总结 根据提供的文件信息,我们可以总结出以下知识点: 一、协议栈 在计算机网络中,协议栈是指从应用层到物理层的七层协议体系结构。其中,应用层包括 DNS, HTTP, FTP, TELNET, SSH, SIP...
无连接服务适合于小数据量、实时性要求高的通信,如位置更新通知;而面向连接服务则适用于大数据量、实时性要求较低的场景,如系统维护信息的传输。这两种服务模式分别类似于UDP和TCP,前者在每次通信时都需要携带...
3. **事件传输**:封装后的事件信息通过网络发送给管理系统,如媒体网关控制器(MGController)或网络管理系统(NMS),可以采用标准协议如SCTP(Stream Control Transmission Protocol)或者专有协议进行传输。...
此外,M3UA还负责对SCTP传输协议的管理,包括错误指示和状态通知。 M3UA协议还具备与MTP3网管功能的互通性,能向ASP的MTP3用户提供SS7网络中的目的地可达性信息,包括不可达、可达、拥塞和不可用状态的指示。同时,...
它能够指示和通知本地管理或远程M3UA关于接收的M3UA消息的错误,以及进行适当的故障管理。 3. **与MTP3网管功能的交互**:在SG中,M3UA必须能与MTP3网络管理功能交互,以处理SS7网络中远端目的地的可达性问题,包括...
3. **SCTP连接管理**:支持SG与一个或多个MGC/IP域数据库之间的SCTP连接的管理和维护。 4. **故障转移与负载均衡**:支持MGC或IP域数据库进程的故障转移和负载均衡机制。 5. **异步状态变化处理**:支持异步状态变化...
4. **常用Channel类** - NioDatagramChannel 用于UDP通信,NioSctpChannel 用于SCTP(流控制传输协议)客户端,NioServerSocketChannel 用于TCP服务端,NioSocketChannel 用于TCP客户端。EmbeddedChannel 则用于单元...
一旦操作完成或发生异常,Netty将通过事件通知应用程序。 2. 简单而统一的API:Netty通过提供简洁的API,使得开发人员可以快速掌握其用法。 3. 高性能:Netty被设计为高性能,使用了高效的I/O线程模型,它可以处理...
5. **拥塞管理与流量控制**:在出现拥塞时,M3UA可以通知上下层采取相应措施,同时它能控制SCTP(Stream Control Transmission Protocol)新偶联的业务量,防止过度负载。 6. **SCTP流映射**:M3UA可以将上层信令...
3. "TS29518_Namf_EventExposure.yaml" - 可能涉及AMF如何暴露事件信息,比如用于网络监控、故障检测或数据分析的事件通知机制。 4. "TS29518_Namf_Location.yaml" - 这部分可能涵盖了AMF在用户位置管理上的规范,如...
4. **事件通知**:MG通过`Notify`消息向MGC报告终端的状态变化或事件。 5. **断开连接**:当通信结束时,双方关闭连接。 这个过程确保了NGN中媒体处理的高效和准确。 总之,H.248协议在NGN中的作用不可忽视,它...
4. 监听器和回调模式支持:Netty通过监听器和回调模式来支持事件驱动编程,使得网络事件的处理更加灵活。 5. 零拷贝:Netty通过使用内存池等技术,实现了零拷贝,极大地减少了不必要的数据复制,提高了性能。 6. ...
3. **SCTP流映射**:定义如何将不同的MTP2信令消息映射到SCTP的不同流上,以提高传输效率。 ###### M2UA的业务功能 M2UA支持以下关键业务功能: 1. **支持传送MTP2/MTP3接口原语功能**:能够在IP网络上透明地传输...
事件通告是指网关需要实时监听传感器网络的状态,一旦检测到感兴趣的变化,就通过SIP协议向相关的监控节点发送事件通知。而数据采集则是指系统能够根据需要远程请求特定传感器节点的数据,并通过SIP/ZigBee网关将...
`set alg sctp enable` 启用SCTP协议的ALG,以支持需要SCTP的应用。 5. **认证服务器设置**: `set auth-server "Local" id 0` 定义了一个名为"Local"的本地认证服务器,并分配ID为0。 `set auth default auth ...