将SWIM从UDP移植到TCP

时间:2018-09-15 09:10:35

标签: node.js sockets networking tcp udp

由于网络问题,我将分叉swim-js并使其适应使用TCP而不是UDP。我将其与seneca-mesh一起使用(通过喷嚏使用它)。塞内卡网格使用游泳来发现其他节点及其命令。某些服务具有多个命令(没有什么大的,比如说10个命令),导致大型的UDP软件包更新。它们都在1500字节以下,但是我们网络中的某些跃点以1400字节作为MTU。

对于UDP程序包,这种游泳实现方式是这样工作的:

  1. 在发送多个包时,它首先将它们转换为带有一些自定义标头的缓冲区

  2. 它根据提供的最大数据报大小和一些随机内部值来计算每个包可用的字节数

  3. 它尝试在一个UDP包中将尽可能多的消息分组并发送
  4. 如果要发送的软件包更多,它将重置计算并开始再次分组以将其发送到另一个软件包中

如果任何消息大于最大数据报大小,则由于无法可靠地将其发送到多个UDP包中而被丢弃。

我们这里有两个问题:

  1. 某些UDP软件包在某些网络跃点被丢弃,因为它们比MTU大

  2. 当服务获得多个要宣布大于最大数据报大小的命令时,它将无法与其余命令一起使用(永远隔离...)

由于我上面写的内容,我将在swim-js的端口the network layer上使用TCP,以实现可靠的通信。但是,我对原始TCP通信的经验不是很丰富,因此我想澄清一些问题,以实现最佳的实现。

这是我发现更重要的TCP和UDP之间的区别

  1. TCP是基于连接的,而UDP不是
  2. UDP套接字似乎是双向的,而TCP具有客户端服务器的作用,其中服务器侦听端口,而客户端使用不同的端口。我的意思是,您不能使用同一TCP通道进行发送和接收

这是我的疑问/担忧:

我应该保持不同的连接打开吗?如您所知,swim负责构建和维护网格,在多个节点之间发送更新程序包,ping和广播。使用TCP,每次要发送程序包(例如ping)时,都需要打开一个连接。如果我保持连接打开,这会产生大量的网络开销吗?打开连接,发送所有数据然后关闭它是更好的主意吗?

当前的通信是异步的,即在您发送ping请求时您不必等待答案。您只需发送ping请求,以后任何时候您都会收到ACK请求。保持这种模式会是一个好主意吗?还是因为TCP需要首先建立连接,所以最好使用相同的建立连接来回答?

致谢

0 个答案:

没有答案