6/6はv6デー

何年か前にパケットを調べて悪いところがないか探す仕事をしたことがある。パケットの悪いところ、つまりプロトコル違反している箇所がないか探す。そういう機械的なことは機械にやらせばいいと思ったけど、機械は精度が低く新しい機械を作るお金や発想もなかったので機械にやらせつつ人間がメインで見ていくことになっていた。1日中、もう延々と。ローカルネットワーク内の最大13台のクライアントと3台のサーバから入出力それぞれ吸い上げる、なんてところまで手動だった。眼精疲労との戦いは熾烈を極めた。

まあプロトコルといっても仕様はRFC、Request for Commentsであって、悪いところがあってもパケットが止まったり破壊されたりすることはまずない。中継機器がおおむねそう設計されているから。標準や勧告は守ったほうが捗るが、守られていないからといって拒否する類のものでもない。たとえばHTTPのレスポンスヘッダがなんかおかしくてもよっぽどでない限りブラウザで受信できないなんてことはないだろう、そういうもの。とくにインターネットあたりは、技術的な寛容と人間への期待によって成立していると思う。

それでパケットは止まりはしないが悪いところがあったら直さなければならない、という主義思想のもとに作業していたので、一見正常に流通しているかに見えるパケットが規約的に正しいかを調べまくった。正直奇声とか普通に上げるけど、それが仕事ならプライドを持ってやるのが自分のやり方なので、パケットと敵対したくはなかった。どんなものにも面白いところは必ずある。TCPなんかはわりと見やすい。3ウェイハンドシェイクはクライアント側が一回多くパケットを出すので等価交換とかエネルギー保存の法則とかまったく信用することができないな、とか適当なことを考えたりする。

余談だけど「面白くないなら面白いところを探せ」というアドバイスを受けたとき、対象だけを必死で眺めてもまずそんなものは出てこない。対象が面白くないから探さなければならないのであって、二度見しても現実は大抵変わらない。そういうときは、自分の経験や自分の興味と無理にでも関連付けるようにするのがいいと思う。論理飛躍はときに身を助ける。(※でも助けないことのほうが多いので過信は禁物である)

こういう経験により、Webアプリケーションを含め通信がらみのアプリケーションを作っている限りは、各サーバのログを見るよりパケットを見たほうが多くのことが分かるんじゃないかと思うようになった。人間が書いたアプリケーションはログですらたまにバグる、というかたまにじゃねぇ常にバグってる、ぐらいの意気込みでいたほうが解析が楽。それを言い出すとOSやミドルウェアも同じだけど一定以上古びたOSやミドルウェアは、1週間前に出来立てほやほやのアプリケーションよりおおむね信頼性が高い。ちなみにオブジェクト指向関連のフレームワークではその中間くらいというふわっとした印象を経験から持っている。

それにしても、パケットだのプロトコルだのについて突き詰めて考えようとしたことのある人はどれくらいいるだろうか。

いや、自分がそれを考えようとしたことを特別視したいわけではなく、果たして通信に興味を持ってくれる人というのが世の中に少なからず存在するのだろうか、という素朴な疑問です。というより、「お勉強」という目的を除けばインフラとしてもう出来上がったものに対してわざわざ興味を抱く必要があるのか。そういうのは無駄だと思われるんじゃないだろうか。

結論から言うと無駄だと思う。自分が無駄に無駄を嫌いじゃないだけだと思う。こういうことは心理学を勉強しているときにも思った。もう既に生まれて出来上がって消費や生産活動している人間の、しかも脳のような複雑な器官において行われる処理を一般化するような学問には娯楽的な側面が少なからずあるのではないか。

しかしながら一周して無駄なものは余裕がないと楽しめないし、余裕があるなら無駄なものほど楽しい。なのでパケットを眺めているとまるで通信の歴史のようだと思って楽しい。強制も推奨もするつもりはまったくないが、いつも自分が楽しいと思うことを表現したいという基礎的な欲求だけは枯れないので困る。

パケットは伝送用に細かく分割されたデータであるとよく解説される。そしてパケットの中には、意味のあるデータそのものと、通信するために必要なメタ情報とが規則正しく混在している。メタ情報だけのパケットもある。パケットの顔つきに関する取り決めがプロトコル。こういうのは手紙とかポストとかたとえ話にするより少々複雑でもそのものを見たほうが分かりやすいんじゃないかと思っている。あと通信とひとくちに言っても、ネットワークインタフェースと各種デバイスや、あるいはプロセス間の通信(ソケット)など、必ずしも外部通信だけを通信と呼ぶわけでもない。パケットには電子情報を扱ううえでの基礎がわりと詰まっているような気がする。

ついでに、人間が目で見ただけでは意味を解釈できない何らかの情報のカタマリというのは、ほぼアートだと思う。機械が意味を認識して動くのだから整然と根拠や論理があるだけのことだけど、規約つまりプロトコルを理解または認識するための手段を持たない限り、そこにあるのはただの電気信号であって、素手で触ると多分ピリっとする。電圧によっては死ぬ。アートですね。

以前TCPのSYNパケットを探してと誰かに指示したとき「SYNという文字列が見つかりません」と言われて、フラグフィールドの特定のビットが立ってたらSYN、みたいなことは案外理解しづらいというか知られていないのかもしれないと思った。当たり前といえば当たり前で、たとえJavaがめちゃくちゃ書けても実際にSYNフラグを立てるのはJVMより先の処理だろう、知らなくても無理はないし、知らなくてもまったく困らない。ネットワーク系のエンジニアですら分野によっては意識しないことかもしれない。知らなくていいことを知っていてもあまり得はしない。

なんだかんだで、セキュリティ事故などは深刻にというか重大な問題として捉えているつもりだけど、ひとつ下のレイヤーへ移動すると「あーHTTP界隈騒がしいわー」ぐらいの感じかもしれないし、HTTPから見たらIPv4でもIPv6でもとりあえずインターネットができたら問題ないのかもしれない。ネットワークのレイヤー(OSI参照モデル)はレイヤーごとに疎結合になっている点が美しく、そういう英知を再利用できないものかとつい考える。プログラミングが下手くそでも基礎が分かっていれば仕組みは作れるんじゃないか、とか。負け犬の遠吠えですね。

本日2012年6月6日はIPv6が世界的にオープンになって日本が一部取り残された記念すべき日なので他愛もないことを書きました。インターネットも私も明日死なないとは断言できないまま今日も死なない。