在知乎上看到一個有趣的 Bug 事件,轉載記錄一下。
原回答地址:Here
發生於麻省理工的一個有意思的bug:只能發500英里的郵件。
原文在此:http://web.mit.edu/jemorris/humor/500-miles
相當Nerd的bug,有興趣的人看看吧。
大意是,當年麻省的一名系統管理員,忽然收到統計系主任打來的求助電話“咱們的郵件發不了 \(500\) 英里以外的地方,其實,是 \(520\) 英里更准確點”。
系統管理員心里¥!&……*&。
不過在他開始用自己的郵件測試后,發現郵件的確只能發往 \(520\) 英里以內,其余的收件地點一律失敗。
於是在他一片糾結中他漸漸開始發現問題,郵件服務器被人更新過操作系統(當年還是SunOS),但是由於操作系統的發行版往往配備了舊版軟件,於是在更新操作系統的時候郵件軟件反而被降級了(Sendmail 8 -> Sendmail 5)。
於是進一步調查發現,在更新操作系統時,管理員自己編寫的Sendmail配置文件(sendmail.cf)被保留了下來。這樣就出現了這種狀況:Sendmail 5嘗試解析Sendmail 8的配置文件。
但是為什么會是 \(500\) miles呢?為什么是 \(500\) miles咧?
原因是這樣的,Sendmail 5面對陌生的配置文件,凡是不理解的部分都會忽略,凡是沒設置過的配置項自動設置成0。這樣其中有一個被設置成0,這一項就是 (連接遠端SMTP服務器的超時時間)timeout to connect to the remote SMTP server。后來經過實驗,發現\(0\)秒的timeout會導致Sendmail在 \(3\) 毫秒后中斷連接。
所以,為啥是 \(500\) miles?
在當年,MIT的校園網是沒有那么多router的,也就沒那么多網絡延遲,所以連接一個遠端主機的時間大概就是光所需的時間。於是3毫秒, 就意味着:
\(558\) 英里。也就是 \(558\) 英里以外的服務器,都無法連接到,而 \(558\) 英里以內的服務器,都可以正常通信。
當當當,這就是 \(500\) 英里的bug啦。