技術解説 · 出典付きの回答
SMTPはTCPかUDPか?プロトコルの技術解説
SMTPはTCPのプロトコルです。メッセージを確実に、正しい順序で、データを失うことなく配信するためにTransmission Control Protocol(TCP)を利用しています。メッセージのすべてのバイトが欠けることなく届かなければならない通信プロトコルにとって、これは非常に重要です。
SMTPにTCPが必要な理由
メール配信ではパケットの損失が許されないため、SMTPにはコネクション型のプロトコルが必要です。TCPは、セッションを確立するための3ウェイハンドシェイク、パケットを順序付けるシーケンス番号、受信を確認する確認応答(ACK)を提供します。送信中にパケットが失われると、TCPは自動的に再送を要求します。UDPはコネクションレス型で配信を保証しないため、コマンドと応答を順にやり取りするSMTPセッションの構造には適していません。
SMTPハンドシェイクの流れ
TCP接続があることで、SMTPは対話形式のやり取りを行えます。TCPソケットが開くと、サーバーは220のグリーティングを送信します。次にクライアントはEHLOまたはHELOを送信してセッションを開始します。この状態を持つやり取りは、MAIL FROMやRCPT TOのコマンドまで続きます。TCPが提供する信頼性の高いストリームがなければ、サーバーとクライアントはこうした状態遷移を同期させることも、エラーコードを適切に処理することもできません。
SMTPの標準的なTCPポート
SMTPは用途に応じて、登録済みの複数のTCPポートで動作します。ポート25はサーバー間のリレーに使われます。ポート587は、STARTTLSを使うクライアントからのサブミッションの標準ポートです。ポート465は暗黙的TLSに使われます。これらの割り当てはすべてIANAが管理しており、メッセージのヘッダーと本文を送信する間のセッションの完全性を保つため、いずれもTCPのトランスポート層を使用します。
セキュリティとトランスポート層
現在のSMTP実装では、暗号化のためにTCPストリームをTLSで包みます。これは、ポート587でのSTARTTLSコマンド、またはポート465での暗黙的TLSのいずれかで実現されます。TLS自体も、独自のハンドシェイクと鍵交換を行うために信頼性の高いトランスポート層を必要とするため、その下のTCP接続は必須です。開発者はSendHQの無料ツールを使って、こうした安全な接続のためのDNS設定を確認できます。
UDPのプロトコルとの比較
SMTPはTCPを使いますが、DNSなどメールに関連する他のサービスは、高速でオーバーヘッドの小さいクエリのためにUDPを使います。ただし、DNSクエリによってUDPでメールサーバーのIPが解決されると、実際のメール転送はTCPに切り替わります。この組み合わせにより、高速なルックアップと信頼性の高い配信を両立できます。UDPは速度と効率のために、TCPは正確性とセッション管理のために使われます。
よく寄せられる質問
SMTPがUDP上で動作することはありますか?
いいえ、SMTPの仕様では信頼性が高く順序の保たれたデータストリームが必要であり、それを提供できるのはTCPだけです。UDPは必要なセッション管理をサポートしていません。
メールの送信に最適なTCPポートはどれですか?
安全な送信のためのSTARTTLSをサポートしているため、メールのサブミッションにはポート587が推奨されます。
TLSを使うとトランスポートプロトコルは変わりますか?
いいえ、TLSはTCPの上に位置する暗号化のレイヤーです。データを暗号化しますが、パケットの実際の転送には引き続きTCPを利用します。
SMTPがTCPを使うのに、DNSがUDPを使うのはなぜですか?
DNSは、小さく高速なクエリの遅延を減らすためにUDPを使います。SMTPがTCPを使うのは、パケットが1つ失われただけでメールメッセージ全体が壊れる可能性があるためです。
一次情報源
- RFC 5321:簡易メール転送プロトコル(SMTP) — RFC Editor
- サービス名およびトランスポートプロトコルのポート番号レジストリ — IANA
- RFC 3207:トランスポート層セキュリティ(TLS)上のセキュアなSMTPのためのサービス拡張 — RFC Editor