【问题标题】:Reliability in UDPUDP 中的可靠性
【发布时间】:2017-05-10 06:08:15
【问题描述】:

我必须用 Java 做一个 bittorrent 应用程序项目,它需要通过 UDP 协议而不是 TCP 传输数据。在这个项目中,老师要求我保证UDP协议的可靠性。于是在网上搜索了一些解决方案,发现在java中,有“ReliableSocket”和“ReliableServerSocket”等类。所以我想知道这些类可以满足我项目的要求。这两个类有什么区别?

非常感谢您的帮助

【问题讨论】:

  • Tcp 是一个可靠的协议,意味着该协议是可靠的,并且是从封装的应用程序层抽象出来的。 udp 不是,因此首先对数据包或会话应用一些排序(在 udp 中没有会话之类的东西,您必须在应用层中创建它),以便可以组装乱序接收的数据包并检测丢弃的数据包并让他们怨恨。基本上,Tcp 为您所做的所有事情都有效且整洁地从您身上抽象出来,您必须做。我会说为什么不只使用Tcp?似乎对现有技术的利用不佳。
  • 也相信 google 已经完成了他们自己的 Udp 版本,称为 Quick,我认为它旨在成为 tcp 的更高性能替代品,尽管我不确定 Quick 的细节,因为它是不是像 tcp 和 udp 那样的互联网标准。但是如果它是由谷歌完成的,那么可能有一些 nodejs 包。
  • 这是 Oracle Java 还是 javascript?我现在假设是 Oracle Java。

标签: sockets udp reliability


【解决方案1】:

UDP 是一种运行在 IP 协议之上的有损不可靠协议。与 TCP(处理可靠通信的所有方面)不同,它由应用层来处理丢弃的数据包和“可靠”传输协议的其他方面。因此,任何需要与 TCP 给出的类似程度的可靠性的实现都可能会产生额外的开销。

您可以留出两个端口port Aport B。每个端口都是单向的,除非有丢包。

client 1 = port A = server 2

server 1 = port B = client 2

这让事情变得简单。服务器只是发送数据并定期侦听,但仅在客户端丢弃信号时才接收消息。

客户是否定的。它接收信号并仅在丢失数据包时发送。另一种实现方式是客户端/服务器对可以相互通信,使端口真正单向。

我们通过使用两个数据包索引来获得两个端口上的消息可靠性。

client index 1 = server index 2

server index 1 = client index 2

每个索引都是单字节的,并在客户端发送新消息时递增。假定消息传递,直到接收到一个特殊消息,该消息将是丢弃数据包的 UDP 消息。根据设计的字节序以及消息的索引,它将包含丢弃消息的信号可能在它的最重要或最不重要的位/字节中。排队似乎也是必要的,但我还没有详细说明。

【讨论】:

  • 我的数据可以是任何类型,例如 byte[]、int、String、java 对象或我创建的对象。所以当我们想通过UDP传输数据时,我们必须将我的数据类型转换为字节数组,并绑定到DatagramPacket。但是 DatagramPacket 并不能保证可靠性,我有时会丢失数据包。
  • 所以我想知道java是否支持一些可用的机制来可靠地传输数据。你的想法很好,但我们必须自己编程。
  • 是的,你必须自己编程。真的,如果你想要可靠性,你应该使用 TCP,它被设计成可靠的。 TCP 的一个缺点是它可以识别客户端和服务器。所以通常有两个端点,一个做所有的询问,另一个简单地回答这些请求。我不想进入网络地址转换,但是当服务器想要充当客户端时往往会出现问题。一种解决方案是 WSS 或 Web 套接字,它使 Tcp 更像 Udp,因为双方都可以充当客户端。
  • Google 的 Quic 协议已被提交为像 UDP 这样的新的正式互联网标准以供采用(在阅读了更多关于它的信息后,我猜它只是将 TSL (ssl) 引入了 UDP。这很奇怪,因为TSL 规范已经概述了 UDP。我读到 QUIC 可以“很好地”处理丢弃的数据包,无论这意味着什么。您几乎可以肯定地找到并使用 java QUIC 套接字 api。
  • 这种情况下是否需要使用超时?间隔一段时间后,如果客户端没有收到数据,说明数据丢失,服务器必须重新发送。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 2011-09-25
  • 2011-03-03
  • 2012-05-06
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多