MiniSock: スコープの設定
MiniSockは名前の割に大量(数千行)のコードを書く必要がありそうなので事前にねっとりとスコープ策定をすることにした。
MiniSockとは何か?
- TCP/IP、UDP/IP スタックをシリアルポート1つに載せるプロトコル
- Socks5と同程度の表現力を持つ
- 同じアプリケーションAPIをPOSIX socketsやlwIPのような既存のTCPスタックのwrapperとしても使えるようにする
マイコンのUART上でTCP/IPするにはSLIPのようなプロトコルが一般に使用される。しかし、SLIPはIPv4しか提供しないため、マイコン側でTCPを実装する必要がある。MiniSockのシリアルプロトコルはTCPやUDPを直接話すことを想定しているため、マイコン側でIPv4やIPv6やトランスポート層のプロトコルを意識する必要がない。
Caveats
パフォーマンスは大きく犠牲になる。特定のTCPストリームに線路が占有されるのを防ぐために、1KiBとか64KiBのような単位でラウンドロビン転送しなければならない。基本的に1Mbps以下の線路での利用が前提で、1Gbps以下の線路でないと実用的なパフォーマンスを発揮できないだろう。
マルチキャストやブロードキャストをよく扱うことができない。DHCPのようなプロトコルはワーカー(後述)側で実装されるのを想定している。
REUSEADDRとかタイムアウト調整、keep aliveのような細かい制御を行うことができない。
コントローラー、ワーカー
(ネットワーク的な意味の クライアント 、 サーバー は紛らわしいので避ける)
コントローラー は、TCP/IPアプリケーションを実行する側となる。コントローラー上で動作するアプリケーションはMiniSockのAPIを使用してネットワーク処理を記述することになる。
ワーカー は、TCP/IPプロトコルスタックを実装する側となる。また、ワーカーはDHCPやIPsecのようなネットワーク接続に必要なプロトコルを一通り終端する必要がある。
コントローラとワーカーは信頼性のある、バイト指向の、双方向ストリームで接続される。
MiniSockのアーキテクチャを既存のプロトコルや実装にあてはめると以下のようになる。
実装 | コントローラー | ワーカー |
---|---|---|
Socks5 | Socks5クライアント | Socks5サーバー |
WioTerminal | SAMD51 | RTL872X |
MiniSockの仕様はSocks5プロトコルを基準に作成するので、最初のMiniSock実装は Socks5サーバーとなるMiniSockコントローラとPOSIX Socketによって実際のTCP/IP通信を行うMiniSockワーカーを用意する。これによりWebブラウザのような実アプリケーションで機能的な検証を行うことができると期待される。
Socks5プロトコル
Socks5のプロトコルはシンプルで、英語版Wikipediaのページで大部分が解説できている。
エラーコードの意味はあいまいで、RFC https://datatracker.ietf.org/doc/html/rfc1928 も具体的なエラーコンディションを説明していない。
o REP Reply field:
o X'00' succeeded
o X'01' general SOCKS server failure
o X'02' connection not allowed by ruleset
o X'03' Network unreachable
o X'04' Host unreachable
o X'05' Connection refused
o X'06' TTL expired
o X'07' Command not supported
o X'08' Address type not supported
o X'09' to X'FF' unassigned
例えば TTL expired のエラーを返却するにはICMPを受信する必要がある。