自動再送要求
Stop-and-wait ARQ は、非常に単純な自動再送要求(ARQ)である。送信側は1度に1つのフレームを送る。フレームを送った後、送信側は ACK を受信するまで次のフレームを送らない。受信側はフレームの受信に成功すると ACK を送信する。ACK がある一定時間以内に送信側に届かない場合をタイムアウトと呼び、送信側は同じフレームを再送する。
このような実装を Stop-and-wait ARQ と呼ぶ。しかし、実際の実装ではいくつかの問題が生じる。
一般に送信機はフレームの末尾に冗長検査番号を付与する。受信機はその冗長検査番号を使ってフレームに破損がないか調べる。フレームに破損がないと判断した場合、受信機は ACK を送る。フレームに破損があると判断した場合、受信機はそのフレームを捨て、ACK を送らない。フレームに実際には破損がなくとも、そのフレームは完全に失われる。
問題は、ACK フレームが破損したり失われた場合である。この場合送信側はACKを受信しないのでタイムアウトとなり、フレームを再送する。受信側は同じフレームを2回受信することになるが、再送されたフレームが前のフレームと同じものかどうかは分からない(プロトコル上定義されていない)。
もう1つの問題は、転送媒体によっては受信側が送ったACKを受け取る前に送信側がタイムアウトするほどレイテンシが大きい場合である。
この場合も送信側はフレームを再送し、受信側は同じフレームを2回受信することになる。送信側はACKを2回受け取ることになり、送信側の実装によってはタイムアウトしたと判断したフレームのACKと解釈できない場合があり、問題が生じる。
これらの問題を防ぐための最も一般的な解決策は、フレームのヘッダ部に1ビットのシーケンス番号を付与することである。このシーケンス番号は通常のフレームの順序に従って、1と0という値を交互にとる。受信側がACKを送るとき、次に受信したいフレームのシーケンス番号をACKフレームに含める。このようにすれば、受信側はシーケンス番号を調べることでフレームの重複を検出できる。続けて受信した2つのフレームのシーケンス番号が同じだった場合、これらは重複しており、2つめのフレームは捨てられる。同様に、続けて受信したACKに同じシーケンス番号がある場合、同じフレームへのACKであると判断できる。
Stop-and-wait ARQ は、フレームを送信するたびにACK受信を待つ必要があり、他の手法よりも非効率である。より効率化するには、複数のフレームを連続して送信し、それら全体に対してACKを返すようにすればよい。このような方式として Go-Back-N ARQ や Selective Repeat ARQ がある。