TCP/IP is an amazing protocol. It was designed forty years ago and it’s still relevant. Well not totally relevant and we really should be talking about a successor for the future. I know we can’t change it easily but at least
TCP is a Lossy Protocol
The foundation of TCP/IP design is that the network is unreliable and packets will be lost. In fact, the TCP protocol demands this feature to determine the maximum possible transfer rate. The packet transmission rate ramps until the maximum bandwidth in the path is reached forcing packet loss in the network. TCP detects these dropped packets and then slows down the transmitting rate.
It looks something like this diagram.
So its impossible to make TCP lossless, it’s designed into its operation.
This is why Quality of Service never works. TCP will drop packets is almost every systems because there is less bandwidth in the network than the endpoints can transmit.
You can modify the transmission algorithm (and many updated TCP drivers exist for Linux) but no one really cares enough to actually roll it out widely.