How would you adjust TCP to tolerate a higher packet loss?
By not using TCP in the first place
The network connection from China to the rest of the world is horrific, packet loss averages 20% during the day and 50% in the evening (but much lower from 2am to 8am). TCP gives you about 20KB/s if you're lucky and completely unusable when you get into 50% packet loss. However, if you open many TCP connections you can get a few MB/s through, which just means file downloads (using a multithreaded downloader) get more bandwidth compared to interactive users.
I've designed a custom stream transport protocol for point to point tunneling over high packet loss networks:
https://gitlab.com/bepissneks/udptun/-/blob/master/udp_stream_transport.hppIt implements multiple streams in one connection, much like SCTP. There is no "sliding window" anymore, data chunks simply sit in a priority queue waiting to be sent, and a thread transmits packets from the queue at a constant rate (currently set at 100pkt/s or 150KB/s). Data chunks are individually ack'd so that only what is lost needs to be retransmitted (optimized for high packet loss conditions). A chunk that isn't ack'd after a timeout (determined by RTT) goes back onto the queue. A packet can contain many data chunks and many acks, so we don't have to send a new packet for every ack.
The use case is you open one udptun connection to the server, listen for local tcp connections, and forward all tcp streams onto the udptun connection. The server side will then create tcp connections to the actual destination as new streams are created, and forward udptun streams to tcp streams. The proxy client/server here implements that:
https://gitlab.com/bepissneks/udptun/-/blob/master/examples/proxy_client.cppThe send rate I'm using is 150KB/s, so it should not hog too much bandwidth, but in theory someone can turn it way up and get a big slice of the bandwidth pie, so I'm not going to document this software or release it in easily accessible form, (and you need to make deep code changes to change the send rate). That speed is good enough for web browsing and very low-fi youtube, but is still small compared to what a typical multithreaded downloader will use up.