Solution (source code)

= Solution

For two competing <TCP> connections, each sender's <congestion control> aims to obtain useful throughput while adapting to shared capacity and avoiding persistent overload. For two comparable, continuously backlogged connections at one bottleneck, the usual fairness objective is approximately half the available capacity each, while keeping the bottleneck productively used. The goal is not for both senders independently to seize the whole link. Unequal delays, implementations, application demands and other bottlenecks mean that equal throughput is not guaranteed.

For two <UDP> exchanges, there is no corresponding built-in transport <congestion control> objective: <UDP> sends datagrams without specifying a congestion response. The applications might implement well-behaved <congestion control>, rate limiting or no adaptation at all. Consequently two <UDP> labels alone do not determine either a target share or the resulting allocation. Applications should still manage overload; that responsibility is outside the base <UDP> service.

For a competing <TCP> connection and an unresponsive high-rate <UDP> application sharing an ordinary queue, losses cause the <TCP> sender to reduce its offered load while the <UDP> sender continues. The <UDP> traffic can take much of the bottleneck capacity and severely reduce <TCP> throughput. If the <UDP> rate exceeds capacity, it too loses <packets>; sending more does not guarantee useful delivery. A modest-rate or adaptive <UDP> application, or a <router> enforcing <fair queueing>, gives a different outcome. Thus
$$
\boxed{\text{TCP seeks an adaptive fair share; UDP alone supplies no competing control law}.}
$$