手旗信号システムによるIP伝送

ACKを返すインタフェース
手旗信号システムによるIP伝送（てばたしんごうしすてむによるアイピーでんそう）は、手旗信号によってIP伝送を行う通信プロトコルである。
これは2007年のエイプリルフールに4824として発行されたジョークRFCである。

**概要**
この手旗信号システム（Semaphore Flag Signaling System、略称 SFSS）を用いた伝送は、国際的な手旗通信の一つであるセマフォア信号を用いて、IPv4およびIPv6のパケットを送受信するリンク層のプロトコルである。
一般的に、物理層は太陽光と見通し距離における光学的な無線通信を用いる。
インタフェース（信号手）が2本1組の手旗を振ることによって、データ信号や制御信号を送信する。2つのインタフェースが向かい合い、共通のチャネル上で半二重の通信を行うことになる。
ビット誤り率の範囲はインタフェースの経験によって （ボーイスカウトレベル）から（プロの水夫）程度が予想される。また、気象状況や日照状況（例えば夜間など）によって誤り率が大幅に増える可能性もある。
同様に伝送速度もインタフェースの経験に大きく依存して変化する。

**プロトコル詳細**

**用語の定義**
 リンク : 1つのリンクは共通のサブネットを共有する2つのインタフェースからなる。
 リンクパートナー : インタフェースの相手側。
 セッション : 1つのIPデータグラムの伝送が終わるまでを1セッションという。
 SFS : 1つの手旗信号。4ビットのデータ信号、あるいは制御信号を意味する。
 IP-SFS : 手旗信号システムでIPデータグラムを伝送すること。

**IP-SFSのフレーム**
IPデータグラムは、IP-SFSフレームにカプセル化され、前後にIP-SFSのヘッダとトレーラが付加される。以下にIP-SFSのフレームのイメージを示す。各フィールドは、1つのSFSを表す（DATAのみ 0 - 510 個の可変長である）。
 FST : フレームの開始。
 Protocol : インターネットレイヤーのプロトコルコード
 CksumTyp : チェックサムのタイプ
 Frame No : 8ビットのフレーム番号（2つのSFSに分割）。IPデータグラムを例えば N 個のフレームに分割する場合、先頭のフレーム番号は N-1、2番目のフレーム番号は N-2、最後のフレーム番号は 0 になる。
 DATA : IPデータグラム本体。0 - 510個のSFS信号であり、0 - 255オクテットを意味する。
 CRC : 16ビットのCRC（4つのSFSに分割）。プリセットは 0xFFFF。
 FEN : フレームの終了。

**SFSのデータ信号**
データ信号は、以下を使用する（アルファベットは、本来のセマフォア信号）。
また、制御信号は以下を使用する。
 FST(Frame STart) : 新しいフレームの開始。
 FEN(Frame ENd) : 1つのフレームの終了。
 SUN(Signal Undo) : 現在のフレームで伝送済のSFSを1つキャンセルする。
 FUN(Frame UNdo) : 現在のフレームの伝送済SFSをすべてキャンセルする。
 ACK(Frame ACK) : 受信したフレームの伝送を認める。
 KAL(KeepALive) : キープアライブ用の制御信号。
 NAK(Frame No Ack) : 受信したフレームは間違っている。
 RTR(Ready To Receive) : 受信者は受信準備ができている。
 RTT(Ready To Transmit) : 送信者は伝送開始の許可を求める。

**待機状態**
待機状態にあるインタフェースは（ネゴシエーションした、あるいは事前に決められた）キープアライブ間隔以内で、KAL 信号を送る。

**セッションの開始**
セッションの開始は以下のようになる。
# 送信すべきIPデータグラムが送信キューにある場合には、リンクパートナーに RTT 信号を送る。
# リンクパートナーの受信準備ができている場合には、RTR 信号を返す。
# インタフェースは、さらに RTT 信号と、フレーム数を2つの SFS （データ信号）で送る。
# リンクパートナーは、RTR 信号と、フレーム数を2つの SFS で送り返す。
次の SFS 信号がタイムアウト間隔まで来ない場合には、待機状態に移行する。

**送信状態**
送信状態の場合、インタフェースは FST 信号から IP-SFS フレームの伝送を送り続ける。
もし、間違ったデータを伝送してしまった場合には、SUN 信号（1つのデータ信号をキャンセル）、あるいは FUN 信号（該当セッションの全データをキャンセル）を送って、正しいデータ信号を送りなおす。
FEN 信号を送った後は、リンクパートナーが ACK 信号、あるいは NAK 信号を送り返すのを待つ。
ACK 信号が返ってきた場合には、次のフレームの伝送を始める。伝送すべきフレームがない場合には待機状態に移行する。
もし、NAK 信号が返ってきた場合には伝送は失敗したと判断し、インタフェースは再度同じフレームを送信する。
ACK も NAK も返ってこないでタイムアウトした場合も、伝送は失敗したと判断し、再度同じフレームを送信する。
同じフレームを5回失敗した場合には、対象のデータグラムをキューに残したまま待機状態に移行する。

**受信状態**
受信状態の場合、インタフェースはリンクパートナーから受け取った SFS 信号を順に受信キューに格納する。
FST 信号を受信し、FEN 信号を受信するまでの間であれば、受信側インタフェースはいつでも FUN 信号を送ることにより、IP-SFS フレームを最初から送りなおすことを要求することができる。
2つの SFS 信号を受信する間にタイムアウトした場合には、実行中の IP-SFS フレームをすべて削除しなければならず、FUN 信号を送ることができる。
リンクパートナーから次のタイムアウト期間までに次の SFS 信号が続かない場合には、インタフェースは受信キューを削除して、待機状態に移行する。
インタフェースがリンクパートナーから SUN 信号を受信した場合には、最後に受信したデータ信号を削除しなければならない。N 個の SUN 信号を続けて受信した場合には、フレームにある最後の N 個のデータ信号を削除しなけれならない。フレームにデータ信号がない場合には、SUN 信号は無視する。
インタフェースがリンクパートナーから FUN 信号を受信した場合には、それまでに受信していたフレームを削除する。
FEN 信号を受信した場合には、受信インタフェースはチェックサムを検証する。
チェックサムが正しい場合には、インタフェースは ACK 信号を送る。実行中のフレームのフレーム番号が 0 の場合には、受信キューから取り出した全データを、より上位のプロトコルに渡し、受信キューをクリアして待機状態に移行する。
もし、チェックサムが無効な場合には、インタフェースは NAK 信号を送る。

**コネクション切断**
インタフェースが待機状態にあり、リンクパートナーからキープアライブ間隔以内にいかなる SFS 信号を送らないことが5回あった場合、コネクションは切断され、インタフェースは解散する。

**リファレンス実装**
本システムのリファレンス実装は、RFC発行前の2006年に著者らによって「Talking the Fish」プロジェクトの中で実施された。
本システム上でSMTPを使用して電子メールの送信が行われ、オーストリアとスロベニアの国境を流れるムール川を渡った対岸で受信に成功した。その電子メールには "I am the text, wandering across the river" と書かれていた。

**脚注**

**出典**

**関連項目**
 鳥類キャリアによるIP- 音響伝送メディアによるIP伝送- 腕木通信- 光による通信- スニーカーネット