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

**手旗信号システムによるIP伝送**（てばたしんごうしすてむによるアイピーでんそう）は、手旗信号によってIP伝送を行う通信プロトコルである。

これは2007年のエイプリルフールにとして発行されたジョークRFCである。

## 概要
この手旗信号システム（、略称 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伝送
* 腕木通信
* 光による通信
* スニーカーネット