Jits, please forgive my inexperienced ramblings, I've never programmed anything like a network game engine before, but after reading your initial statement something occurs to me:
your proposed idea seems to have similar logic to TCP's error recovery - why not use TCP-based file transfer anyway?, then all error recovery is catered for in-protocol. This way is also less affected by latency times as your TCP ack's not only take care of themselves but probably also are also more reliable than your UDP client requests. For instance, if I have a high ping (200+), and receive a segment from the server ok, yet my request for the next block is dropped on the way to the server due to some congestion or CPU bottleneck (or in some cases traffic shaping if your ISP is as rubbish as mine) I'll have to wait for the client timeout value to count off before I even have a chance of receiving the next desired segment. Whereas a TCP request would mean the server and client wouldn't really need to worry about timeouts and missing acks and things as it would all be taken care of for it by the TCP stack + traffic shapers and line congestion would be less likely to drop the ack/request. On reading that back, it strikes me that this may not speed up file transfers in general, just for those who are losing out due to the nature of UDP's unreliable nature mixed with unfortunate next hops.
Why does the server run at 10hz? I imagine theres a good reason for this, but like I say I have no idea of the ins and outs of netcode.
- Rick