This commit is contained in:
nicc@gfex.com.cn
2024-04-15 10:25:56 +08:00
parent 803f6b55c2
commit 9ff1b31d67

View File

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