如何实现可靠的 UDP 协议?

Posted

技术标签:

【中文标题】如何实现可靠的 UDP 协议?【英文标题】:How can I achieve a reliable UDP protocol? 【发布时间】:2016-05-26 01:29:55 【问题描述】:

我知道如何发送和接收 UDP 和 TCP 数据包,我怎样才能实现发送可靠 UDP 数据包的某种方式? 我只是要求一个逻辑,因为我不知道这是如何工作的。 提前致谢。

【问题讨论】:

没有 100% 可靠的方法来确保您的 UDP 消息被发送和接收,但是您可以在您的应用程序中使用确认消息来查看您是否确实收到了发送和接收消息。您最可靠的方法总是通过 TCPIP 发送数据包,但这并不总是 100%。您有任何代码可以与我们分享吗? 为什么在需要可靠性的同时使用 UDP? 如果您想通过网络可靠地发送数据包,请使用 TCP。 在尝试编写网络库之前,您确实需要研究协议。您的代码(刚刚检查过 github)有多个设计问题。 查看现有协议,例如 Google 的 QUIC 或 AFS 的 Rx。他们定义了类似于 TCP 的 UDP 重试机制,以便可以可靠地传递数据。但可能他们没有 .NET 实现,您需要开发它。 【参考方案1】:

这是我以前公司使用的一些旧代码

这背后还有很多其他的方法,太多了,无法在这里真正分享,但您希望使用 Acknowldgemet 和 Not Acknowledged 消息来显示通信已发送和接收。

public void InitialiseVenemaComms()

    string initMessage = null;
    DebugInfo(1, "*** InitialiseVenemaComms");
    initMessage = "002" + StationPrms.StationId + "ACK";

try

    System.Net.Sockets.UdpClient udpClient = new System.Net.Sockets.UdpClient(Convert.ToInt32(StationPrms.Venema.LocalPort));
    byte[] messageBytes = System.Text.Encoding.ASCII.GetBytes(initMessage);
    udpClient.Connect(StationPrms.Venema.DNS, Convert.ToInt32(StationPrms.Venema.RemotePort));
    DebugInfo(1, string.Format("*** Sending init message '0' from port '1' to ip '2' on port '3'", initMessage, StationPrms.Venema.LocalPort, StationPrms.Venema.DNS, StationPrms.Venema.RemotePort));

    udpClient.Send(messageBytes, messageBytes.Length);
    udpClient.Close();
    DebugInfo(1, "*** Init Message Sent");

catch (Exception ex)

    DebugInfo(2, "Error: " + ex.Message);
    CssError("Error initalising Venema comms: " + ex.Message);

但你最好按照我的 cmets 通过 TCPIP 发送。

【讨论】:

你确定你拥有情报财产吗?通常,公司在您受雇时拥有您的工作。 我真的不知道你想在代码中做什么,我在询问逻辑,甚至是某种方式来了解是否使用“System.Net.Sockets. Socket.Send()" 尽可能不回复就到了另一边

以上是关于如何实现可靠的 UDP 协议?的主要内容,如果未能解决你的问题,请参考以下文章

用UDP实现可靠传输

TCP与UDP,可靠UDP如何实现

udp如何实现可靠性传输

(200分)扩展UDP实现可靠传输(SR,GBN)

udp如何实现可靠性传输?

UDP如何保证传输的可靠性