LED通信事業プロジェクト エンジニアブログ
H-ARQってなに?
記事更新日 2023年3月14日
はじめに
このブログでも度々書いていますが、「弊社の製品LEDバックホールのエラー率はどれぐらいですか?」と聞かれることがあります。その答えは「H-ARQを使っているので、光区間はともかくLEDバックホールの端端では特殊な状況で無い限りほぼエラーレスですよ」となります。しかし、そういう返答をすると、当然のことながらH-ARQを理解している方ばかりではないので「はあ、そうなんですか・・・」という、恐らく理解されていないであろう反応をされることも少なくありません。
H-ARQはエラーを訂正する技術で、FEC(Foward Error Correction)と呼ばれる処理の一つです。LTEや5GNRにも使われていて、今時の無線通信なら基本であるともいえるものなのですが、その中身は単純ではありません。H-ARQの中身を理解するには、少々H-ARQと直接の関係はない周辺技術、特に情報理論を理解する必要があって説明は長くなります。誰かH-ARQを上手く簡潔に説明してくれないかな?と思いまして、今話題のChatGPTに「H-ARQとは何ですか?」と聞いてみました。答えはこんな感じでした。
私: H-ARQを詳しくない人にも分かるように教えてください。
ChatGPT: H-ARQ(Hybrid Automatic Repeat reQuest)は、通信システムにおいてデータ転送の信頼性を向上させるための技術です。通常、データは一度に送信されますが、通信路にノイズや干渉がある場合、データが正しく伝送されないことがあります。H-ARQでは、データを複数回に分けて送信し、受信側でそれらを組み合わせることで、信頼性を向上させます。 具体的には、最初に送信したデータにエラーが発生した場合、受信側はエラーを検出し、送信側にエラーを通知するためにNACK(Negative ACKnowledgement)と呼ばれる特別な信号を送信します。この場合、送信側は再度同じデータを送信します。受信側が正しく受信した場合、ACK(ACKnowledgement)信号を送信し、次のデータを受信するように指示します。このように、H-ARQは複数回の送信と受信を組み合わせ、データ転送の信頼性を向上させます。 H-ARQは、通常、無線通信システムや光通信システムなど、ノイズや干渉が多い通信路で使用されます。また、H-ARQは、フロー制御やエラー検出・訂正などの機能と組み合わせることで、通信システムの性能を向上させることができます。
むむ。わかるような、わからないような・・ しかし、この文章だけでH-ARQのイメージが湧く人は情報理論に明るい方だろう、というかそもそもH-ARQを理解できているひとにしか理解できない気がします。ChatGPTは素晴らしいですが、まだ万能ではないみたいですね。仕方が無いので(?)、今回はChatGPTに代わりまして、このブログが情報理論にさほど明るくない人でも分かるように順を追ってH-ARQを説明したいと思いますので、よろしくお願いいたします。
H-ARQの前に知っておく必要があること
無線区間のエラーは必ず発生する
通信区間の雑音(ノイズ)を完全に取り除くことはできません。熱雑音であったり半導体の雑音であったり、何らかのノイズは必ず存在します。まあ、これは物理的に回避はできません。しかし、ノイズがあるから必ずエラーが発生するわけではありません。ノイズに対して十分な帯域、つまり余力があれば、エラーの確率は実用上無視できるほど小さくできます。ノイズとエラーの関係は、情報理論的にシャノンの通信路符号化定理というもので計算できるようになっています。
有線の通信、例えば数十m程度の1000Base-T対応LANケーブル(例えばCat5e)ですと、一週間ずっと測定しても1パケットすらエラーにならないというレベルで通信が可能です。このレベルならエラーを実用上無視できる「エラーフリー」と言っていいと思いますが、これはLANケーブルがツイストペア線という低ノイズの信号線を使っていて、かつ速度も最大1Gbpsとノイズの大きさの割りに速くない速度だからです。つまりは、LANケーブルなら1Gbpsは十分にノイズに対して余力がある、ということです。一方で無線通信、ここで言う無線とは電波、光の両方ともですが、その無線でLANケーブルのようなエラーフリーな通信は極めて難しいのです。それはノイズに対する余力が無いためですが、その理由を詳しく見ていくと、大きく3つほどあることが分かります。
一つはノイズが大きいこと。外からの影響が抑えられる有線と、オープンな環境の通信となる無線では、ノイズの大きさが全く異なるというのは皆さんご理解できることと思います。次に、信号強度が変動すること。有線は乱数要素の高いノイズは変動しても基本的に信号強度はほぼ一定です。一方の無線は信号強度も様々な理由で変動します。フェージングだったり、電離層の反射だったり、雨の影響だったり、どれもとても影響が大きいです。フェージングだと信号強度が30dB下がる(=1/1000になる)瞬間もありえますから、その瞬間はエラーが発生する確率が上がります。
さて最後3つめ。前述の2つの問題は、雑音や信号といったシャノンの通信路符号化定理”枠内”の内容でしたが、最後はそういった話では無く周波数利用効率だったり電波法だったりの「社会的問題」になります。前述のシャノンの定理によれば、電波であっても非常に強い信号を使い、広い帯域を取って、かつとても遅い速度で通信すればエラーフリーにできるはずです。しかし、それだと極めて周波数利用効率が悪い通信になってしまいます。電波は有限です。どれも貴重で都会の土地のようなものです。だから、どのような周波数であろうと無駄にすることはできません。有限な電波を、国から割り当てられてもらって利用する以上は、「どれだけ周波数利用効率を上げるか」という命題から逃げることは許されません。そのため、エラーフリーにするために、ノイズ、フェージングなどの全ての変動要素を吸収するため帯域や出力に過剰なマージンを持たせるような「非効率的」なことはできないのです。
というわけで、無線区間においては、その性質からある程度のエラーを許容した状態で通信をしなければいけません。実際、第三世代携帯電話以前の(回線交換による)音声通信をしていた頃は、通信は常に1%のエラーとなるように出力が調整されていました。音声の1%がエラーになったところで通話には全く影響ありませんので、全体の回線容量を増やすことを重視し多少のエラーは許容していました。しかし、データ通信(パケット通信)で1%どころか1パケットもエラーが許容されません。エラーが必ず発生する回線なのにエラーが許されない、そういったときはどうすればいいでしょうか?
ARQ
その疑問に対する回答は難しい話ではありません。エラーが出るけどエラーは許されない。それであれば、エラーが出たらもう一回送ればい良いのです。正しいデータが送られるまで何回でも再送する。パケット通信の基本はここにあります。皆さんTCP/IPという言葉を聞いたことがあると思います。世の中のインターネット通信の多くはこのTCP/IPというプロトコルを使って通信されていますが、TCP/IPの内の"TCP"が再送を担っているプロトコルになります。
TCPはTransmission Control Protocolの略で、これが何をやっているかというと全てのパケットが「エラー無く、必ず到達する」ように管理をしています。TCPはただパケットを送るだけでなく、相手に届いたかどうか確認し、届かなかった場合は再送を要求します。具体的に言えば、TCPはパケット毎に「届いた(ACKnowledgement: ACK)」「届かない(Negative ACKnowledgement: NACK)」のやり取りをしています(図1)。受信側は、届いたパケットにエラーが無ければ「ACK」を返し、届いたパケットがエラーだった場合は「NACK」となり何も返しません。送信側は「ACK」が帰ってこなかった場合「NACK」であったと判断し、もう一度同じパケットを再送します
このやり取りを自動再送要求(Automatic Repeat reQuest: ARQ)と呼びます。インターネットはこのTCPのARQ機能によってエラー再送してくれるおかげで、メールが正しく送受信出来て、ホームページが正しく見られる訳です。
FEC
ARQは絶対必要な機能ですが、エラーがそれなりの頻度で出ることが予想される無線通信において、単純に再送するのは効率が悪いとされています。例えばエラーで1回再送するとして、エラーになったパケットと再送するパケットの二回分送ることになります。例えば、エラーが10%ある環境においては、10%の再送があるはずで、10%帯域を無駄にしていることになります。また、ARQは再送なのでエラーが発生すると必ず遅延が発生します。TCPのARQはACKをタイムアウトまで待ってから再送するため、再送パケットの遅延はかなり大きくなります。TCPタイムアウトの初期値は1秒※1ですから、かなりインパクトが大きいことが分かります。そして、エラー率が上がると全体の平均遅延も大きくなります。そうなると、リアルタイム性が求められる通信でTCPのARQを使うのは難しいです。無駄、遅延、2つの観点で無線通信のエラー処理にARQだけで対応するというのは通信的に効率的ではない、と言えるのです。
それではどうするかというと「あらかじめ信号に冗長性を持たせて多少エラーがあっても受信側で訂正してしまう」という方法を採ります。冗長性といってもピンとこない方がいるかも知れません。定義的なものをいえば「エラーを訂正するために元のデータより少々長い(冗長な)データを送ること」となります。このような受信側でエラー訂正をするように構成する仕組みをForward Error Correction略してFECと呼んでおります。日本語だと前方誤り訂正と呼ばれます。このFECはエラーの多い無線通信では必須の機能です。
FECの最も簡単な冗長の例が「同じものを3回送る」というやつです。受信したデータがあ3つ同じデータならエラー無しですが、1つエラーがあっても他の2つが一致しているなら正解とみなせる!というわけでエラーが訂正できるわけです・・・
って、これじゃARQよりも効率悪い!この例を見るまでも無く、冗長性を沢山取ればエラー訂正能力は上がりますが、その分通信効率は下がるのは容易に想像が付くと思います。例えば10回、20回繰り返し同じデータを送ることが許されるなら、エラー訂正なんて簡単です。しかし、それでは実通信速度は下がりますし、特に無線通信においてはそんな非効率な通信は許されません。ですから、どのような計算をすれば簡単にエラーを訂正できるか、つまりは「いかに効率の良いFECのシステムを作れるか」というのがFECのポイントとなります。ただし、この効率というのも上限が理論上決まっています。この上限値は、先述のシャノンの通信路符号化定理によって算出されるもので、一般にシャノン限界と呼んでいます。さきほどの「いかに効率の良いFECのシステムを作れるか」という言葉は「いかにしてFECをシャノン限界に近づけるか」と言い換えることができます。
近年、数学的な理論に加えてデバイス側の進化も大きくなり、携帯電話のような小型機器であってもFECに必要な複雑な計算に耐えうるようになってきたため、FECの効率は劇的にあがりました。先のシャノンの定理が発表されたのが1948年、それからおおよそ50年後の21世紀初頭には、FEC(符号化)理論はすでにそのシャノン限界にほぼ到達したというレベルになりました。例えば、2000年台にシャノン限界に近い符号としてCDMA(HSPA)ではTurbo符号と呼ばれる符号が実用化されました。名前のインパクトもあり聞いたことがある方もいるかも知れませんが、今ではそれもすでに過去のものとなっています。近年は
- LDPC
- ポーラ(Polar)符号
の二つが主に使われており、おそらく今後暫くはこの2つの符号だけ知っていれば十分と言えるほど普及しています。紹介しておいて申し訳ありませんが、これらの2つの符号の仕組みを説明しようとすると情報理論そのものを説明する必要があるためここでは説明しません。まあ、そもそも私がちゃんと説明ができないとも言えますが・・・ その辺は、単なる光無線通信のエンジニアなのでご容赦を!
話を符号に戻しますが、LDPCはLTEや5GNR、Wi-Fiにも使われていて、今一番広く使われているエラー訂正符号です。弊社のLEDバックホールもLDPCを使っています。そして、LDPCはほぼシャノン限界に近いと言える符号ですが、一方のポーラ符号は理論上シャノン限界に”完全に”到達した人類初の符号です。”ほぼ”ではなく”完全に”ですので、もうこれ以上効率は上がりません。ポーラ符号は今のところ使い勝手が劣るためLDPCほどは広く使われていませんが、それでも5GNRの制御チャンネルに使われており、今後さらに使われるようになると考えられます。
さて、冗長性ということを理解するために、実際にFECがどのように行われるかを説明しておきます。まず、ある元となる信号があって、それに対して何らかの計算処理をして元の信号よりも長い信号を作り出します。この長くなった信号、元のデータがそのまま含まれることもありますし(LDPC)、計算によって元のデータから全く違うものになっていること(Turbo符号)もあります。いずれにせよ冗長性が付加されエラー訂正が可能になります。例えば、図のように元のデータの3倍の長さになった場合、R=1/3
といった書き方をします(RはRedundancyの頭文字)。3倍なんだから、R=3じゃないのか!という疑問はあると思いますが、まあそういうルールなんで・・・
それではこの長くなったコードをそのまま送るのか?というとそうではありません。例えば前述の様にR=1/3で3倍に長くなったコードがあったとして、それぞ全部おくるのでは無く半分だけ送るということも可能です。R=1/3で半分だけ送るとR=1/1.5すなわりR=2/3となります。ここのポイントは冗長化した全部のビットを送らなくてもエラー訂正が可能であるというところ。LDPC等の今時のエラー訂正符号は強力なので、全てを送らなくても多少のエラーなら訂正できてしまいます。すごい!もちろん全てを送ってもいいですし、全て送ればエラー訂正能力は上がります。ですから、どのような冗長性を持たせて送るかは、通信状況に合わせて判断すればいいわけです。
ちなみにFECはエラーが発生したら困るけど、データは一方通行でARQのような返信はできない、といった環境でも使われます。例えば、HDDやメモリの書き込みなんかでも使われたりします。(その場合LDPCほど重く強い符号では無く、もっと軽く弱い符号化ですが)
とまあ、長々とFECの説明をしましたがこれには理由があります。シャノン限界に近いLDPCやポーラ符号は、エラー訂正能力が極めて高く、条件によってはデータが半分欠損しても元のパケットが復元できるほどの能力を持ちます。つまり、エラー再送する(つまりは単に2回送る)よりも効率的にエラーへ対処することができます。そして、このあまりある性能をエラー訂正だけに使うのではなく、更なる通信効率化のために使う様にしたのがH-ARQなのです。
H-ARQの基本
H-ARQは、ARQつまりエラー再送の機能の一種なので、基本的な動作はTCPのARQと同じです。しかし、ある程度のエラーが出ることが想定される無線環境で威力を発揮するように設計されています。先ずは、基本的な構造から見ていきましょう。
H-ARQの基本構造
H-ARQはデータを送って受けた側はエラーかどうかを判断し、ACK/NACKを返すという構造になっています。この部分でのTCPのARQと違いは2つあります。
- TCPより低いレイヤー(Layer2)で動作する
- エラーだった場合にはNACKを返す
TCPはOSI参照モデルのうちのトランスポート層(Layer4)で動作します。一方でH-ARQはより物理層に近いデータリンク層(Layer2)^※2^で動作します。物理レイヤーに近い、つまり下位レイヤーの方がデータが通るレイヤーが少ないためエラーがあっても再送までの時間を短くできます。イメージしにくいかも知れませんので、普通のパソコンを例にとって説明します。TCPはトランスポート層で、OSのアプリケーションで制御しています。一方でH-ARQはデータリンク層なので、パソコンならイーサネットに当たります。つまり、LANケーブルのアダプタです。OSレベルで制御するか、LANケーブルの口で制御するか、結構違いがありますよね?
次に、H-ARQでは、TCPのARQと異なりエラーだった場合でもNACKを返します。つまり、パケットを受信するとACK/NACKどちらかを必ず返すのです。これによってエラーがあった場合でも「タイムアウト」を待つこと無く再送を判断できますので、これは遅延削減に大きく寄与します。エラーの分データの流れと逆側のトラフィックがちょっとだけ増えますが、デメリットはそれぐらいでメリットが大きい方法です。ただし、これはパケットを送ったか送っていないかを管理していないとできません。したがって、H-ARQを使いたいのであれば、そういった送受信の管理ができている必要があります。
さて、レイヤーを低くしてNACKを返すだけでは、まだただのARQです。H-ARQが「ハイブリッド」と呼ばれる所以は、ARQにFECが合わさっているという点にあります。H-ARQで送られるパケットははFECによって冗長性を持たせたビットです。受信側はまずFECのデコードをして元のデータに戻します。そして、デコードした結果のsパケットをエラーかどうかを判断して、ACK/NACKを返します。
これでFECとARQが合体しましたが・・・ これだけだとFECとARQを同時に使っているだけで、H-ARQと呼べません。H-ARQが効率の良いシステムだと言われるのはここからの部分にあります。
強力な符号化の活用
さて、先ほど、近年使われているFECの符号は理論上の限界(シャノン限界)をほぼ達成した符号が使われていて、とてもエラー訂正能力が高いと説明したかと思います。H-ARQでは、この高いエラー訂正能力をさらに活用する方法でもあります。
まず、もとのパケットはFECによって冗長性が与えられます。仮にR=1/3で元データの3倍の長さになったとします。H-ARQでは、この長くなったパケットを全て送るわけではありません。まず最初に先頭の一部を送ります。送信パケットの大きさは、元データより少し長い程度です。
さて、受信側はこの「元データより少し長い」程度のパケットをデコードします。LDPC等の最新の符号であれば、無線区間のエラーが少なければその程度の長さで十分デコードできます。つまり、FECによりR=1/3という3倍の長さのデータになったとしても、元データより少し長い、つまり少しの冗長だけでデコードが可能なのです。
しかし、無線区間の品質が悪ければエラーが発生することもあるでしょう。その場合ARQ機能により再送が必要になるわけですが、H-ARQではそのままエラーになったパケットを再送するわけではありません。図7の例を見てください。水色のTx1を送ってNACKが帰ってきた場合、同じTx1を送るのでは無く符号化された別の部分のデータ(Tx2)を送っています。そして、Tx1とTx2を合わせて復号します。それでもダメなら、更に別の部分(Tx3)を送り、また合わせて復号します。これは、エラー時に全く同じデータを送って復号を試みるよりも、別のデータを送ってエラーだったデータと合成してから復号する方が、符号化によるエラー訂正能力を上げられるという特性を利用しています。ただ再送するのでは無く、強力な符号の力を活かすこれこそがまさにH-ARQの本質です。
この方法はIncremental Redundancy(IR)方式と呼ばれています。H-ARQには他にもEarly TerminationやChase Combiningと言った方式があります。ただし、携帯電話のような移動無線通信においてはIR方式が適しているということで、LTEや5GNR、また弊社の光無線機器であるLED Backhaulなど今時のH-ARQではほとんどIR方式を採用しています。
4-Slots Interlacing
H-ARQはACK/NACKのやり取りが基本です。エラーの際は単純に再送するだけでは無く、次のパケットを送ることも必要で、結構「シーケンシャル」な処理が必要です。例えば、1回エラーして再送するときの時間の流れを見てみます。尚、以降「スロット」という単語が出てきますが、スロットというのは1パケット分の「時間的な区切り単位」だと思ってみてください。
送信データは少しの遅延を持って受信側に届きます。受信データを復号してエラーかどうか判断するのには、実データ時間+αぐらいの時間がかかります。そして受信側はその結果をNACKを返すとします。送信側からみると、送信してから2つ後のスロット(Slot 2)の最中でNACKを受け取ることになります。その結果をもって物理的には次のSlot 3でデータを再送データを送ることができますが、通常のシステムは多くのユーザーが同時に通信しているため、スロットを各ユーザーへ「割り当て」るのに一定の時間が必要で、その結果1スロット分はそのために使われてしまいます。したがって、H-ARQにおける再送データは通常、送信してから4スロット後に送ることができるようになります。逆に言えばH-ARQの処理上、データは4スロット毎にしか「物理的」に送れないとも言えます。4回に1回、こうなると1台あたりの通信速度は4分の1になってしまいます。それではどうするのか?答えは簡単。4ストリーム同時に通信させれば良いのです。
というわけで、H-ARQは4つ区切り、つまり4スロット毎に処理されるため、ユーザーのデータは最大4ストリームに分けられます。この仕組みを4-Slots Interlacingと呼んでいます。実際はこんな感じで動きます。
4ストリーム同時ということは1つ問題点があります。装置が高くなることです。さきほどのIR方式を思い出してください。通信が成功するまで、送信側は冗長化したデータ、受信側は受信したデータを全てキャッシュする必要があります。これは結構高価な装置です。さらに、LDPC等の高度な符号化、復号化機能も使います。H-ARQを実装するには、これらの機能を持つ回路を最低4回路持たなければなりません。したがって、H-ARQは結構コストインパクトのある機能です。しかし、H-ARQによって、無線通信の効率は大きく上がります。H-ARQは装置コストが上がりますが、それを補って余りあるメリット(利得)があるため、近年の高速無線通信装置はほぼこのH-ARQ機能を搭載しています。
まとめ
さて、いかがだったでしょうか?H-ARQの機能やメリットをまとめると以下の通りとなります。
- ARQ機能とFEC機能をあわせたものである
- ARQ機能は、低いレイヤーで動作するため遅延が小さい
- FEC機能は、近年の超高効率符号の利得を十分に活かすべく、パケットを合成してエラー訂正を試みる
- これら複合的な機能により、単純なARQやFECよりも大きな利得を稼ぐことができる
H-ARQは、上記の通り低いレイヤーで動作するため、なかなかユーザーにはその動作や効果が見えません。しかし、無線通信を裏で支える最も重要な機能の一つです。光無線通信、特にLED光無線通信における高速化においても、H-ARQはとても重要な働きをしています。もはや、H-ARQ無しでは無線通信は語れない、と言っても過言ではないかも知れません。
(2023年3月24日 一部誤字を修正しました)
※1; Windows初期設定の場合
※2; 携帯電話(3GPP)ではLayer2のMAC層で動作する。