達人が語る,インフラエンジニアの心得

第17回 プロトコルを覚えよう[その1]

この記事を読むのに必要な時間:およそ 2.5 分

平文プロトコルを「手でしゃべる」

筆者はプロトコルを暗記しているのはSMTP,HTTP,POP3くらいです。平文でまず暗記すべきなのはこのあたりではないでしょうか(最近ならPOP3はいらないかもしれません⁠⁠。

たとえばSMTPを「手でしゃべる」のは下記のようになります(qmail-smtpdに接続した例です⁠⁠。

$ telnet 0 25
Trying 0.0.0.0...
Connected to 0 (0.0.0.0).
Escape character is '^]'.
220 hostname.domainname ESMTP
ehlo localhost
250-hostname.domainname
250-PIPELINING
250 8BITMIME
mail from: zaki@zero-start.jp
250 ok
rcpt to: zaki@zaki.jp
250 ok
data
354 go ahead
from: 
to: 
subject: test

test
.
250 ok 1301293631 qp 31290
quit
221 hostname.domainname
Connection closed by foreign host.
$

このうち,SMTPに該当するのは下記の部分になります。

ehlo
mail from:
rcpt to:
data
.
quit

まずグリーティングメッセージがサーバから送られています。ESMTPというは拡張SMTPをサポートしていますよ,という意味です。

ehloはこちらの(クライアント側の)ホスト名を伝えるコマンドです。

mail from: とrcpt to: はメールエンベロープの送信元と送信先を指定するコマンドです。dataは実際のメールのヘッダとボディを送信するコマンドです。ヘッダに続く最初の空行以降がボディという約束になっています。

また単独の.がdataの終わりを意味しています。最後にquitでプロトコルを終了して,この時点でメールが送信されます。

これを見ると,メールのエンベロープとヘッダは別物ということがよくわかります。メールのヘッダはプロトコル的にはただのテキストです。サーバの実装によってはehloは略しても大丈夫なケースが多いので,筆者はよく省略していました(本当はいけませんが⁠⁠。

上記の例のように,手動でプロトコルをしゃべるのは何ら難しいことではないのがわかると思います(平文であれば,ですが⁠⁠。

注意点として,シェルプロンプトから telnet 0 25 としていますが,この0というのはINADDR ANYを意味しているのですが,この表記をサポートしていないケースもあるので,その時は明示的にlocalhostやSMTPサーバのアドレス(ホスト名)を指定しましょう。


ちなみにSMTPの執筆時点でのRFCは5321になります。元々はRFC821という非常に有名なRFC番号(インフラエンジニアであれば,まず最初に覚えるといっても過言ではない)だったのですが,これが2821にObsoleted byされて,さらに5321にObsoleted byされて今日に至ります。余談ですが,SMTPは非常にメジャーなプロトコルのため,821を2821,そして5321でObsoleteと,番号で韻を踏んでいるのがわかります。

次回はこの続きでHTTPプロトコルについて解説してみたいと思います。

著者プロフィール

山崎徳之(やまざきのりゆき)

青山学院大学卒業後,アスキー,So-netなどでネットワーク,サーバエンジニアを経験。オン・ザ・エッヂ(現ライブドア)のデータセンターである「データホテル」を構築,運営。2003年にベイエリアにおいてVoIPベンチャーであるRedSIP Inc.を創業。2006年6月に株式会社ゼロスタートコミュニケーションズ(現 ZETA株式会社)を設立,代表取締役就任(現任)。ECソリューションの「ZETA CX」シリーズとして検索エンジンやレコメンドエンジンを開発,販売している。

blog:http://blog.zaki.jp/
社長コラム:https://zetacx.com/column