电子邮件是「存储转发」:每一跳都先整个收下,再往外发。 所以它不是一条端到端的连接,而是一串接力,中间任何一跳都能停下来等。
这一节把一封信的路径拆成六跳,并给每一跳标上典型耗时。 最后两跳的时间会比前四跳大好几个数量级,这个对比是本节的重点。
一、四个角色,六跳路
一封邮件从你按下发送到对方看见,要经过四个角色: MUA(你的客户端)、MSA(提交服务器)、MTA(传输代理)、MDA(投递代理)。 MUA 到 MSA 用提交端口 587,MSA 到 MTA 是本地队列,MTA 到 MTA 用 SMTP 25, MTA 到 MDA 是本地投递,MDA 到收件人用 POP3 或 IMAP。 为什么要把「提交」和「传输」分开: 因为提交要认证(证明你是这个邮箱的主人),传输不要认证(服务器之间互相信任程度不同)。 把这两件事放在不同的端口上,就能分别做策略——587 要求登录,25 可以只允许特定 IP。 这是「同一套协议,两种用法」的典型做法。
二、时间是「人等机器」还是「机器等人」
前三跳加起来不到 25 毫秒,全是机器之间的对话:提交、排队、查 MX 记录。都很快。 第四跳开始变成「等人」: 收件服务器可能正在做反垃圾检查、可能限速、可能直接延迟接收(灰名单)。 灰名单的做法是「第一次来先拒绝,让你五分钟后再试」—— 因为正常服务器会重试,垃圾群发器通常不会。 最后一跳更夸张:那是「收件人什么时候想起来开邮箱」。 所以「邮件发出去多久能到」这个问题没有统一答案—— 协议层面是秒级,实际体验是「看对方什么时候上线」。
三、存储转发带来两个后果
第一个后果是「不需要两端同时在线」。
这正是电子邮件相对电话的根本优势——电话要求两边同时拿起听筒,邮件不要求。
所以异步通信的价值不是「快」,是「不用协调时间」。
第二个后果是「可追溯」。
每经过一个 MTA,都会在邮件头上加一行 Received。
收到一封信,头里可能有五六行,从下往上读就是它走过的路。
这也是判断「这封信是不是伪造的」的第一手材料——
因为最上面那行是最后一跳加的,最可信;最下面那行是发信方加的,可以随便编。
所以「看邮件头识破诈骗」这件事,关键在「读懂顺序」,而不是「看有没有某个字段」。
四、动手 Demo:一封邮件从你按下发送到对方看见,走了几跳
把六跳的典型耗时排出来,看「机器时间」和「人时间」的比例。 这些数是经验值,不是测量值,用来说明量级关系。
hops = [
('1', '你的客户端 MUA', '提交给发信服务器', 'SMTP 587', 1.0),
('2', '发信方 MSA', '排队准备外发', '本地队列', 1.0),
('3', '发信方 MTA', '查收件域的 MX', 'DNS', 20.0),
('4', '收件方 MTA', '收下并存邮箱', 'SMTP 25', 300.0),
('5', '收件方 MDA', '投进具体信箱', '本地投递', 5.0),
('6', '收件人客户端', '取信', 'POP3/IMAP', 600.0),
]
acc = 0.0
for no, who, what, proto, ms in hops:
acc += ms
print(no, who, what, proto, ms, acc)
实跑输出:
--------------------------------------------------------------------
一封邮件从你按下发送到对方看见,走了几跳
--------------------------------------------------------------------
**电子邮件的路径是「存储转发」**:**每一跳都是「先整个收下,再往外发」。**
**所以它不是「端到端的一条连接」,而是「一串接力」。**
跳 谁 干什么 用什么 耗时ms 累计ms
--------------------------------------------------------------------------------
1 你的客户端 MUA 提交给发信服务器 SMTP 587 1 1
2 发信方 MSA 排队准备外发 本地队列 1 2
3 发信方 MTA 查收件域的 MX DNS 20 22
4 收件方 MTA 收下并存邮箱 SMTP 25 300 322
5 收件方 MDA 投进具体信箱 本地投递 5 327
6 收件人客户端 取信 POP3/IMAP 600 927
**注意后两跳的时间和前三跳不在一个量级**:**前三跳加起来不到 25 毫秒,全是机器之间的对话。**
**第四跳开始变成「等人」**——**收件服务器可能正在做反垃圾检查,可能限速,可能直接延迟接收。**
**最后一跳更夸张:那是「收件人什么时候想起来开邮箱」。**
**所以「邮件发出去多久能到」这个问题没有统一答案**:
**协议层面是秒级,实际体验是「看对方什么时候上线」。**
**这就是「存储转发」和「即时通信」的本质区别**——
**中间任何一跳都可以停下来等,不需要两端同时在线。**
**这个设计带来的另一个后果是「可追溯」**:**每经过一个 MTA,都会在邮件头上加一行 Received。**
**收到一封信,头里可能有五六行 Received,从下往上读就是它走过的路。**
**这也是判断「这封信是不是伪造的」的第一手材料。**
前三跳累计 22 毫秒,后三跳累计 905 毫秒——差四十倍。 而最后一跳那 600 秒(十分钟)根本不算「慢」,它是「人还没打开邮箱」。 这个表最有用的地方是「排错时该看哪一行」: 如果信发不出去,看第三行(MX 查不到)和第四行(对方拒收)。 如果信发出去了但对方没收到,看第五行和第六行——那就是「投递成功但人没看」。 注意第四行那个 300 秒是「灰名单」的典型值:它带来的延迟是分钟级,不是秒级。 所以「邮件延迟」这件事,九成情况下是策略造成的,不是带宽造成的。
30 秒实验
- 算一下:前三跳和后三跳的耗时比是多少?
- 想一下:为什么提交端口(587)要认证,传输端口(25)不要?
- 想一下:邮件头里的 Received 从下往上读,为什么最上面那行最可信?
常见误区
- 以为「邮件是端到端直连」。 它是存储转发,中间每一跳都能停下来等。
- 以为「邮件慢是因为网络慢」。 九成是灰名单和反垃圾策略造成的,和带宽无关。
- 以为「Received 头越多越可疑」。 多说明经过的服务器多,要看的是「顺序对不对、 有没有断链」。
自测三问(点开对答案)
1. 邮件的四个角色是什么? —— **MUA、MSA、MTA、MDA**,外加收件人的客户端。 2. 灰名单为什么有效? —— **正常服务器会重试,垃圾群发器通常不会。** 3. 存储转发带来的两个后果是什么? —— **不需要两端同时在线**;**每一跳都留下可追溯的头。**下一节看邮件地址的格式和长度限制。
- ☐ (本节完,下一节 8.4.2 邮件地址)