From 9ff1b31d675b642b32308d1d0cd531ecc2efb1dc Mon Sep 17 00:00:00 2001 From: "nicc@gfex.com.cn" <12345678> Date: Mon, 15 Apr 2024 10:25:56 +0800 Subject: [PATCH] ` --- my-project/docs/组播协议/NORM.md | 51 ++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/my-project/docs/组播协议/NORM.md b/my-project/docs/组播协议/NORM.md index b29d0dc..dc8c69d 100644 --- a/my-project/docs/组播协议/NORM.md +++ b/my-project/docs/组播协议/NORM.md @@ -2,8 +2,11 @@ ## NORM基本结构 ### 消息 NORM 消息包含在 UDP 数据报的数据字段中。 + NORM 对象是指 NORM 消息中携带的三种不同类型的批量数据:NORM_OBJECT_DATA、NORM_OBJECT_FILE、NORM_OBJECT_STREAM。 + NORM_OBJECT_DATA是指静态计算机内存数据内容,而NORM_OBJECT_FILE是指计算机存储文件。这两种消息类型都为有限的内容块提供可靠的传输,但进行了区分,以允许接收方确定为接收的消息内容分配哪种类型的存储。 + NORM_OBJECT_STREAM是指连续数据内容的流(非有限)。NORM 支持与 TCP 类似的流数据的可靠传输,但 NORM 接收器能够加入流内容的接收,而不考虑流中的时间点。 ### 会话 NORM 会话是指使用 NORM 在两个或多个网络主机之间交换信息。通常,NORM 会话使用预先确定的 IP 地址和端口号进行,这些地址和端口号通常与在会话之前确定的 IP 组播组地址相关联。可以使用其他协议确定这些地址,例如会话描述协议 (SDP) [RFC 4566] 或会话公告协议 (SAP) [RFC 2974]。尽管 NORM 是专门为组播组通信而设计的,但它也支持单播通信。 @@ -17,12 +20,16 @@ NORM 有两个通用消息类,即发送方消息和接收方消息。NORM 发 ![image.png](image/norm1.png) ### NORM公用消息头 ![mkdocs](image/norm2.png) + **版本(4 位)** 协议版本号。 + **类型(4 位)** NORM 消息类型(即 1 = NORM_INFO、2 = NORM_DATA、3 = NORM_CMD、4 = NORM_NACK、5 = NORM_ACK、6 = NORM_REPORT)。 + **hdr_len(8 位)** 用于识别头部扩展的添加。如果“hdr_len”值大于给定消息类型的基本值,则意味着存在头部扩展。 + **序列号(16 位)** 有两个用途(取决于消息类型): @@ -35,25 +42,35 @@ NORM 消息类型(即 1 = NORM_INFO、2 = NORM_DATA、3 = NORM_CMD、4 = NORM_ NORM_DATA 消息是 NORM 发送方发送的最常见的消息类型。NORM_DATA 消息携带了 NORM_OBJECT_DATA、NORM_OBJECT_FILE 和 NORM_OBJECT_STREAM 类型的分段数据内容。 ![image.png](image/norm3.png) 浅蓝色为NORM_DATA的数据内容: + **instance_id(16 位)** 当前参与 NORM会话实例的唯一标识。 + **grtt(8 位)** 发件人当前估计的组往返时间。 + **backoff(4 位)** 在使用基于定时器的 NORM NACK 反馈抑制机制时,接收机用于确定最大回退定时器值的值。 + **gsize(4 位)** 发件人对组大小的当前估计值。 + **flag(32 位)** 二进制标志提供信息以帮助接收方适当地处理有效载荷。 + **fec_id** FEC 编码(前向纠错,通过在发送数据时添加冗余信息(校验码),使接收端能够在接收到的数据中检测和纠正错误,而不需要进行额外的请求。)标识符。 + **object_transport_id** 发送方分配给正在传输的 NORM 对象的值,接收方将其用于传输和修复请求。它以单调增量的方式增加。 + **fec_payload_id** 附加的NORM_DATA有效负载内容的标识符。 ### 发送方 NORM_INFO消息 NORM_INFO消息允许在数据传输中附加一些可选的额外信息,这些信息与传输的数据内容相关联。这使得接收方可以了解所传输内容的性质,从而能够基于这些信息做出相应的处理或决策。 + NORM_INFO内容必须放在单个NORM消息的有效负载中,因此它被视为“原子”的,即不可分割的。这意味着所有相关信息必须适合于单个消息的大小限制。 + 一个典型的应用场景是发送与数据内容相关的MIME类型信息。例如,当发送方传输一个文件时,可以通过NORM_INFO消息发送文件的MIME类型(例如,文本、图像、音频等),这样接收方就可以根据文件类型做出相应的处理或展示。 ![image.png](image/norm4.png) **instance_id(16 位)** @@ -79,20 +96,28 @@ NORM_CMD消息的作用:NORM_CMD消息用于管理NORM会话,其功能包括 ![image.png](image/norm5.png) **instance_id(16 位)** 当前参与 NORM会话实例的唯一标识。 + **grtt(8 位)** 发件人当前估计的组往返时间。 + **backoff(4 位)** 在使用基于定时器的 NORM NACK 反馈抑制机制时,接收机用于确定最大回退定时器值的值。 + **gsize(4 位)** 发件人对组大小的当前估计值。 + **flag(32 位)** 二进制标志提供信息以帮助接收方适当地处理有效载荷。 + **fec_id** FEC 编码标识符。 + **object_transport_id** 发送方分配给正在传输的 NORM 对象的值,接收方将其用于传输和修复请求。它以单调增量的方式增加。 + **sub-type** -**指示后面的命令的类型。** +指示后面的命令的类型。 + **NORM_CMD内容** - FLUSH:表示发件人的临时传输结束。也可以任选地用于从接收器子集收集可靠接收的肯定确认。 @@ -102,40 +127,55 @@ FEC 编码标识符。 - REPAIR_ADV :通告发送方的聚合修复/反馈状态,以抑制来自接收方的单播反馈。 - ACK_REQ:从接收方列表请求应用程序定义的肯定确认(可选)。 - APPLICATION:用于需要临时抢占或补充数据传输的应用程序定义的用途(可选)。 + ### 接收方 NORM_NACK消息 NORM_NACK消息主要由接收方使用,用于请求发送方修复丢失的数据内容。当接收方检测到数据丢失或损坏时,它可以通过发送NORM_NACK消息向发送方请求重新发送丢失的数据。此外,这些消息还包含向发送方提供与往返计时收集和拥塞控制相关的信息的字段。 ![image.png](image/norm6.png) **server_id(32 位)** NORM_NACK消息发往的 NORM 发送方。 + **instance_id(16 位)** 当前参与 NORM 会话实例的唯一标识。 + **reserved(16 位)** 用于未来可能的 NORM 用途 + **grtt_response_sec(32 位)** 根据最近收到的 NORM_CMD (CC) 消息为指定的 NORM 发送方调整的时间戳版本。秒级。 + **grtt_response_usec(32 位)** 根据最近收到的 NORM_CMD (CC) 消息为指定的 NORM 发送方调整的时间戳版本。微秒。 + **NACK_payload** 接收方相对于“server_id”字段指示的 NORM 发送方的维修需求。 + ### 接收方 NORM_ACK消息 NORM_ACK消息主要用于支持拥塞控制操作和往返计时测量。 ![image.png](image/norm7.png) **server_id(32 位)** NORM_ACK消息发送方。 + **instance_id(16 位)** 当前参与 NORM 会话实例的唯一标识。 + **ack_type(8 位)** NORM_ACK消息的性质。这直接对应于此ACK适用的 NORM_CMD(ACK_REQ) 消息的“ack_type”字段。 + **ack_id(8 位)** 用于发送方验证接收到的NORM_ACK消息是否适用于当前的确认请求。但对于NORM_ACK(CC)和NORM_ACK(FLUSH)确认类型,"ack_id"字段不被使用。 + **grtt_response_sec(32 位)** NORM_ACK消息中的一个时间戳。这个时间戳是根据最近接收到的,NORM_CMD(CC)消息调整后的版本,它指示了指定的NORM发送方的时间。精确到秒。 + **grtt_response_usec(32 位)** NORM_ACK消息中的一个时间戳。这个时间戳是根据最近接收到的,NORM_CMD(CC)消息调整后的版本,它指示了指定的NORM发送方的时间。精确到微秒。 + **ack_payload** ACK消息中携带的额外信息。 + ### 接收方 NORM_REPORT消息 NORM_REPORT用于向发送方报告接收方的状态和数据传输情况。它提供的机制,使得接收方能够向发送方反馈有关数据传输的信息,以便发送方能够根据这些信息调整其传输策略和行为。 + NORM_REPORT消息可能包含的信息包括但不限于: 接收状态报告:报告接收方已成功接收到的数据包序号范围,以及可能存在的丢失或损坏的数据包。 网络状态信息:提供关于网络延迟、丢包率、带宽利用率等方面的信息,以帮助发送方了解当前的网络状况。 @@ -146,10 +186,13 @@ NORM_REPORT消息可能包含的信息包括但不限于: ![image.png](image/norm8.png) **het(8 位)** 标头扩展类型。对于可变长度标头扩展,值介于 0 和 127(含)之间。 + **hel(8 位)** 标头扩展长度。指示整个标头扩展的长度。 + **标头扩展内容** 因用途而异。 + ## NORM协议操作 ### 一般操作 通用 NORM 协议操作的详细过程: @@ -181,11 +224,14 @@ NORM 有四个流量控制选项,允许 NORM 发送方管理到 NORM 接收方 水印:数据同步的水印描述了一个预定义格式的对象,为试图建立增量/增量同步的两个系统/数据集提供了一个参考值;在水印值之后创建、修改或删除的被查询数据源中的任何对象都将被归类为“高于水印”,并应返回给请求数据的客户端。 ### 可靠性 NORM通过使用两种前向纠错编码方案(系统码和非系统码)来确保可靠的传输。 -使用系统码时,发送方先传输一组内容块,然后是一 组纠错编码块。 + +使用系统码时,发送方先传输一组内容块,然后是一组纠错编码块。 使用非系统码时,发送方在传输之前对内容进行纠错编码。 + 这两种纠错编码方案都可以以反应性或预测性的方式使用。在这两种情况下,都可以影响基于 FEC 的修复,从而允许接收方修复数据包,从而降低了修复请求和修复传输的级别。 ### 可扩展性和NACK管理 面向 NACK 的组播通信容易受到 NACK 内爆的影响。如果大量接收方同时发送NACK,这可能会使发送方以及整个网络不堪重负。NORM 使用 NACK 抑制机制来防止 NACK 内爆。 + 当接收方检测到它在发送方的 NORM 传输中丢失了数据时,它会启动 NACK(否定确认)过程: 1. 接收方假设其他一个或多个接收方也丢失了相同的数据,并且可能已经向发送方发送了 NACK。 @@ -194,4 +240,5 @@ NORM通过使用两种前向纠错编码方案(系统码和非系统码)来 4. 如果在等待期结束时,接收方没有收到足够的修复信息,它就会启动自己的 NACK。 5. 如果 NORM 会话发生在组播路由环境中,NACK 将被传输给发送方以及网络中的所有其他节点。 6. 如果 NORM 会话不是在组播路由环境中进行的,NACK 将被传输给发送方,发送方立即重新将其发送到网络中的所有其他节点。 + NORM 的 NACK 抑制机制,结合其 FEC 机制,使得 NORM 组播组可以扩展到非常大的组,同时保持可靠性。