指数バックオフ
通信に失敗して再送するときに、待ち時間を再送のたびに2倍などの指数関数的に増やしていく方式。混雑しているネットワークに、再送が集中するのを防ぐ。
イマシルちゃんの解説
電話がつながらなかったとき、すぐに何度もかけ直すと、回線がますます混んじゃうよね。
指数バックオフは、「1回目は2秒待つ」「2回目は4秒待つ」「3回目は8秒待つ」って、
失敗するたびに、待つ時間をどんどん長くする方法なんだ。
みんながこのルールを守ると、混雑が落ち着くまで、上手に待てるんだよ!
より深い解説
定義
指数バックオフは、送信が失敗したと判断したとき、次の再送までの待ち時間を、失敗の回数に応じて指数関数的に(多くは倍々に)長くするアルゴリズムである。待ち時間にランダムな揺らぎを加えて、複数の送信者の再送のタイミングがそろわないようにすることが多い。
CoAPでの再送
CoAPでは、確認が必要なメッセージ(CON)を送ったあと、確認応答(ACK)が返らなければ、指数バックオフで再送する。
| 項目 | 既定値(RFC 7252) |
|---|---|
| 最初の待ち時間 | ACK_TIMEOUT(2秒)× 1~ACK_RANDOM_FACTOR(1.5)の間のランダムな値 |
| 再送ごとの待ち時間 | 前回の2倍 |
| 最大の再送回数 | 4回 |
例:最初の待ち時間が2秒なら、ACKが返らないとき、2秒後、さらに4秒後、8秒後、16秒後……と再送する。
使われている場面
| 場面 | 内容 |
|---|---|
| 初期のイーサネット(CSMA/CD) | 衝突のたびに、待ち時間を選ぶ範囲を2倍に広げ、その中からランダムに選ぶ(バイナリエクスポネンシャルバックオフ) |
| 無線LAN(CSMA/CA) | 送信の前のランダムな待ち時間の範囲(コンテンションウィンドウ)を、失敗のたびに広げる |
| TCPの再送 | 再送タイマー(RTO)がタイムアウトするたびに、次のRTOを2倍にする |
| CoAP | ACKが返らないCONの再送 |
| Web APIやクラウドのクライアント | 一時的なエラーのとき、待ち時間を増やしながら再試行する |
ランダムにする理由
多数の機器が同時に失敗して、同じ規則で同じ時間だけ待つと、再送がまた同時に起こり、衝突や混雑を繰り返してしまう。待ち時間にランダムな揺らぎ(ジッタ)を加えることで、再送のタイミングがばらけ、成功しやすくなる。
同じ考え方で、多数のIoT機器が決まった時刻にいっせいにデータを送ると、サーバやネットワークに負荷が集中する。測定の後、ランダムな時間だけ待ってから送るようにすれば、負荷の集中を避けられる。