gpt4 book ai didi

networking - c#中可靠的udp

转载 作者:行者123 更新时间:2023-12-04 21:23:48 25 4
gpt4 key购买 nike

互联网上有几篇关于如何使 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 断开连接很长时间会发生什么。但主要协议(protocol)将类似于我描述的协议(protocol)。

    那么你认为我应该开始实现这个算法吗?我应该每次增加并发送更多字节吗?我的意思是发送 1000 而不是 500?互联网上有很多文章向您介绍了几种技术,但很少有文章为您提供有关所需语言的工作示例。在这种情况下,我需要在 c# 中使用它。

    最佳答案

    第三个问题是,当您收到数据时,数据可能会被损坏。

    您可以先阅读 TCP RFC只是为了了解 TCP 如何使通信可靠。
    有了这些知识,您就可以使用 UDP 作为传输来实现它的一些技术。

    也看看这个UDP网络库http://code.google.com/p/lidgren-network-gen3/

    关于networking - c#中可靠的udp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7328216/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com