技术解析 · 附来源的解答
SMTP 使用 TCP 还是 UDP?协议技术解析
SMTP 是基于 TCP 的协议。它依靠传输控制协议(TCP)确保邮件可靠、按顺序且无数据丢失地送达。对于邮件中每个字节都必须完整到达的通信协议来说,这一点至关重要。
为什么 SMTP 需要 TCP
SMTP 需要面向连接的协议,因为邮件投递无法容忍丢包。TCP 通过三次握手建立会话,用序列号为数据包排序,并用确认报文确认接收。如果传输过程中丢失了数据包,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 实现会用 TLS 包裹 TCP 数据流以提供加密,方式是在 587 端口上使用 STARTTLS 命令,或在 465 端口上使用隐式 TLS。由于 TLS 本身需要可靠的传输层来完成握手和密钥交换,底层的 TCP 连接必不可少。开发者可以使用 SendHQ 免费工具检查这些安全连接相关的 DNS 设置。
与 UDP 协议的比较
虽然 SMTP 使用 TCP,但 DNS 等其他邮件相关服务使用 UDP 来进行快速、低开销的查询。不过,一旦通过 UDP 的 DNS 查询解析出邮件服务器 IP,实际的邮件传输就会切换到 TCP。这种混合方式兼顾了快速查询和可靠投递:UDP 用于追求速度和效率,TCP 则用于保证准确性和会话管理。
团队常问的问题
SMTP 能在 UDP 上运行吗?
不能。SMTP 规范要求可靠、有序的数据流,而只有 TCP 能提供这一点。UDP 不支持所需的会话管理。
哪个 TCP 端口最适合发送邮件?
推荐使用 587 端口提交邮件,因为它支持 STARTTLS 安全传输。
TLS 会改变传输协议吗?
不会。TLS 是位于 TCP 之上的加密层,它对数据进行加密,但实际的数据包传输仍依赖 TCP。
既然 SMTP 使用 TCP,为什么 DNS 使用 UDP?
DNS 使用 UDP 处理小而快的查询,以降低延迟。SMTP 使用 TCP,是因为丢失哪怕一个数据包都可能损坏整封邮件。
一手资料
- RFC 5321:简单邮件传输协议(SMTP) — RFC Editor
- 服务名称与传输协议端口号注册表 — IANA
- RFC 3207:基于传输层安全(TLS)的安全 SMTP 服务扩展 — RFC Editor