8ビットマイクロコントローラでのウェブサイトのホスティング
現代のウェブ開発の世界では、私たちは利用可能な膨大な計算能力と帯域幅を当然のことと考えてしまいがちです。しかし、Maurycyによる最近のプロジェクトは、AVR64DD32マイクロコントローラ上で完全に機能する(といっても低速ですが)ウェブサイトをホスティングすることで、8ビットアーキテクチャの凄まじい粘り強さを証明しています。このプロジェクトは、極端な制約の中で作業するためのマスタークラスであり、ネットワーキングとプロトコルの実装に対する創造的なアプローチを強いています。
ハードウェア: AVR64DD32
これを実現するために、MaurycyはArduinoボードで使用されている有名なAtmega328の現代的な親戚であるAVR64DD32を使用しました。8ビットコアであることに変わりはありませんが、以前のモデルと比較して、より優れた周辺機器と約1ドルの低コストといういくつかの利点があります。
主な仕様:
- CPU: Single 8-bit AVR core @ 24 MHz
- RAM: 8 kB
- Flash: 64 kB
- EEPROM: 256 bytes
- Voltage: 1.8 - 5.5 Volts
ネットワーキングのボトルネックを克服する
主な障害の一つは、インターネット接続の物理層でした。Ethernet (10BASE-T) は標準的な選択肢ですが、AVRにとって速すぎることが判明しました。10BASE-Tはマンチェスター符号化(0を「10」として、1を「01」として表す)を使用するため、10 Mbpsのデータレートに対して実際のワイヤ速度は20 Mbpsになります。AVRの周辺機器とIOピンが最大12 MHzで動作するため、チップは必要な信号を生成することができません。
これを回避するために、このプロジェクトでは Serial Line Internet Protocol (SLIP) (RFC 1055) を利用しています。SLIPは、シリアル接続を介してネットワークを運用するための、古くて軽量な標準規格です。パケットを特定のバイト (0xC0) で包み、ラップバイトと競合するデータを扱うために単純なエスケープシーケンス (0xDB) を使用することで機能します。
Linuxホスト側では、slattach を使用して接続を確立し、USB-to-serialアダプタをネットワークインターフェースに変換します。これにより、MCUは基本的なシリアルリンクを使用してネットワークの他の部分と通信できるようになります。
TCP/IPスタックの実装
物理的な接続が確立されると、ソフトウェアの課題はTCP/IPスタックに移りました。8 kBのRAMでフルスタックを実装することは非常に困難な作業ですが、このプロジェクトではいくつかの戦略的な省略によってプロセスを簡略化しています。
IPレイヤー
IPヘッダー (40バイト) の実装は比較的簡単です。パケットの断片化(現代のOSでは大部分が、IPv6では完全に無効化されています)を無視することで、著者は受信パケットの送信元と送信先アドレスを単純に入れ替えて、レスポンスヘッダーを生成することができました。
TCPレイヤー
TCPはIPよりも大幅に複雑です。マイクロコントローラは、接続状態の追跡、失われたパケットの再送管理、および多数のエッジケースの処理を必要とします。著者は、サーバーを機能させるために、カスタムの軽量なTCP実装を数日間かけて実装しました。
HTTPレイヤー
実装を最小限に抑えるため、著者は完全なHTTPパーサーをバイパスしました。その代わりに、サーバーはリクエストされたURLに関わらず、単一のレスポンスを送信するようにハードコードされています。これにより、サイトはページが1つだけである限り、機能します。
ルーティングとパブリックアクセス
MCUはパブリックIPv4アドレスを持たず、CGNATの背後に位置しているため、著者は WireGuard とリバースプロキシを組み合わせて使用しました。
- The VPS: パブリックIPアドレスを持つ仮想プライベートサーバーが入り口として機能します。
- The Tunnel: WireGuardは、VPSとローカルのLinuxルーターボックスの間で仮想ネットワークリンクを作成します。
- The Proxy: Linuxルーターは、
/mcuパス配下のリクエストをMCUのローカルアドレスへプロキシします。
このアーキテクチャにより、訪問者がMCUの脆弱なTCP/IPスタックに直接アクセスすることを防ぎ、SYN flood攻撃や基本的なDDoS攻撃に対する保護レイヤーを提供します。
コミュニティの洞察とハードウェアの進化
このプロジェクトは、8ビットマイクロコントローラの進化に関する議論を巻き起こしました。AVR DDシリーズは非常に有能ですが、コミュニティのメンバーは、AVR DDの多くの周辺機器機能を維持しつつ、ARM Cortex-M0+コアを提供する PIC32 CM の登場を指摘しました。これは、より多くのパワーを提供しつつ、ピン互換性や電力効率を維持する32ビットアーキテクチャへの移行を示唆しています。
進歩はありますが、このプロジェクトは「AVRマイクロコントローラでやるべき、くだらないこと」の時代を超えた魅力について強調しています。あるユーザーが指摘したように、HTMLがリアルタイムでページ上にストリーミングされる様子を見る体験は、ダイヤルアップ時代のノグラジーをノグラジーを呼び起こし、ウェブが最も基本的なコンポーネントからでも構築できることを思い出させてくれます。