はじめに
こんにちは、じゅぴです
現在ゲーム大会配信用の低遅延画面共有ソフトウェアを開発しております。
その過程でクソ(ありがたい)システムがあって意味わからんかったのでその備忘録です。
FEC(前方誤り訂正)
前方後円墳みたいな名前してますね(笑)
ようは間違いに気づくためのシステムですね。
簡単な例として通信で文字列HELLOを送るとします
そうすると送信データは
FECなし
48 45 4C 4C 4F
FECあり
48 45 4C 4C 4F A7
通信バグのケース
仮に通信中にノイズが入り0x45から0x47に1ビット変わってしまうと
FECなしでは
48 47 4C 4C 4F
となり、「HGLLO」となりますが、
FECありでは
48 47 4C 4C 4F A7
FEC「あれ、A7と前のデータが一致しない、A7に基づいてデータを戻さなきゃ」
となり
48 45 4C 4C 4F
と、もどされます
原理
原理としては生徒が渡したHELLOという文字列に対して、先生が点数をつけ仮に100点(A7)だよ~といいます。
ノイズが入っていた際の処理
その先生Aが違う先生Bにデータを渡し、違う先生が点数から逆算し合ってるかをチェックします。
そこで、データを渡した際に何らかの理由でデータが変わったとすると先生Aがつけた点数とデータが合わなくなります。なので、受け取った先生Bが点数から逆算し正しい答えを割り出すという処理だそうです。
気持ち悪いです
NACK
はい、埼玉に住んでる方は79.5といえばわかるかもしれませんが、そのNACKではないと思います。
NACKに関しては割とすんなり理解できました
NACKにはもう一つACKというものがあります。
| 名前 | 説明 |
|---|---|
| ACK | 「受け取ったよ~」という合図 |
| NACK | 「壊れてんで~もう一回送ってや」という合図 |
通信例
AさんがBさんにHELLOという文字列を送るとします
Aさん:
48 45 4C 4C 4F
↓↓↓↓↓↓
Bさん:
48 45 4C 4C 4F
そうすると、サムチェックや、先ほどのFECで正しいかをチェックし、あっていれば
ACK
と返します
仮にまたノイズが入り
Aさん:
48 45 4C 4C 4A
となり、Bさんに送ると先ほどのようにチェックサムorFECでチェックをし間違っていることがわかると
NACK
と送ります。
NACKの中身
NACKの中身は結構シンプルです。
| フィールド | バイト | 値 | 意味 |
|---|---|---|---|
| Header | 1 | 0x15 | NACKですよ~というコード |
| Sequence No | 1 | 0x07 | 7番目のパケット壊れてんで~ |
| Error code | 1 | 0x02 | CRCエラー(通信破損) |
| Checksum | 1 | 0x94 | NACKメッセージの整合性確認 |
15 07 02 94
となります
最後に
二度と出きれば触れたくない特にFEC