开发者

Prevent TCP connections from causing UDP packet loss

开发者 https://www.devze.com 2023-02-19 19:40 出处:网络
Consider the prototypical multiplayer game server. Clients connecting to the server are allowed to download maps and scripts. It is straightforw开发者_StackOverflow中文版ard to create a TCP connecti

Consider the prototypical multiplayer game server.

Clients connecting to the server are allowed to download maps and scripts. It is straightforw开发者_StackOverflow中文版ard to create a TCP connection to accomplish this.

However, the server must continue to be responsive to the rest of the clients via UDP. If TCP download connections are allowed to saturate available bandwidth, UDP traffic will suffer severely from packet loss.

What might be the best way to deal with this issue? It definitely seems like a good idea to "throttle" the TCP upload connection somehow by keeping track of time, and send() on a regular time interval. This way, if UDP packet loss starts to occur more frequently the TCP connections may be throttled further. Will the OS tend to still bunch the data together rather than sending it off in a steady stream? How often would I want to be calling send()? I imagine doing it too often would cause the data to be buffered together first rendering the method ineffective, and doing it too infrequently would provide insufficient (and inefficient use of) bandwidth. Similar considerations exist with regard to how much data to send each time.


It sounds a lot like you're solving a problem the wrong way:

  1. If you're worried about losing UDP packets, you should consider not using UDP.
  2. If you're worried about sharing bandwidth between two functions, you should consider having separate pipes (bandwidth) for them.
  3. Traffic shaping (which is what this sounds like) is typically addressed in the OS. You should look in that direction before making strange changes to your application.
  4. If you haven't already gotten the application working and experienced this problem, you are probably prematurely optimizing.


To avoid saturating the bandwidth, you need to apply some sort of rate limiting. TCP actually already does this, but it might not be effective in some cases. For example, it has no idea weather you consider the TCP or UDP traffic to be the more important.

To implement any form of rate limiting involving UDP, you will first need to calculate UDP loss rate. UDP packets will need to have sequence numbers, and then the client has to count how many unique packets it actually got, and send this information back to the server. This gives you the packet loss rate. The server should monitor this, and if packet loss jumps after a file transfer is started, start lowering the transfer rate until the packet loss becomes acceptable. (You will probably need to do this for UDP anyway, since UDP has no congestion control.)

Note that while I mention "server" above, it could really be done either direction, or both. Depending on who needs to send what. Imagine a game with player created maps that transfer these maps with peer-to-peer connections.

While lowering the transfer rate can be as simple as calling your send function less frequently, attempting to control TCP this way will no doubt conflict with the existing rate control TCP has. As suggested in another answer, you might consider looking into more comprehensive ways to control TCP.

In this particular case, I doubt it would be an issue, unless you really need to send lots of UDP information while the clients are transferring files. I wold expect most games to just show a loading screen or a lobby while this is happening. Neither should require much UDP traffic unless your game has it's own VOIP.

Here is an excellent article series that explains some of the possible uses of both TCP and UDP, specifically in the context of network games. TCP vs. UDP

In a later article from the series, he even explains a way to make UDP 'almost' as reliable as TCP (with code examples).

And as always... and measure your results. You have no way of knowing if your code is making the connections faster or slower unless you measure.


"# If you're worried about losing UDP packets, you should consider not using UDP."

Right on. UDP means no guarentee of packet delivery, especially over the internet. Check the TCP speed which is quite acceptable in modern day internet connections for most users playing games.

0

精彩评论

暂无评论...
验证码 换一张
取 消