前方誤り訂正(FEC):再送なしで誤りを直す
再送のラウンドトリップを待たずに受信側だけで誤りを直せる仕組みが腑に落ちる。ハミング符号やリードソロモンの考え方から、QUICや無線でのFEC適用とオーバーヘッドのトレードオフまで一気に押さえられる。
- 1.FEC(前方誤り訂正)は送信側があらかじめ冗長なパリティを付加し、受信側が再送なしで誤りを訂正する方式。再送のRTTを待てない高遅延・片方向・ブロードキャスト環境で効く。
- 2.ハミング符号はパリティビットの組み合わせで誤りビットの位置を特定し1ビットを訂正、リードソロモンはシンボル単位のブロック符号でバースト誤りや消失(イレイジャ)に強い。
- 3.FECは帯域オーバーヘッドと引き換えに遅延を削る。誤り率が低い経路では純損になりうるため、QUICや無線では損失率に応じて冗長度を調整するのが要点。
再送ではなく訂正という発想
パケットが壊れたり失われたとき、TCP は受信側が欠落を検知して送信側に再送を要求します(/network/tcp-retransmission/)。これは確実ですが、必ず1往復(RTT)以上の待ち時間を伴います。衛星リンクのように RTT が数百ミリ秒ある経路、放送やマルチキャストのように受信者が多すぎて個別再送が破綻する状況、あるいは音声・映像のように再送が間に合わない用途では、この往復がそのまま品質劣化になります。
前方誤り訂正(FEC: Forward Error Correction) はここで発想を変えます。送信側があらかじめ冗長なパリティ情報を本体に付け、受信側は届いたものだけから誤りや欠落をその場で復元します。「forward(前方)」とは、訂正に必要な情報を送信方向にあらかじめ流しておくという意味で、後ろ向き(送信元への再送要求)と対をなします。誤りを見つけるだけの CRC(/network/ethernet-frame-crc/)が「検出専用」だったのに対し、FEC は位置の特定と修復まで踏み込みます。
FEC が扱う誤りには2種類あります。誤り(error) はビットが化けたが位置が不明なケース、消失(erasure, イレイジャ) はパケットごと失われたが「どこが欠けたか」は分かるケースです。位置が既知の消失の方が訂正は容易で、同じ冗長度でより多く回復できます。パケット網では「届いたか届かないか」が明確なので消失訂正として設計されることが多いです。
ハミング符号:1ビット誤りの位置を当てる
FEC の最小形がハミング符号です。発想は「複数のパリティビットを、それぞれ異なるビット位置の組に対して計算する」こと。各パリティが「自分の担当範囲に誤りがあるか」を1ビットで答え、その答えを並べると誤りビットの位置を二進数で名指しできます。
ハミング(7,4) は4ビットのデータに3ビットのパリティを足して7ビットにします。パリティ位置を1,2,4(2のべき乗)に置き、各パリティはビット番号の特定ビットが立つ位置をすべて XOR します。
ビット位置: 1 2 3 4 5 6 7
役割: P1 P2 D1 P4 D2 D3 D4
P1 = 位置1,3,5,7 のXOR (位置番号の最下位ビットが1の桁)
P2 = 位置2,3,6,7 のXOR (2番目のビットが1の桁)
P4 = 位置4,5,6,7 のXOR (3番目のビットが1の桁)
受信側は同じ XOR を再計算し、3つのパリティの一致/不一致を並べた シンドローム を作ります。シンドロームが 000 なら誤りなし、それ以外ならその二進数値がそのまま誤りビットの位置を指すので、その1ビットを反転すれば訂正完了です。再送は一切いりません。
訂正能力は 符号間の最小ハミング距離 で決まります。ハミング(7,4) の最小距離は3で、一般に最小距離 d の符号は floor((d-1)/2) ビットの訂正、または d-1 ビットの検出ができます。距離3なら1ビット訂正です。SEC-DED(拡張ハミング)はパリティを1つ足して距離4にし、1ビット訂正かつ2ビット検出を実現します。これは /oci/ などサーバーの ECC メモリでも使われる古典的な技法です。
リードソロモン:シンボル単位でバーストに強い
ハミング符号は無作為な単一ビット誤りには効きますが、ノイズが連続ビットをまとめて壊すバーストエラーには弱い。そこで実用 FEC の主役になるのが リードソロモン(RS)符号 です。
RS はビットではなく シンボル(通常8ビット=1バイト)単位 で扱うブロック符号です。RS(n, k) は k 個のデータシンボルに n - k 個のパリティシンボルを足して n シンボルのブロックにします。核心は次の性質です。
- 任意の
n - k個までのシンボル消失 を完全復元できる(消失の場合)。 - 位置不明の誤りなら
(n - k) / 2個まで 訂正できる。 - 1シンボル内なら何ビット化けても「1シンボル誤り」として数えるので、連続バーストに極めて強い。
| 符号 | 単位 | 得意な誤り | 代表的な用途 |
|---|---|---|---|
| ハミング(7,4) | ビット | 無作為な単一ビット | ECCメモリ・制御信号 |
| リードソロモン | シンボル(バイト) | バースト・消失 | QR・CD/DVD・地デジ・ストレージ |
| 畳み込み/ビタビ | ビットストリーム | 連続的な軟判定誤り | 無線・衛星(連続伝送) |
| LDPC / Turbo | ブロック | シャノン限界に近い軟判定 | 5G・Wi-Fi 6・DVB-S2 |
RS が「n - k 個まで」回復できるのは、k 個の点を通る次数 k - 1 の多項式が一意に決まる、という代数(有限体上の多項式補間)の帰結です。n 個の評価点のうち k 個さえ無事なら元の多項式=データを復元できる——だから最大 n - k 個まで失っても平気、という保証が数学的に立ちます。ストレージの RAID 6 が任意2台のディスク同時故障に耐えるのも、同じく n - k = 2 の消失訂正符号の応用です。
ブロック符号でも、1ブロックに収まらない長いバーストには無力です。そこで送信前にシンボルの順序をインターリーブ(並べ替え)しておき、受信側で元に戻します。すると連続して壊れた区間が、復元後には各ブロックへ薄く分散され、1ブロックあたりの誤り数が訂正能力内に収まります。CDの傷やWi-Fiのフェージング対策で定番の組み合わせです。
QUIC・無線での適用とトレードオフ
FEC はタダではありません。n - k 個のパリティは純粋な帯域オーバーヘッドで、誤りが起きなければ無駄に送った冗長分です。ここに本質的なトレードオフがあります。
損失率が低い経路: 再送はめったに起きない
→ FECの冗長分が常時オーバーヘッドになり純損
損失率が高い/RTTが長い経路: 再送の往復コストが大きい
→ FECで先回り訂正した方が総合的に速い・安定
/network/quic-internals/ の QUIC では、損失したパケットの再送(loss recovery)が基本で、純粋な FEC は標準では採用されませんでした。理由はまさにこのトレードオフで、一般的なインターネット経路は損失率が低く、固定的な FEC オーバーヘッドが平均的に割に合わないと判断されたためです。それでも、再送の RTT が致命的になる低遅延ストリーミングやリアルタイム通信向けに、QUIC 上で選択的に FEC を載せる拡張が研究・実装されています。
無線は FEC が必須の世界です。電波は距離・障害物・干渉で常時ビットが化けるため、Wi-Fi(/network/wifi-csma-ca/)や 5G は物理層に LDPC や畳み込み符号を組み込み、さらに変調方式と符号化率を電波状況に応じて動的に切り替える適応変調符号化(AMC)を行います。電波が良ければ冗長を減らして実効速度を上げ、悪ければ冗長を増やして到達性を守る——固定オーバーヘッドの欠点を、状況連動で打ち消す設計です。
FEC の訂正能力には上限があり、(n - k) / 2 を超える誤りが入ると訂正できないどころか誤訂正で別の正しいシンボルを壊すことすらあります。だから実装は CRC などの検出と併用し、訂正能力を超えた場合は破棄や再送にフォールバックします。また FEC は冗長度を上げるほど安全になりますが、その分だけ実効スループットが下がるため、損失率の実測に冗長度を合わせる運用が前提です。
「FECとARQ(再送)の違い」→ FECは受信側だけで訂正しRTTを待たない、ARQは再送要求で確実だが往復が要る。「ハミング符号の訂正原理」→ 複数パリティのシンドロームが誤りビット位置を二進で名指す、最小距離3で1ビット訂正。「リードソロモンの強み」→ シンボル単位ゆえバースト耐性が高く、n-k個の消失まで復元。「FECのコスト」→ 固定の帯域オーバーヘッドで、低損失経路では純損。この4点を押さえれば上級。
まとめ
FEC の本質は「訂正に必要な冗長をあらかじめ前方へ送っておき、受信側が再送なしで自力修復する」ことです。ハミング符号はパリティのシンドロームで誤りビットの位置を名指して1ビットを直し、リードソロモンはシンボル単位のブロック符号でバーストと消失に強く、n - k 個までの欠落を代数的に保証して回復します。代償は固定の帯域オーバーヘッドで、低損失経路では純損になりうる——だから QUIC は再送を基本に据え、無線は適応符号化で冗長度を状況に合わせます。「RTT を払うか、帯域を払うか」という交換として捉えると、どの経路で FEC が効くかが見通せます。
ネットワーク Article
前方誤り訂正(FEC):再送なしで誤りを直すを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
FEC
比較で見る軸
難易度: advanced / カテゴリ: ネットワーク / タグ数: 6
導入後に効く点
ハミング符号はパリティビットの組み合わせで誤りビットの位置を特定し1ビットを訂正、リードソロモンはシンボル単位のブロック符号でバースト誤りや消失(イレイジャ)に強い。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ネットワーク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「FEC / 誤り訂正」に近いか確認する。
- 強みである「FEC(前方誤り訂正)は送信側があらかじめ冗長なパリティを付加し、受信側が再送なしで誤りを訂正する方式。再送のRTTを待てない高遅延・片方向・ブロードキャスト環境で効く。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。