■そういえば、ネットワークPCスイッチの話題がしばらくお休みになっていた。Interfaceのおまけと低電圧駆動のマイクロリレーでATXのスイッチを操作するという強引で単純なガジェットは、結果から言えばうまくいった。Wake On LANはPCが中途半端な状態になると起動できなくなるし、もちろんシャットダウンもできなくなって、リンボでさまようことになるけれど、電気スイッチ操作では強制停止も可能になるのでリセットもできる。もちろんInterfaceの付録基盤そのものの信頼性というのはあるけれど、今のところ問題ないし、Wake On LANと二重化されているのであまり心配していない。それはそれとして、アレはどうなった?
Interfaceの付録を使うのはそれはそれてとして、付録を使う前はENC28J60と自前のTCPIPスタックを使ったウェブサーバーライクなものを構築するつもりでいた。バラックは出来上がっていて、あとはソフトだけだった。付録を使う前段階ではTCPの3ウェイハンドシェイクまでは処理できるところまでいっていた。
そこで止まっていたのは、スタックライブラリとしての使い勝手をどう実装したものかあれこれ悩んでいたからだった。ボトムアップでろくに設計もせずにがりがりコーディングを進めていたら、スタックもへったくれもなさそうなHTTPサーバになるところだった。
「なるところだった」というのは、まあ、軽い思い上がりで、3ウェイハンドシェークをクリアしただけでHTTPサーバができあがるはずがない。HTTPはHTTPでプロトコルのレイヤを持っているのだから。
ものづくりのアプローチとしては、データが無い、つまりTCPペイロードサイズが0のデータパケットでHTTPのシーケンスを進められるようにしてから、TCPペイロードを載せるようにした。
クライアントツールとしてはwgetを使い、パケットキャプチャツールを使ってモニタリングした。パケットキャプチャツールは幾つか使ったのだけど、一番助かったのはWiresharkでした。このツールは受信パケットが壊れていると、壊れていると指摘してくれるのでありがたい。単なるtcpdumpだと、ダンプされたデータを改めて読まないとならないので大変です。
意外なところでつまずいたのがTCPの規約まわりで、例えばSYNの応答であるSYN+ACKはシーケンス番号を1つ進めることになっているのですが、単なる受信確認のTCPペイロードを持たないACK応答でシーケンス番号はどうなるのか、とか(答えは規約どおり、シーケンス番号は進まない)。
今のところTCPのパッシブオープンはなんとかサポートできていて、ポート80を叩かれると問答無用でコンテンツを送り返すところまで実装できている。クライアントからのリクエストをパーシングしているわけではないので、HTTPサーバではないわけですが、近いところまで来ている。
UDPは後回しにしているのでDHCPもDNSも使えない。受動動作だからゲートウェイも必要としないわけで、ほぼ必要最小限の実装しかしていない。
ただ、まあ、とりあえずひと段落ついた感じ。