資料連結層
停止等待(stop-and-wait)
想像兩個人來回傳一顆球,但有條嚴格規定:在對方接到上一顆球並喊出「收到」之前,你不可以丟下一顆。停止等待正是把這條規則套用在資料上。發送方送出一個訊框後,就「停下來等待」一個確認,得到後才被允許送下一個。它是最簡單的可靠協定。
一步步來:發送方送出第 0 號訊框並啟動計時器。若正確的 ACK 0 回來,它就送第 1 號訊框;若計時器先逾時(訊框或其 ACK 遺失了),它就重送第 0 號訊框。單一個序號位元——0、1、0、1 交替——就夠用,因為任何時刻都只有一個訊框在途中。那一個位元讓接收方能偵測重複:若第 0 號訊框因為它的 ACK 遺失而再次到來,接收方看到重複的號碼,便丟掉這個重複的訊框,但會重送 ACK,好讓發送方能往下走。這有時被稱為交替位元協定。
停止等待正確且易於推理,但它可能慢得令人痛苦。因為任何時刻只有一個訊框在途中,發送方大部分時間都閒置著,為每個訊框乾等一整個往返。在一條頻寬高、延遲長的連結上——比方說衛星連結——你可能花一微秒就把訊框送出去,接著卻要等上幾百毫秒才等到 ACK,讓昂貴的連結幾乎完全空著。它的效率大約是每個往返時間(RTT)一個訊框,這正是後退 N 與選擇性重送這類管線化協定存在的原因:為了同時讓許多訊框在途中。
在一條能用 1 微秒送出一個訊框、但往返時間是 100 毫秒的連結上,停止等待送出一個訊框後,就為等 ACK 閒置 100 毫秒。連結有超過 99.99% 的時間空著——使用率趨近於零,即使連結本身很快。
每個往返只送一個訊框,幾乎完全浪費了一條又快又長延遲的連結。
停止等待只需要 1 位元的序號,但不論連結多快,它的吞吐量都被封頂在「每個往返一個訊框」。管線化(後退 N、選擇性重送)的存在,正是為了修掉這段閒置時間。
又稱
另見