5

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

通过在互联网上的研究,我认为 udp 有两个问题:


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

如果您有兴趣了解我为什么要使 udp 可靠以及为什么我不使用 tcp,请查看这个问题。相信我,我一直在尝试做 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)算法继续如此,直到文件得到传输。


.

.

.

I mean there are obviously some other things that I need to add to this algorithm such as letting computer B know when the transfer is done. maybe checking for more errors. what happens if computer A get disconnected for a long time. But the main protocol will be something like the one I described.

So do you think I should start implementing this algorithm? should I increase and send more bytes every time. I mean send 1000 instead of 500? There are lots of articles on the internet that tell you about several techniques but very few of them give you a working example on the language that you want. In this case I need this in c#.

4

1 回答 1

2

The third problem is that data can be corrupted when you receive it.

You can start by reading TCP RFC just to understand how TCP makes communication reliable. Having that knowledge you can implement some of its techniques using UDP as transport.

Also take a look at this UDP network library http://code.google.com/p/lidgren-network-gen3/

于 2011-10-20T07:13:01.617 回答