Total Pageviews

Saturday, 7 October 2017

只能发500英里的邮件



发生于麻省理工的一个有意思的bug:只能发500英里的邮件。原文在此:web.mit.edu/jemorris/hu
相当Nerd的bug,有兴趣的人看看吧。
大意是,当年麻省的一名系统管理员,忽然收到统计系主任打来的求助电话“咱们的邮件发不了500英里以外的地方,其实,是520英里更准确点”。
系统管理员心里¥!&……*&。
不过在他开始用自己的邮件测试后,发现邮件的确只能发往520英里以内,其余的收件地点一律失败。
于是在他一片纠结中他渐渐开始发现问题,邮件服务器被人更新过操作系统(当年还是SunOS),但是由于操作系统的发行版往往配备了旧版软件,于是在更新操作系统的时候邮件软件反而被降级了(Sendmail 8 -> Sendmail 5)。
于是进一步调查发现,在更新操作系统时,管理员自己编写的Sendmail配置文件(sendmail.cf)被保留了下来。这样就出现了这种状况:Sendmail 5尝试解析Sendmail 8的配置文件。

但是为什么会是500miles呢?为什么是500miles咧?
原因是这样的,Sendmail 5面对陌生的配置文件,凡是不理解的部分都会忽略,凡是没设置过的配置项自动设置成0。这样其中有一个被设置成0,这一项就是 (连接远端SMTP服务器的超时时间)timeout to connect to the remote SMTP server。后来经过实验,发现0秒的timeout会导致Sendmail在3毫秒后中断连接。
所以,为啥是500miles?
在当年,MIT的校园网是没有那么多router的,也就没那么多网络延迟,所以连接一个远端主机的时间大概就是光所需的时间。于是3毫秒, 就意味着:
0.003 * 3 * 10 ^ 8 * 0.001 * 0.621 = 558.9000000000001
558英里。也就是558英里以外的服务器,都无法连接到,而558英里以内的服务器,都可以正常通信。
当当当,这就是500英里的bug啦

No comments:

Post a Comment