MTAとMTU間の通信パケットキャプチャ

メールクライアントからメールを送信した時の、MTUとMTAのやりとりをキャプチャ*1したもの。
IPアドレス192.168.1.100がクライアント、192.168.1.1がサーバです。

TCP/IP接続確立

No.	Source		Destination      Protocol	Info
1    192.168.1.100	192.168.1.1	  TCP		1563 > smtp [SYN] Seq=0 Len=0 MSS=1260
2    192.168.1.1	192.168.1.100	  TCP		smtp > 1563 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460
3    192.168.1.100	192.168.1.1	  TCP		1563 > smtp [ACK] Seq=1 Ack=1 Win=65535 Len=0

上記でTCP通信の確立を行っています。3ウェイハンドシェイクと呼ばれるものです。

MTUとMTAの接続確立

No.	Source		Destination      Protocol	Info
4    192.168.1.1	192.168.1.100	  SMTP		Response: 220 mail.hoge.example.com ESMTP Postfix
5    192.168.1.100	192.168.1.1	  SMTP		Command: EHLO [192.168.1.100]
6    192.168.1.1	192.168.1.100	  TCP		smtp > 1563 [ACK] Seq=43 Ack=23 Win=5840 Len=0
7    192.168.1.1	192.168.1.100	  SMTP		Response: 250-mail.hoge.example.com

TCP/IP接続確立後、サーバ側がリプライコード「220」で自己紹介を行っています。
メールサーバのホスト名がわかると思います。サーバはPostfixを使っているという記述もあります。
サーバの自己紹介を受け、クライアント側も「EHLO」で自分を名乗っています。
EHLO」はSMTP拡張サービスと呼ばれるもので、拡張サービスに対応していない場合は「HELO」を送信します。
最後にサーバ側が「250」リプライコードを返します。これでサーバとクライアントの接続処理が終了しました。
ここからメールデータ部分の送信を行います。

SMTP拡張サービスについてはこちらを参照~@IT
SMTPリプライコード

メール送信元、送信先の指定

8    192.168.1.100	192.168.1.1	  SMTP		Command: MAIL FROM:<test@hoge.example.com> SIZE=372
9    192.168.1.1	192.168.1.100	  SMTP		Response: 250 Ok
10   192.168.1.100	192.168.1.1	  SMTP		Command: RCPT TO:<hoge@test.local.net>
11   192.168.1.1	192.168.1.100	  SMTP		Response: 250 Ok

MAIL FROM:」コマンドで始まる部分が、送信元のメールアドレスになります。
サーバはリプライコード「250」で応答を返しています。
次に「RCPT TO:」コマンドでメールの送信先を指定します。

メール本文の送信

12   192.168.1.100	192.168.1.1	  SMTP		Command: DATA
13   192.168.1.1	192.168.1.100	  SMTP		Response: 354 End data with <CR><LF>.<CR><LF>
14   192.168.1.100	192.168.1.1	  SMTP		Message Body
15   192.168.1.1	192.168.1.100	  TCP		smtp > 1563 [ACK] Seq=193 Ack=482 Win=6432 Len=0
16   192.168.1.100	192.168.1.1	  SMTP		EOM: .
17   192.168.1.1	192.168.1.100	  TCP		smtp > 1563 [ACK] Seq=193 Ack=485 Win=6432 Len=0
18   192.168.1.1	192.168.1.100	  SMTP		Response: 250 Ok: queued as D97C69F5597
19   192.168.1.100	192.168.1.1	  SMTP		Command: QUIT
20   192.168.1.1	192.168.1.100	  SMTP		Response: 221 Bye
21   192.168.1.1	192.168.1.100	  TCP		smtp > 1563 [FIN, ACK] Seq=233 Ack=491 Win=6432 Len=0
22   192.168.1.100	192.168.1.1	  TCP		1563 > smtp [ACK] Seq=491 Ack=234 Win=65303 Len=0
23   192.168.1.100	192.168.1.1	  TCP		1563 > smtp [FIN, ACK] Seq=491 Ack=234 Win=65303 Len=0
24   192.168.1.1	192.168.1.100	  TCP		smtp > 1563 [ACK] Seq=234 Ack=492 Win=6432 Len=0

DATA」コマンドを送信し、これ以降はメールのデータ部分を送信するとサーバに伝えます。
Message Body」の部分でタイトルや本文データの送信を行っています。
16行目の「 . (ピリオド)」は、メールデータがこれで終わりということを表しています。
送信が終わったら「QUIT」コマンドで切断を行っています。サーバ側からは「bye」応答を返しています。

Message Body部抜粋
Message: Message-ID: <47328AFF.7010904@hoge.example.com>\r\n
Message: Date: Thu, 08 Nov 2007 13:05:19 +0900\r\n
Message: From: test@hoge.example.com
Message: User-Agent: Thunderbird 2.0.0.6 (Windows/20070728)\r\n
Message: To: hoge@test.local.net\r\n
Message: Subject: TEST_MAIL\r\n
Message: Hello World\r\n

メッセージボディ部の抜粋です。
1行目のMessage-IDはメッセージの識別子を表すもので、それぞれ唯一無二である必要があります。 3行目でFrom、5行目でToの指定がありますが、MAIL FROMやRCPT TOとは別物として扱われ、これらはメールデータとして扱われます。
ですので、この記述はメール転送には一切関係しません。
Subjectがタイトル、最終行がメール本文になります。


以上がメール送信の一連の流れです。今回はMTAとMTU間の通信でしたが、MTAとMTA間のメールのやりとりもほぼ同じです。
また、Telnetでメールサーバに接続し、上で紹介したコマンドを手で入力してもメール送信を行うことが可能です。

最終更新:2010年09月20日 22:38

*1 パケットのキャプチャはWiresharkを利用 [[http://www.wireshark.org/:http://www.wireshark.org/]]