互联网上有几篇关于如何使 udp 可靠的文章。我一直无法在 c# 上找到一个。所以也许我可以实现我的算法。
通过在互联网上的研究,我认为 udp 有两个问题:
- 它不能确保所有数据都到达目的地。
- 数据可能以不同的顺序到达目的地
- 也许我缺少第三个问题以使其可靠
如果您有兴趣了解我为什么要使 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#.