网络 – c#中可靠的udp

互联网上有几篇关于如何使udp可靠的文章.我无法在c#上找到一个.所以也许我可以实现我的算法.

从互联网上的研究我相信udp有两个问题:

>它不能确保所有数据都到达目的地.
>数据可能会以不同的顺序到达目的地
>也许我缺少第三个问题,以使其可靠

如果你有兴趣知道为什么我想让udp可靠,为什么我不使用tcp而不是看看this question.相信我,我一直试图做tcp打孔这么久.

无论如何可能已经有一个我可以使用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将散列发送到计算机B.它也发送500字节.一旦它发送它开始等待回复.

6)计算机B现在应该接收散列和字节.计算机b对接收的字节执行相同的算法md5.如果该结果等于收到的哈希值,那么它用{1,1,1,1,1,1}回复给A,否则它回复{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第3次发送相同的字节和散列.

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#中使用它.

最佳答案 第三个问题是收到数据时可能会损坏数据.

您可以从阅读TCP RFC开始,了解TCP如何使通信可靠.
拥有这些知识,您可以使用UDP作为传输实现其一些技术.

另请查看此UDP网络库http://code.google.com/p/lidgren-network-gen3/

点赞