对不起这么长的帖子 . 我已经对这个主题进行了大量的研究,并继续猜测自己应该走哪条道路 . 提前感谢您的想法和意见 .
Scenario:
在Java中创建一个程序,每隔0.2到0.5秒发送一次数据包,其中包含简单的"at that moment"或 live 数据到大约5-7个客户端 . (每个数据包最多只有10个字节的数据) . 服务器可以通过wifi或以太网连接 . 但客户仅限于使用Wifi . 客户端不会向服务器发送任何数据包,因为它只显示从服务器检索的数据 .
My Thoughts:
我最初开始使用 TCP 作为传输层创建服务器程序 . 这将使用Java中的ServerSocket类 . 我也使它多线程接受多个客户端 .
由于各种原因,TCP听起来像个好主意 .
-
使用TCP,除非连接失败,否则将始终发送消息 .
-
TCP重新排列发送的数据包的顺序 .
-
TCP具有流量控制,启动时需要更多时间进行设置 .
很完美!流量控制对于这种情况至关重要(因为客户端需要最多的并发信息),设置时间并不是那么大,并且我几乎可以保证将收到消息 . 所以,它的官方,我已经决定采用TCP ....
除了TCP丢包后会发生什么? "The biggest problem with TCP in this scenario is its congestion control algorithm, which treats packet loss as a sign of bandwidth limitations and automatically throttles the sending of packets. On 3G or Wi-Fi networks, this can cause a significant latency."
在看到突出的短语“重要延迟”后,我意识到这对于这种情况不太好,因为客户端需要在那一刻看到实时数据,而不是继续从.8秒前接收数据 . 所以,我回到了绘图板 .
在做了更多研究后,我发现了另一个涉及 UDP with Multicasting 的程序 . 这使用服务器端的DatagramSocket和客户端的MulticastSocket .
UDP与多播也有其优点:
-
UDP是无连接的,这意味着数据包被广播给正在收听的任何人 .
-
UDP是 fast ,非常适合音频/视频(虽然我的是简单的数据,如字符串) .
-
UDP不保证交付 - 这可能是好的也可能是坏的 . 它不会落后并产生延迟,但不能保证所有客户端都可能在那时接收数据 .
-
发送一个传递的数据包 .
由于发送数据包的速度相当快(.2-.5秒),我不太担心丢失数据包(除非它一直丢弃数据包并且看起来没有响应) . 我对UDP的主要关注点是它不知道数据包的发送顺序 . 因此,举例来说,我想说我想发送当前时间的实时数据 . 服务器发送包含“11:59:03”,“11:59:06”,“11:59:08”等的数据包 . 我不希望数据以“11:59”的形式呈现给客户端: 08“,”11:59:03“,”11:59:06“等
在获得上述所有信息后,以下是我的问题:
-
TCP在遇到延迟问题时是否“自我追赶”,或者在接收数据包时出现延迟时它是否始终落后?如果是这样,再次检索“实时”数据是否相当快?
-
UDP的数据包多长时间出错?
最重要的是:
- 在您看来,您认为哪种方案最适合这种情况?
感谢您的帮助!
2 回答
如果服务器和客户端之间存在大量跳跃,UDP数据包可能会出现故障,但更有可能的是,有些会被丢弃(再次,跳跃越多,机会就越多) . 如果您对UDP的主要关注是订单,并且您可以控制客户端,那么您可以让客户端丢弃具有比上一次收到的时间戳更早的时间戳的任何消息 .
TCP在遇到拥塞时会将其传输速度恢复,并尝试通过增加它来恢复 .
我不知道那句话是什么意思,但通常最终会恢复全速 .
它完全取决于干预网络 . 对此没有单一的答案 .
NB这是一个非常普通的链接,你引用 .
UDP代表'User Datagram Protocol',而不是'Universal Datagram Protocol' .
UDP数据包确实具有固有的发送顺序,但在接收时无法保证 .
'UDP is faster because there is no error-checking for packets'毫无意义 . 'Error-checking for packets'意味着重传,但只有在丢包时才会发挥作用 . 将有损UDP速度与无损TCP速度进行比较是没有意义的 .
'UDP does error checking'与'UDP is faster because there is no error-checking for packets'不一致 .
'TCP requires three packets to set up a socket connection, before any user data can be sent'和'Once the connection is established data transfer can begin'不正确 . 客户端可以与第三握手消息一起传输数据 .
TCP标头字段列表不完整且订单不正确 .
对于TCP,'message is transmitted to segment boundaries'没有意义,因为没有消息 .
'The connection is terminated by closing of all established virtual circuits'不正确 . 没有虚拟电路 . 这是一个分组交换网络 .
在'handshake'和其他几个地方,他没有提到TCP四向关闭协议 .
句子'Unlike TCP, UDP is compatible with packet broadcasts (sending to all on local network) and multicasting (send to all subscribers)'和'UDP is compatible with packet broadcast'毫无意义(并且偶然从早期版本的维基百科文章中解除) . 这里正确的术语不是'compatible'而是支持 .
我不喜欢这种引用任意互联网垃圾的做法,然后根据它提出问题 .