要約

  • 1989年2月のRFC 1090は、SMTPの一回の会話ごとに双方向のX.25仮想回線を開き、その上でメールのやり取りをしてから解放する方式を提案した。
  • X.25の回線解放は、まだ移動中のパケットを捨て得る。発呼側は通常、QUITへのSMTPサービス終了応答を受けてから回線を切る。送信、受領応答、回線終了には別々の時刻がある。

最後の封筒は机と机の間にいた

1982年のRFC 821は、SMTPをX.25公衆データ網で運ぶ可能性に触れている。ただし付録Dは、X.25接続の上にTCPのような信頼できる端末間プロトコルを置くよう勧めた。七年後、R. UllmannはRFC 1090で仮想回線を直接使う手順を示した。文書によれば、当時22か国の24の公衆パケット網で実運用した経験があったという。短い仕様が細かな待ち時間にまで踏み込むのは、実際に回線の前で待った経験があったからだろう。

仕組みは簡潔だ。SMTPセッションのためにX.25仮想回線を一つ開く。双方向の通路でコマンド、応答、メッセージを交わす。会話が終われば、通常は発呼側が回線を解放する。SMTPの言葉遣いはそのままでも、下にある回線は別の終わり方をする。この差が最後の数秒を危うくした。

RFC 1090は、X.25では解放要求の最中に移動中のデータが同期的に届けられず、残ったパケットが捨てられると指摘する。発呼側が最後の文字を送った直後に回線を切れば、相手へ届く前に道が消える可能性がある。そこでQUITの後、遠端からSMTPの「Service Closing」応答を受け、その後で仮想回線を解放する。隣室へ書類を渡している最中に廊下の照明を落とす人はいない。相手の「受け取った、もう閉めていい」を聞いてからスイッチに触る。

メールの応答には役割の違うものがある。メッセージデータの後のSMTP応答は、その取引について受信側サービスが答えた記録だ。Service Closingは会話の終了を示す。X.25の解放は通路そのものを取り払う。その先で受信側がメールをどう扱うかは、さらに後の仕事になる。RFC 1090が整えたのは、会話を終える動作と回線を消す動作の間隔だった。

回線を開く時点にも合図が要った。Call User Dataの先頭四オクテットには、SMTP用のプロトコル識別子として16進数C0F70000を使うのがよいとされた。一方で、この識別子を含む呼出データは宛先アドレスごとに設定できるべきだと書かれている。共通の名札を持ちながら、呼び出す先の網に合わせて入口を調整する設計だ。

仮想回線の中では、SMTPのバイト列をどう分割してパケットへ載せるかは送信側が決める。Mビットで「続きあり」を示す、合計最大2,048バイトの連続列が勧められた。ひとつのSMTPコマンドや応答をひとつのパケット、または一連の続きパケットに収める推奨もある。故障時の記録を読みやすくするためで、回線上の言葉を別の言葉に変える規則ではない。Qビットを立てた限定データや割込みパケットは使わず、届いたら無視する。文字は八ビットのASCIIで、行末はCRLF。可能ならLFだけの行も認識する。

回線がリセットされたら、第三層のリセットを受けて仮想回線を解放し、SMTP接続を改めて試みる。少し待つことも、別の呼出条件を使うこともできる。呼出条件を宛先別に設定できるよう求めたのも、そのためだ。古い通話が中断したなら、新しい通話には新しい接続と挨拶が必要になる。

待ち続けるわけにもいかない。RFCは呼出受諾に100秒、続くサービス準備の挨拶にさらに120秒、会話中の無応答に10分という目安を置いた。QUITの後は20秒に縮める。最後は少し不格好な終了になっても、文書は完了済みのSMTP取引への影響はないと述べる。数字は当時の運用経験として提示された。相手に返事の時間を渡しながら、回線をいつまでも占有しないための時計だった。

RFC 1090の主役は、回線解放スイッチの上で止まる指だ。発呼側には線を切る権限がある。その指が動く時刻を決めるのは、遠端から返る最後の一言だった。