考虑原型多人游戏服务器。
允许连接到服务器的客户端下载地图和脚本。可以直接创建TCP连接来完成此任务。
但是,服务器必须继续通过UDP响应其余客户端。如果允许TCP下载连接使可用带宽饱和,则UDP流量将严重受到丢包的影响。
处理此问题的最佳方法是什么?通过跟踪时间以某种方式“限制”TCP上传连接似乎是一个好主意,并且在常规时间间隔内send()
。这样,如果UDP数据包丢失开始更频繁地发生,则可以进一步限制TCP连接。操作系统是否仍会将数据聚集在一起而不是稳定地将其发送出去?我多久要拨打一次send()
?我想这样做太经常会导致数据缓冲在一起,首先使方法无效,而且不经常这样做会提供不充分(并且效率低下)的带宽。关于每次有多少数据send
,存在类似的考虑因素。
答案 0 :(得分:2)
这听起来很像你以错误的方式解决问题:
答案 1 :(得分:1)
为避免带宽饱和,您需要应用某种速率限制。 TCP实际上已经这样做了,但在某些情况下它可能不会有效。例如,您不知道天气,您认为TCP或UDP流量更重要。
要实现涉及UDP的任何形式的速率限制,首先需要计算UDP丢失率。 UDP数据包需要具有序列号,然后客户端必须计算它实际获得的唯一数据包数量,并将此信息发送回服务器。这为您提供了丢包率。服务器应监视此情况,如果在文件传输开始后数据包丢失跳跃,则开始降低传输速率,直到数据包丢失变为可接受为止。 (无论如何,您可能需要为UDP执行此操作,因为UDP没有拥塞控制。)
请注意,我提到"服务器"在上面,它可以真正完成任一方向,或两者兼而有之。取决于谁需要发送什么。想象一下游戏中玩家创建的地图,通过点对点连接传输这些地图。
虽然降低传输速率可以像调用发送功能那样简单,但尝试以这种方式控制TCP无疑会与TCP现有的速率控制冲突。正如另一个答案中所建议的那样,您可以考虑寻找更全面的方法来控制TCP。
在这种特殊情况下,我怀疑这是一个问题,除非您确实需要在客户端传输文件时发送大量UDP信息。 我希望大多数游戏只是在发生这种情况时显示加载屏幕或大厅。除非你的游戏拥有自己的VOIP,否则它们都不需要太多UDP流量。
这是一篇优秀的文章系列,解释了TCP和UDP的一些可能用途,特别是在网络游戏的背景下。 TCP vs. UDP
在该系列的后续文章中,他甚至解释了一种使UDP'几乎成为'和TCP一样可靠(带代码示例)。
一如既往......并衡量你的结果。除非你测量,否则你无法知道代码是否使连接更快或更慢。
答案 2 :(得分:0)
“#如果您担心丢失UDP数据包,则应考虑不使用UDP。”
正确的。 UDP意味着没有保证数据包传输,特别是在互联网上。检查TCP速度,这对于大多数玩游戏的用户而言在现代互联网连接中是完全可以接受的。