為什麼有些網頁開啟特別慢(電腦網頁開啟很慢怎麼回事啊)
解決“通”或“不通”這類功能性問題,其實很好解決。解決網頁開啟“很慢”、“慢”、“正常”、“快”之類的效能問題,有時並不那麼容易。
通過題主的描述可以獲得以下事實:
- 網路的連通性沒有問題,否則也無法Ping通伺服器
- 域名解析也沒有問題,否則也無法訪問網頁
- 伺服器應該工作正常,否則也無法訪問
- 網路是暢通的,否則Ping的延遲不可能正常
既然網路看起來是好的,為何訪問網頁慢呢?
根據多年的從業經驗,我的推測是:
MTU問題
區域網出口閘道器,可能由於PPPoE撥號,在正常的使用者IP報文頭前又增添了8個位元組的PPPoE頭,使得使用者1500位元組的IP報文,變成了1508位元組。
由於出口閘道器WAN介面的MTU = 1500。很顯然1508位元組的IP報文 > WAN介面的MTU,閘道器需要將1508位元組的IP報文,分成2片,每片都要小於等於1500位元組,才能通行。
分片(Fragment)會消耗閘道器的硬體資源、軟體資源,如果閘道器是使用純軟體來進行分片,那效率是非常低下的,會造成延遲的增大。
當分片到達伺服器時,伺服器要組織硬體、軟體來將分片進行重組(Reassemble),重組成最原始的1500位元組(此時PPPoE頭已經不存在了),這在一定程度上增加了處理延遲。
如果伺服器沒有采用網絡卡硬體加速重組,而是由TCP/IP協議棧(純軟體)進行重組,又是一個令人難以忍受的漫長。
還沒有完,等伺服器返程的IP報文(1500位元組),到達區域網所在的接入網路時,又需要增添8位元組的PPPoE頭,IP報文又一次膨脹為1508位元組,同樣需要分片,這又一次增加了處理延遲。
當分片到達題主的主機時,同樣需要進行重組,這又一次增加了處理延遲。
一來一回共增加了四次處理延遲,訪問網頁自然會慢。
還沒有完,還沒有考慮到有丟包的情況發生。如果2個分片有1個分片傳輸過程中丟了,源主機需要重傳整個IP報文,而重傳的IP報文一樣需要分片。在這種情況下,不但有TCP 超時重傳的延遲,還有分片的延遲。
這無疑是雪上加霜,讓本來很糟的情況,變得更加糟糕。
這還沒有完,分片到達伺服器/主機時,由於其孿生兄弟還沒有到達,需要暫時呆在快取裡等待孿生兄弟的到來,才能重組,對嗎?
在網路丟包嚴重時,孿生兄弟可能永遠都無法到達(丟了),呆在緩衝區的分片需要等待一段時間才能刪除。要命了,會有茫茫多的分片不斷到達緩衝區,並快速佔滿快取空間。
有讀者會問,為什麼它們賴著不走啊?
因為孿生兄弟(分片)還沒有到達!
再有分片到達時,沒有快取可以用了,怎麼辦? 丟!
TCP如何修復這些丟包?
超時重傳!
超時重傳又增加了延遲!
說了那麼多,其實就是一個意思,一旦分片了,就做好網路變慢的思想準備!
上文的觀點,不是憑空的推測,而是多年實驗室實驗研究的結論。
如何證明是MTU造成的問題?
只要把主機的MTU從標準的1500修改成1492或更小,然後再次訪問網頁,和其它主機對比一下便知。
如何系統性地解決這個問題?
一般商用的路由器,為了避免分片,會部署一個Feature : “TCP Adjust-MSS”,用於動態修改使用者TCP報文的MSS值,只要將將MSS值減小8個位元組,以抵消PPPoE頭帶來的長度增加。
如果題主的閘道器路由器支援這個功能,開啟這個功能。如果不支援,需要升級路由器。或將區域網的主機MTU都改小8個位元組。