概要
- AVR64DD32 マイコンを使い、 シリアル通信のみ でWebサーバを構築した実験記録
- Ethernet ではなく、SLIPプロトコルを利用してインターネット接続を実現
- TCP/IPスタック やHTTPレスポンスも自作で実装
- 公開アクセス にはプロキシやWireGuardなどの工夫を活用
- IPv6普及の遅れ や、現代Linuxの柔軟性にも言及
AVRマイコンでWebサーバを作る愚行
- AVR64DD32 をターゲットに選定、Arduinoで有名な Atmega328 と似た構成
- CPU: 8ビット/24MHz、RAM: 8kB、Flash: 64kB、EEPROM: 256バイト、電圧: 1.8-5.5V、価格: $1
- Ethernet は10BASE-Tでも10Mbps必要、AVRのI/Oでは対応困難
- Manchester符号化 で実質20Mbps、I/Oピンは12MHzまで
- 専用Ethernetチップ 導入は納期が長く断念
SLIP(Serial Line Internet Protocol)の活用
- SLIP(RFC 1055) はシリアル通信でネットワークを実現する古い規格
- パケットの前後に 0xC0 を挿入、特殊バイトはエスケープ処理
- Linux では標準でサポート
- USBシリアルアダプタで stty や slattach コマンドを使用
- AVR側のハードウェア はシンプル、外部部品不要
- ブリンケンライト や逆接防止ダイオードを追加
- シリアルアダプタの 5V電源 で駆動可能、ケーブル一本で完結
TCP/IPスタックとHTTPレスポンスの自作
- IPヘッダ :40バイト、送信時は送受信アドレスの入れ替えとTTLリセットのみ
- パケット分割 等の複雑な機能は現代OSが無効化済み
- TCP実装 は難易度が高い
- コネクション管理、再送制御、各種例外処理に数日を要した
- バグ も残存
- HTTPは未実装、常に固定レスポンスのみ返却
- 単一URL のみ対応
公開アクセスとネットワーク経路の工夫
- グローバルIPv4アドレス が高価・入手困難、自宅回線も非対応
- HelsinkiのVPS にグローバルIPがあるが、物理的に距離が遠い
- WireGuard で仮想ネットワークを構築
- NAT越えや複雑なネットワーク構成にも対応
- プロキシ設定 でVPSの/mcu配下リクエストをMCUへ転送
- MCUのTCP/IPスタックを直接晒さず、安定運用
- DDoS耐性は低いが、Vape Serverと同様の構成
IPv6の普及と現代Linuxの柔軟性
- IPv6 が30年経っても普及していない現状への嘆き
- Linux のSLIPやWireGuardサポートによる自由度の高さを評価
関連リンク
- /mcu: マイコンがホストするページ
- http://ewaste.fka.wtf/: 32ビットMCU製Vape Server
- https://lcamtuf.substack.com/p/psa-if-youre-a-fan-of-atmega-try: lcamtufによるAVR Dx解説
昔のダイヤルアップの頃みたいに、HTMLがリアルタイムでページにストリーミングされるのが好き。画像が上から下に徐々に表示されていく感じ、懐かしいなぁ。