The XBox 360 TCP stack does not respond to TCP Zero Window Probes with a 0-byte payload The XBox 360 TCP stack does not respond to TCP Zero Window Probes with a 0-byte payload android android

The XBox 360 TCP stack does not respond to TCP Zero Window Probes with a 0-byte payload


I found a few things that may help:

  1. TCP ioctl(2) TCP_NODELAY will cause the kernel to send an immediate PSH packet. It might unstick the connection.

  2. TCP ioctl(2) TCP_QUICKACK will do something funny with ACK packets. It might unstick the connection.

  3. If you use send(2) you can set the MSG_OOB flag, which might poke the XBox right in the eye, get its attention, and maybe things can start over. CISCO wrote a nice summary of how different platforms respond to TCP URG, and their advice is to avoid using URG, but it's crazy enough it just might work.

  4. TCP socket option TCP_CONGESTION lets you select different congestion-avoidance algorithms. Maybe you could find one that helps avoids the filled windows in the first place? (At least TCP Vegas is implemented as a module, it might not be possible to change away from the default congestion avoidance algorithm on the android platform.)


Actually, you are running into a Linux bug. Linux is not RFC793 compliant when dealing with zero window situations. Windows is actually doing the correct thing. Note that RFC 793 does NOT require that the receiver send an unsolicited window update message. Instead, the requirement is that the sender send a window probe with at least ONE octet of data.


You may want to consider using UDP instead of TCP. I'm assuming you want the Xbox to play the audio, not create a copy of it locally? In which case you really don't care if you get every single packet reliably. The reliability of packet transmission is the overhead that you get with TCP, but maybe you don't really need it. UDP is much simpler and is more typical in streaming situations.