うまくいったときも相手に知らせる
でも,フレームに番号を付けて,壊れていたらその番号を知らせるだけで再送はうまくいくでしょうか。いえ,実はこの方法には一つ問題があります。これだけでは送信側は送り終わったフレームを,いつまでもメモリーに保持する必要があります。どのフレームに対して再送要求が来るか予想できないからです。しかし,送信側コンピュータのメモリーは有限なので,すべてのデータをいつまでも保持できません。つまり再送プロトコルには,送信側が送り終えたフレームを必要な期間だけ保持すれば済むようなしくみがいるわけです。受信側がフレームを正しく受け取ったのを送信側に伝えるしくみがあれば,送信側はその知らせを受け取ったらそのフレームを捨てられるようになります。そこで受信側はエラーが発生したときだけでなく,正しく送られたときも,フレームを受け取ったらそのつどメッセージを返すことにしているのです。
![]() |
ところで,もし受信側にフレームが到着せず,途中で消えてしまったらどうなるでしょうか。この場合,送信側はいつまでも受信側からの返信を待ち続け,受信側も次のフレームを待ち続けることになり,通信は止まってしまいます。
そこで,通信が止まるのを防ぐために送信側でタイマーを使います。このタイマーはフレームを送信するたびに動き出し,受信側からのACKを正しく受け取るとリセットされます。途中で信号が失われて受信側にデータが届かなかったり,受信側からのACKが消えると一定時間でタイマーが切れます。この場合は送信側がフレームを再送します。こうすれば通信障害のせいで通信が止まるのを防げます。
一つずつ送ると効率が悪い
ここまで説明してきたフレーム再送方式では,受信側が受け取ったフレームが,新しいものか,前に来たものの再送なのかを識別するために,通し番号を使います。この番号のことを,順序番号(シーケンス番号)と呼びます。順序番号はフレームに埋め込んで送ります。一つ前のフレームと次のフレームとを識別するだけなら最低1ビットあれば事は足ります。
ところが,実際の通信プロトコルでは,1ビットより多くの情報を順序番号に割り当てる場合がほとんどです。なぜなら,順序番号が1ビットだと,送ったフレームが受信側に到着し,そのACKが帰って来るまで送信側が次のフレームを送信できないからです。このようなプロトコルはStop-N-Waitストップンウエイトプロトコルと呼ばれます。確実に再送できますが,いちいち待つ羽目になるので通信の効率がよくありません。
![]() |
![]() |
![]() |
![]() |
![]() |