英文提示:This webpage is not available. Error 7 (net::ERR_TIMED_OUT): The operation timed out.
中文提示:此網頁無法訪問。錯誤 7 (net::ERR_TIMED_OUT):操作逾時。
(這個畫面與Windows藍屏有得一拚)
上面的畫面,你用Chrome逛園子時遇到過嗎?你為此鬱悶過嗎?。。。
我多次遇到過,我深深鬱悶過,甚至想過與Chrome分手,這種又愛又恨的感覺你懂的。。。
世上也許有無緣無故的愛,但沒有無緣無故的恨。有時恨是因為愛,有時恨是因為誤解。不要因為恨而放棄,而是要找到其中的原因。
在代碼世界,一切問題都有因,代碼不會擲骰子。
面對問題,沒有其他選擇,只有化鬱悶為力量,尋找"Error 7 (net::ERR_TIMED_OUT): The operation timed out"的真正原因。
在互連網汪洋中,搭上Google這條大船,苦苦尋覓...終於找到了兩條重要的線索:
1. Google Chrome’s new False Start “Feature”
1.1 我根據自己的理解大概翻譯一下:
不知哪個版本開始,Chrome引入了一個新特性——"False Start",這個特性是為了提高基於SSL,TLS的安全通訊的速度(HTTPS用到的)。在瀏覽器與Web伺服器建立安全通道需要訊息的往返(一來一回),而"False Start"減少了其中一個,從“往返”變成了“單程”(是有來無回,還是有去無回,目前還不知道)。
"False Start"改善了使用HTTPS協議的網站的訪問速度。但是很多網站的Web伺服器並不能正確處理"False Start",Chrome能智能地判斷所訪問的網站是否支援"False Start"(個人猜測這個判斷是“雲判斷”,需要串連Google的伺服器),如果不支援,Chrome會自動禁用"False Start"。
於是,那些使用私人區域網路的使用者(不能訪問互連網,之前猜測的“雲判斷”不能工作)在訪問不支援"False Start"的網站時(舊版的Apache, IIS, Tomcat,這裡未提IIS),就會出現"Error 7 (net::ERR_TIMED_OUT): The operation timed out"。
1.2 我的分析:
問題出現的前提條件是:a) Web伺服器不支援"False Start"; b) Chrome不能判斷出目標網站是否支援"False Start",預設啟用"False Start"。
於是,當Chrome以"False Start"的方式訪問不支援"False Start"的網站時,就會出現"Error 7 (net::ERR_TIMED_OUT): The operation timed out"。
聯絡到我們的實際情況,"Error 7 (net::ERR_TIMED_OUT): The operation timed out"不是每次訪問園子時都出現,出現沒有規律,多數情況下不會出現,出現後多刷幾次就會正常。個人猜測,當Chrome能正確判斷出園子不支援"False Start",就不會出現這個問題(由於我們的Web伺服器用的是IIS,由此可以推斷IIS不支援"False Start")。而當某種原因造成Chrome不能判斷出目標網站是否支援"False Start",預設啟用"False Start"進行訪問時,就出問題了。根據之前的猜測,Chrome的這個判斷可能是“雲判斷”,不能判斷的可能性很大的原因就是短暫的無法與Google伺服器進行串連。
2. Request to look into IIS7 support for "SSL False Start"
這是微軟IIS官方網站上的一個文章,樓主發現了IIS7/7.5不支援Chrome “False Start”的問題,並反饋在論壇中。
得到的回答是:"False Start"不是SSL標準,是Chrome為了改善SSL的效能而增加的,其他瀏覽器都不支援這個功能。
個人感想:讓微軟專門針對Chrome改進IIS,改進後讓Chrome在SSL方面表現比IE好,於情於理,微軟都不會乾的。
問題原因小結
1. IIS不支援Chrome的“False Start”特性。
2. 某種原因造成Chrome短暫的無法與Google伺服器串連,從而無法判斷出目標網站是否支援“False Start”,於是預設啟用"False Start"進行訪問。(個人猜測,未經證實)
解決方案
關閉Chrome的“False Start”特性。操作方法:
1. 在案頭上建立Chrome的捷徑;
2. 選中該捷徑,右鍵“屬性(Proterties)”;
3. 在“目標(target)”中,在chome.exe之後輸入參數: -disable-ssl-false-start
該方法確實有效,已經過驗證。
Google Chrome’s new False Start “Feature”一文中還提到另外一個方法,使用參數 –use-system-ssl,強制Chrome使用Windows內建的SSL庫(Windows-SCHANNEL)。
但是,對於一個網站來說,讓所有使用Chrome的使用者進行這樣的更改顯然是不現實的,更好的解決方案是:
1. 等待Chrome的改進,預設不啟用“False Start”;
2. 等待“False Start”成為SSL標準,讓IIS不得不支援;
3. 在IIS之前增加支援“False Start”的反向 Proxy伺服器。
小結
一段Chrome與IIS之間的小故事,卻給多少人了帶來煩惱,我們都不知道該怨誰。但我們可以從中得到啟發 —— 在軟體行業中,標準是多麼多麼的重要!
作者 dudu