Open2

MiniSock: スコープの設定

okuokuokuoku

MiniSockは名前の割に大量(数千行)のコードを書く必要がありそうなので事前にねっとりとスコープ策定をすることにした。

MiniSockとは何か?

  1. TCP/IP、UDP/IP スタックをシリアルポート1つに載せるプロトコル
  2. Socks5と同程度の表現力を持つ
  3. 同じアプリケーション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ブラウザのような実アプリケーションで機能的な検証を行うことができると期待される。

okuokuokuoku

Socks5プロトコル

Socks5のプロトコルはシンプルで、英語版Wikipediaのページで大部分が解説できている。

https://en.wikipedia.org/wiki/SOCKS

エラーコードの意味はあいまいで、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を受信する必要がある。