IMP: インターネットルータの祖先
先日の2.11BSDのエントリでも触れたが、IMP(Interface Message Processor)に対応するコード(/sys/netimp/)があって驚いた。ということでそこからIMPとは何者かを探っていきたい。特に今回調べたのは、IMPとホスト間のプロトコルである、1822ホストアクセスプロトコルについてである。
この図は1969年のARPANETのネットワークトポロジを示している*1。現在地球上を網の目のように覆っているインターネットも、当時はたった四つのサイトの計算機をつないだものでしかなかった。さて、各サイトにあるIMPとは何だろうか。IMPはインターネットルータの祖先であり、後にPSN(Packet Switch Node)と呼ばれるようになった*2。
ARPANETは全米各地に存在するさまざまに異なるアーキテクチャの大型計算機を相互接続し、科学者間で資源を共有しようというモチベーションで始まった。そして、まだまだ非力だったホストの計算機資源をプロトコル処理に奪われるのを嫌って、外付けの安い機械にやらせましょうという背景で登場したのがIMPだった。ルーティングやフロー制御など通信の面倒な処理はIMPに押しつけ、ホストは単純なネットワーキング処理だけを担ったのである。ブツとしてはHoneywell 516というミニコンがベースになっており、外観は「Interface Message Processor (IMP) Honeywell 516」などから拝むことができる(その後いくつかのバリエーションが登場している)。
IMPの仕様はBBN Report 1822で定められており、その由来からIMPのプロトコルは1822プロトコルと呼ばれる。IMPはストアアンドフォワード型のパケットスイッチ機能を提供している。ホストが送信したメッセージは、IMPにてパケットに分割されて宛先に送られる。受信側のIMPはパケットからメッセージを再構築すると、RFNM (Request For Next Message)を返信する。送信ホストがRFNMを受信すると次のメッセージが送信可能になる。経路中でパケットが損失した場合、IMPが再送処理を行うが、何らかの理由で再送できない場合は送信側のIMPからRFNMの代わりにIncomplete Transmissionメッセージが返る。
メッセージは96bitから8159bitの可変長であり、その先頭の96bitはリーダ(leader)と呼ばれていた。もちろんヘッダのことであるが、当時はこちらの方が通りがよかったのだろうか。8159bitとは切りが悪いが実際はpaddingされて8160bitになる。パケットの最大サイズは1008bitだったので、((8160 - 96) / 1008)で最大8パケットに分割された。
リーダの定義はif_imp.hにある。
/*
* Structure of IMP 1822 long leader.
*/
struct control_leader {
u_char dl_format; /* leader format */
u_char dl_network; /* src/dest network (未使用)*/
u_char dl_flags; /* leader flags */
u_char dl_mtype; /* message type */
u_char dl_htype; /* handling type */
u_char dl_host; /* host number */
u_short dl_imp; /* imp field */
u_char dl_link; /* link number (BBN report 1822ではmessage idの前半8bitということに)*/
u_char dl_subtype; /* message subtype */
};
struct imp_leader {
struct control_leader il_dl;
#define il_format il_dl.dl_format
#define il_network il_dl.dl_network
#define il_flags il_dl.dl_flags
#define il_mtype il_dl.dl_mtype
#define il_htype il_dl.dl_htype
#define il_host il_dl.dl_host
#define il_imp il_dl.dl_imp
#define il_link il_dl.dl_link
#define il_subtype il_dl.dl_subtype
u_short il_length; /* message length */
};ホストのアドレスであるが、8bitのホスト番号dl_hostと16bitのIMP番号dl_impの合計24bitで構成されていた。BBN report 1822ではメッセージの識別に12bitのメッセージIDを使うとある。TCP/IPのポート番号に近い考えだろうか。dl_linkがそれに相当するが、ちょっと使われ方が違うような。
余談になるが、その後、1822ホストアクセスプロトコルを拡張した1822LがRFC 851で提案されている(The ARPANET 1822L Host Access Protocol)。Lはlogicalの意味。1822ではARPANET上の物理ポート位置でアドレッシングされていたけど、論理的なホスト名(16bit整数)が使えるように拡張された。アドレスはIMP番号8bit、ホスト番号6bitに縮小され、実質的なホスト数は15000弱になってしまった。RFC 851には1822の24bitアドレスについて「These fields are quite large, and the ARPANET will never use more than a fraction of the available address space.」と書かれている。IPv4アドレス枯渇とか騒がれている昨今からすると、非常に牧歌的である。また、1822LはC/30 IMPのみでサポートされた。他のIMPは搭載メモリが足りなくて実装できなかったようだ。2.11BSDが対応しているのはオリジナルの1822だけのようだ。さらにRFC 1005(The ARPANET AHIP-E Host Access Protocol (Enhanced AHIP))ではIPデータグラムをARPANETで使うための拡張について提案されている。余談ついでに記念すべきRFC 1はIMPに関するメモだったりする。
2.11BSDの場合、ユーザレベルのプログラミングは当然BSDソケットを使う訳だが、アドレスファミリはAF_IMPLINKになる。Mac OS Xのヘッダファイルを見てびっくり。まだAF_IMPLINKが残っているのね。glibcにはない。
今日はここまで。具体的にソースコードを追うのは次回で。
最後になるが、当時の資料を探していて、U.TexasのChris Edmondson-Yurkanan教授のTHINK Protocolsというページを見つけた。BBN report 1822を含めていろいろ貴重な資料がありそうなので、後でじっくり読みたい。

- 作者: ケイティハフナー,マシューライアン,Katie Hafner,Matthew Lyon,加地永都子,道田豪
- 出版社/メーカー: アスキー
- 発売日: 2000/07
- メディア: 単行本
- 購入: 1人 クリック: 16回
- この商品を含むブログ (7件) を見る
