Ton*_*Nam 5 networking udp reliability file-transfer
互联网上有几篇有关如何使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,1}回复给A,否则它用{2,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,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/
| 归档时间: |
|
| 查看次数: |
3890 次 |
| 最近记录: |