C#中的可靠UDP

5

有很多关于如何使UDP可靠的文章在互联网上,但我没有找到一篇关于C#的。所以也许我可以实现我的算法。

从互联网上的研究来看,我认为UDP有两个问题:


它不能保证所有数据都到达目的地。 数据可能以不同的顺序到达目的地。 也许还有第三个问题我没有考虑,以使其更加可靠。

如果您想知道我为什么想要使udp可靠,并且为什么不使用tcp,请查看this question。相信我,我一直在尝试进行tcp punch holing。

无论如何,也许已经有一个可以与c#一起使用的库,使我能够做到这一点。因为我没有找到库,所以我一直在考虑以下算法:


假设有计算机A和计算机B,计算机A正在向计算机B发送文件。

以下是我考虑过的步骤:


1) 计算机A打开文件进行阅读,假设文件大小为5000字节。这意味着计算机A需要向计算机B发送5000字节的数据,确保没有任何字节丢失并且按正确的顺序发送。


2) 计算机A获取文件的前500个字节,并获取这些字节的哈希值。因此,现在计算机A有两个东西:这500个字节的哈希和字节本身。 (哈希将是一个有效的算法,如MD5,以确保数据按正确顺序接收。即md5(1,2,3) != md5(2,1,3))


3)假设前500个字节的哈希值为kj82lkdi930fi1。


4) 计算机B应该监听哈希值和字节。


5)计算机A将哈希值和500字节发送给计算机B。一旦发送完成,它会立即开始等待回复。


6) 现在计算机B应该已经收到哈希值和字节。计算机B对接收到的字节执行相同的MD5算法。如果结果等于接收到的哈希值,则回复A {1,1,1,1,1,1},否则回复{2,2,2,2,2,2,2}。


6.5)假设计算机B按正确顺序获得了数据,因此它回复{1,1,1,1,1},并将哈希代码保存在内存或数组中。


7) 计算机A应该等待响应才能发送下一个500字节。假设它收到{1,1,1}。因为它收到了1,所以它知道可以继续发送下一个500字节,并使用这500字节的新哈希码。


8)计算机A发送其哈希码的下一个500字节。


9) 假设计算机B没有收到数据,因此它不会回复A。计算机B仍将等待字节和哈希值。


8) 因为计算机A在合理的时间内没有收到1,1,1,1,1或2,2,2,2,2,所以A将再次发送相同的字节和哈希值。


9)假设计算机B收到了哈希值和字节,但是字节的顺序不同。当计算机B对这些字节进行哈希计算时,得到的哈希值将与接收到的哈希值不匹配。因此,它会回复{2,2,2,2,2,2}。


10)如果计算机A接收到2,2,2,2,2,2,则它将发送相同的字节和哈希值。如果由于某种原因未收到2,2,2,2,2,则在一段时间后,它将发送相同的字节和哈希值。假设计算机A收到了2,2,2,2,2。


11) 计算机A第三次发送相同的字节和哈希值。


12)计算机B按正确顺序接收哈希值和字节。结果回复1,1,1,1,1,1,并将先前的哈希值保存在内存中(回顾步骤6.5)。


13) 假设计算机A未收到来自B的1,1,1,1响应,则它将发送相同的字节第四次。


14) 计算机B检查哈希值,如果与上次接受的哈希值相等,则再次回复1,1,1,1,而不将这些字节写入文件。


15) 直到文件传输完成,算法会继续执行。


.

.

.

我是指还有其他一些事情需要添加到这个算法中,比如让计算机B知道何时完成传输。也许检查更多错误。如果计算机A长时间断开连接会发生什么。但主要协议将类似于我描述的那样。
那么你认为我应该开始实施这个算法吗?每次增加并发送更多字节,例如发送1000而不是500?互联网上有很多文章介绍几种技术,但很少有给出您想要的语言的工作示例。在这种情况下,我需要用c#实现它。

1
因为进行TCP穿越非常困难!相信我,如果我能够使用TCP协议将两个位于不同NAT上的对等方连接起来,那么我就不会浪费时间提出这个问题了。请看这个问题:https://dev59.com/zVrUa4cB1Zd3GeqPmrk1。我在互联网上找不到一个示例来创建TCP穿越。我找到了几篇解释它如何工作的文章,但是当我将这些文章翻译成C#时,由于某种原因它们无法正常工作。 - Tono Nam
1个回答

2
第三个问题是在接收数据时可能会出现数据损坏的情况。
你可以先阅读TCP RFC,了解TCP如何提高通信可靠性。有了这些知识,你就可以使用UDP作为传输协议来实现一些技术。
此外,还可以查看这个UDP网络库http://code.google.com/p/lidgren-network-gen3/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接