help!我的電子郵件發(fā)不到 500 英里以外!
這是一個(gè)聽起來(lái)幾乎不可能的事情……我甚至有點(diǎn)后悔將它發(fā)到網(wǎng)上,因?yàn)樗谝粋€(gè)會(huì)議上成了一則著名的酒后故事。這個(gè)故事略有改動(dòng),以保護(hù)故事中的人物,以及忽略了一些無(wú)關(guān)的細(xì)節(jié)使之更有趣一些。
幾年前,當(dāng)我接到統(tǒng)計(jì)系主任的電話時(shí),我正在從事維護(hù)校園電子郵件系統(tǒng)的工作。
“我們從部門發(fā)送電子郵件時(shí)遇到了問題?!?/p>
“有什么問題?” 我問。
“我們不能發(fā)送超過 500 英里的郵件,”主任解釋說(shuō)。
“咳咳”,我被我喝的拿鐵嗆了一口,“您再說(shuō)一遍?”
“我們不能發(fā)送距這里超過 500 英里的郵件,”他重復(fù)道。 “實(shí)際上,更遠(yuǎn)一點(diǎn),是 520 英里,但不能更遠(yuǎn)了。”
“嗯……電子郵件真的不會(huì)這樣,通常,”我說(shuō),試著讓我的聲音聽起來(lái)不那么慌亂。我不能和一個(gè)系主任說(shuō)話時(shí)顯得慌亂,即使是一個(gè)像統(tǒng)計(jì)系這樣的相對(duì)沒錢的院系。?“是什么讓你覺得你不能發(fā)送郵件超過 500 英里?”
“這不是我認(rèn)為的,”主任有點(diǎn)急躁地回答道。 “我們首先注意到了這種情況是幾天前?!?/p>
“你等了幾天?” 我打斷他,帶點(diǎn)顫音說(shuō)道。 “這段時(shí)間你一直你不能發(fā)送電子郵件?”
“我們可以發(fā)送電子郵件。只是不超過 ——”
“—— 500 英里,我知道,”我接過他的話,“我知道了。但為什么沒有你早點(diǎn)打電話呢?”
“好吧,我們沒有收集到足夠的數(shù)據(jù)來(lái)確定發(fā)生了什么,直到現(xiàn)在。”沒錯(cuò),這是統(tǒng)計(jì)系的主任。“不管怎么說(shuō),我請(qǐng)了一位地理統(tǒng)計(jì)學(xué)家研究它 ——”
“地理統(tǒng)計(jì)學(xué)家……”
“—— 是的,她制作了一張地圖,顯示了我們發(fā)送電子郵件能夠達(dá)到的半徑略超過 500 英里。在那個(gè)半徑范圍內(nèi)有零星的幾個(gè)無(wú)法到達(dá)的目的地,但我們永遠(yuǎn)不能發(fā)送比這半徑更遠(yuǎn)的電子郵件?!?/p>
“我明白了,”我說(shuō),把頭埋在我的手中。 “這是什么時(shí)候開始的?幾天前,你說(shuō)過,但是那時(shí)你的系統(tǒng)做了什么改變?”
“嗯,服務(wù)顧問來(lái)給我們的服務(wù)器打了補(bǔ)丁,并重新啟動(dòng)了它。但我打電話給他,他說(shuō)他沒有碰過郵件系統(tǒng)。”
“好的,讓我來(lái)看看,我稍后會(huì)給你回電話,”我說(shuō)。我簡(jiǎn)直覺得我在做夢(mèng),這不是愚人節(jié)。我試著回想是不是有人惡作劇報(bào)復(fù)我。
我登錄了他們系的服務(wù)器,并發(fā)送了一些測(cè)試郵件。在北卡羅來(lái)納州的三角研究園( Research Triangle Park),我自己的帳戶的測(cè)試郵件順利投遞。發(fā)往里士滿、亞特蘭大和華盛頓的也是如此。發(fā)往普林斯頓(400 英里)的另一個(gè)郵件也正常。
但后來(lái)我嘗試向孟菲斯(600 英里)發(fā)送電子郵件,失敗了。波士頓,失敗了。底特律,也失敗了。我拿出了我的地址簿,開始試圖縮小它的范圍。紐約(420 英里)工作,但普羅維登斯(580 英里)失敗了。
我開始懷疑自己是不是瘋了。我試過給住在北卡羅來(lái)納州的朋友發(fā)電子郵件,但他的 ISP 在西雅圖。謝天謝地,它失敗了。如果問題與收件人的地理位置有關(guān),而不是他的郵件服務(wù)器,我想我要哭了。
已經(jīng)確定!雖然令人難以置信,但所報(bào)告的問題是真實(shí)的、可重復(fù)的,我看了一下?sendmail.cf
?文件。它看起來(lái)很正常。事實(shí)上,它看起來(lái)很熟悉。
我把它與我主目錄中的?sendmail.cf
?做了個(gè)對(duì)比。它沒有被改過 —— 這是我寫的?sendmail.cf
。 而且我相當(dāng)確定我沒有啟用某種 “FAIL_MAIL_OVER_500_MILES
” 選項(xiàng)。我不知所措,我 telnet 到 SMTP 端口。 服務(wù)器愉快地回復(fù)了 SunOS sendmail 的橫幅消息。
等一下……一個(gè) SunOS sendmail 的橫幅消息?當(dāng)時(shí),即使 Sendmail 8 已經(jīng)相當(dāng)成熟,Sun 公司在其操作系統(tǒng)中裝的仍然是 Sendmail 5。作為一名優(yōu)秀的系統(tǒng)管理員,我已經(jīng)對(duì) Sendmail 8 進(jìn)行了標(biāo)準(zhǔn)化。并且作為一名優(yōu)秀的系統(tǒng)管理員,我編寫了一個(gè)?sendmail.cf
,它使用了 Sendmail 8 中提供的很長(zhǎng)的、具有自我描述意義的選項(xiàng)和變量,而不是 Sendmail 5 中使用的那種神秘的標(biāo)點(diǎn)符號(hào)式配置選項(xiàng)。
這個(gè)細(xì)節(jié)一下子又回到了起點(diǎn),我再次被我現(xiàn)在已經(jīng)冷掉了的拿鐵咖啡渣嗆了。 當(dāng)服務(wù)顧問“對(duì)服務(wù)器打補(bǔ)丁”時(shí),他顯然升級(jí)了 SunOS 的版本,并且這樣做降級(jí)了?Sendmail。這次升級(jí)會(huì)將 sendmail.cf 單獨(dú)留下,即使它現(xiàn)在是錯(cuò)誤的版本。
事實(shí)上,Sendmail 5 —— 至少是 Sun 所帶的版本,是有一些調(diào)整的 —— 它可以處理 Sendmail 8 的?sendmail.cf
,因?yàn)榇蠖鄶?shù)規(guī)則在那時(shí)保持不變。但新的長(zhǎng)配置選項(xiàng) —— 它被視為垃圾,并跳過。 并且?sendmail
?二進(jìn)制文件編譯時(shí)沒有針對(duì)其中大多數(shù)設(shè)置默認(rèn)值,因此,在?sendmail.cf
?文件中找不到合適的配置,它們被設(shè)置為?0。
被設(shè)置為?0?的配置之一是連接到遠(yuǎn)程 SMTP 服務(wù)器的超時(shí)選項(xiàng)。 一些實(shí)驗(yàn)證明,在具有典型負(fù)載的特定機(jī)器上,0?超時(shí)將在稍微超過?3 毫秒的時(shí)間內(nèi)中止連接調(diào)用。
當(dāng)時(shí)我們校園網(wǎng)絡(luò)的一個(gè)奇怪的特點(diǎn)是它是 100% 交換的。傳出的數(shù)據(jù)包不會(huì)出現(xiàn)路由器延遲,直到命中 POP 服務(wù)器并到達(dá)遠(yuǎn)端的路由器。因此,連接到附近網(wǎng)絡(luò)上的輕負(fù)載的遠(yuǎn)程主機(jī)的時(shí)間實(shí)際上主要取決于到目的地的光速的速度,而不是偶然的路由器延遲。
這讓我有點(diǎn)暈,我在我的 shell 中輸入:
1 2 3 4 5 6 7 | $ units 1311 units, 63 prefixes ? You have: 3 millilightseconds You want: miles * 558.84719 / 0.0017893979 |
“500 英里,或者稍微多一點(diǎn)點(diǎn)?!?/p>