Time-Warp-NT 层

time-warp 是为提供不同抽象层次方法的可靠网络层而开发的。time-warp 另一个重要的目标是提供一种使用仿真模式编写和运行分布式系统测试的简单方法,该模式可以足够灵活地支持各种情况(可调节网络延迟,断开连接和其他实时情况)。

time-warp 主要分为两个部分:

  1. Mockable 接口。
  2. 网络功能。

Mockable

Mockable 接口允许从基本功能实现的语言特定细节中抽象出来。

他们分成几个类别。例如,Mockable Delay 包含 delay 操作,而 Mockable Fork 保留基本功能来操作线程。

这个创新允许在生产和测试环境中启动相同的代码,后者允许模拟时间,线程,网络等。

Production 实现了这些接口 ,并引用了各自功能的原型。

网络

该层写在网络传输之上,为应用层提供网络功能。它被分成两个子层:低层高层

低层

这个子层是 network-transport 包的直接封装,它提供了一个方便的接口,允许发起轻量级的链接和发送/接收数据。请阅读网络层传输指南了解更多信息。

它支持两种类型的连接,单向双向

单向连接

单向连接允许发送一个字节流而不用等待对方的响应。

withOutChannel 功能执行给定的操作,为其提供一次性的轻量级连接

单向连接初始化时,节点发送 U

+------------------+
|       UNI        |
+------------------+

|   'U' :: Word8   |

Word8 表示8位无符号整数值。

双向连接

双向连接允许两个节点相互发送和接收字节。

withInOutChannel 函数建立连接,用给定的句柄执行给定的动作,以在连接上发送和接收字节,并在动作结束时自动关闭连接。它的使用需要握手,其中包含以下步骤。

首先,发起者发送一个连接请求,其具有以下结构:

+------------------+-----------------+
|     `BI_SYN`     |      Nonce      |
+------------------+-----------------+

|   'S' :: Word8   |   Word64 (BE)   |

其中 Nonce随机生成的

然后对方发送以如下结构发送确认

+------------------+-----------------+--------------+
|     `BI_ACK`     |      Nonce      |   PeerData   |
+------------------+-----------------+--------------+

|   'A' :: Word8   |   Word64 (BE)   |   Generic    |

其中 Nonce来自请求的相同随机数

如果发起者已正确地随机数接收到确认,则开始对话。

如果节点从未发送过任何请求(对等点发生协议错误),则会发生相反的情况。也有可能是节点确实发送了 BI_SYN,但对话的处理程序已经完成了。这是正常的,节点应该忽略这个确认。

PeerData 是由对等体发送并由发起者解析的一些附加信息。time-warp 使您能够在握手过程中提供一些二进制数据,然后以不同的方式使用您的应用程序。这个数据的结构是互通的,应用程序级别 章节描述了卡尔达诺结算层如何使用 PeerData

消息

在讨论上层之前,我们来描述消息。

为了让不同的消息类型指定不同的处理程序,发送的消息应该实现 Message 接口,定义两种方法:

  1. messageName,它将返回唯一的消息标识符,该标识符与消息本身一起发送,并允许接收者选择正确的处理程序来处理此消息。
  2. formatMessage, 它提供消息的描述,用于调试。

请查看 Message 实例Parcel 数据类型作为例子。

上层

这个子层实现了数据交换。它提供了交流的沟通方式。该类型使用双向连接的功能,并允许发送/接收信息(一个或多个)。对于单个对话,输入和输出消息的类型是固定的。在这种情况下,发起方节点只发送一次消息名称,然后发起方和对方发送所需的消息。

网络事件处理由 node 功能启动。这个函数使用了两个重要的概念:worker 和 listener。

Worker 是作为所有通信发起者执行的一些动作,被用于提供提供 withConnectionTo 功能的 SendActions 类型。这个函数启动对话,执行 ConversationActions 给定的动作,一旦动作完成关闭会话。反过来,ConversationActions 提供 sendrecv 功能来与对等点对话。

Listener 是一个消息的 handler。每个相关消息的 listener 成员类型,以及几个不重复消息类型的 listeners 可以被定义。

请查看完整例子获取技术细节。

序列化

time-warp 不依赖任何预定义的序列化策略,而是允许用户使用自己的。

要定义自定义序列化,用户应该可以创建特殊的数据类型,即所谓的打包类型,并为其实现 Serializable 接口。这个接口定义了两个方法:

  1. packMsg,展示将数据压缩到原始字符串。
  2. unpackMsg, 展示将数据解压缩。

请查阅 Serializable 实例作为 BinaryP 数据类型的例子。