一度にたくさんのコンピュータが大量のパケットを送信すると、ネットワークがパンク状態になってしまう。 この場合、ルータでパケットが失われ、そのパケットを送り直さなければならないが、何も考えずにすぐに送り直してしまっては、送り直したパケットでまたネットワークが混雑してしまい、送り直したパケットも失われてしまう。 つまり、いつまで経ってもパケットが目的地までたどり着けない、無限ループに陥ってしまう。
そこでTCPは、ネットワークの混雑度を推測してデータセグメントの送信量を制御するようにしている。 空いている時にはたくさんの荷物を送り出し、混雑している時には少なめに控えるようにしているのだ。
混雑度を推測するのは非常に難しいため、TCPは自分の知っている事実から単純に混雑を察知する。 『ネットワークが混雑しているからパケットが損失する』という考えのもと、確認応答のタイムアウトが発生したら、送信データ量を少なくするようにする。
具体的には、『どれだけ空いているか』、つまり『一度にどれだけデータを送ってよいか』を決める基準として、輻輳ウィンドウ(snd.cwnd)という数値を用いる。 タイムアウトが発生する度に輻輳ウィンドウの数値を小さくしていき、正常に確認応答が来る度に輻輳ウィンドウの数値を大きくしていく。