天天看點

趣事記錄 | 有哪些讓你目瞪口呆的 Bug ?

發生于麻省理工的一個有意思的bug:隻能發500英裡的郵件。

相當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毫秒, 就意味着:

\[0.003 * 3 * 10^{8} * 0.001 * 0.621=558.9000000000001\]

\(558\) 英裡。也就是 \(558\) 英裡以外的伺服器,都無法連接配接到,而 \(558\) 英裡以内的伺服器,都可以正常通信。

當當當,這就是 \(500\) 英裡的bug啦。

The desire of his soul is the prophecy of his fate

你靈魂的欲望,是你命運的先知。

繼續閱讀