Linux下http連接被重置的實驗性解決辦法


        首先讓我爲大家介紹一下這個問題的背景知識。

       典型TCP數據包有一個最大窗口大小爲64KB的窗口域。這在因特網發展初期,大部分系統都沒有能力處理比這更大的數據,因此這個大小是足夠的,但是對於現在的接入帶寬應用來說,這已經太小了。爲了解決這個問題,1992年提出了一種稱爲窗口縮放的解決方案,它提供了一個額外的TCP窗口擴大選項,該選項包含一個8位的擴大因子。這個選項 的值指定了窗口應該多大,它是由通過滑動幾個比特的窗口大小值來實現的。例如,如果擴大因子設定爲5,那麼窗口大小應該移動5個比特或乘以32。窗口擴大選項使TCP的窗口定義從16位增加到32位,這並不是通過修改TCP首部來實現的,TCP首部仍然使用16位,而是通過定義一個選項實現對16位的擴大操作來完成的。

       在2.6.16和更早內核中默認擴大因子爲0,所以沒有增加窗口大小。在2.6.17內核中,擴大因子被設定爲7。理想的情況下,這不會有什麼問題。但實際上,一些“壞掉”的路由器會重寫窗口縮放TCP選項——將擴大因子設定爲0但是實際處理能力選項卻沒有改變。本質上,這意味着有一些網站使用2.6.17和更高內核的系統將會連接不上。從內核開發人員的立場看他們會認爲那些路由器是壞掉的需要進行替換。實際上,這些路由器在修理或替換前可能還可以繼續使用好多年。

       解決這個問題的一個方法是重新設置Linux內核的窗口縮放選項。雖然這不會修復壞掉的路由器,但是如果你正受到窗口縮放問題的影響,該方法可以使你的系統連接到遠程站點。

       解決辦法,可以編輯/etc/sysctl.conf文件,添加下面一句:net.ipv4.tcp_window_scaling = 0把前面的#幹掉這將完全禁用窗口縮放功能,這將允許你連接到一些以前不能連接的站點。無論正確還是錯誤,內核開發人員拒絕恢復這個改變,因此使用該選項既可以禁用 你自己的窗口縮放功能以回到2.6.17以前的默認設置,也可以連接到那些不能到達的站點並使他們確信因該查找並替換壞掉的路由器。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章