問題描述
移動寬帶路由器MTU=1500時某些app無網絡,改成1480就解決了,是什么原因造成的?
正文
出問題的APP,使用手機默認MTU =1500來發送TCP報文。到達寬帶路由器WAN出口時,由于WAN口需要添加8個字節PPPoE協議頭等,使得TCP報文總長度為1508+字節, 大于WAN接口的MTU值, 1500字節。
迫使寬帶路由器需要將TCP報文分片,這里又分兩種情況:
分片失敗
IP報文頭DF=1,路由器無法分片,只好丟棄處理。隨后給APP所在手機發送ICMP出錯消息。
ICMP消息到達APP手機所在的IP層,IP層將消息傳遞給TCP處理。但是,TCP并沒有將重傳隊列的報文修改為更小尺寸,而是繼續發送“重傳隊列”里原始報文。!
很顯然,重傳的原始報文依然會被丟棄,最終導致通信的障礙!
分片成功
IP報文頭DF=0,路由器分片處理,分成2片。2個分片愉快到達目的地,但目的地對分片很敏感,認為是不懷好意的碎片攻擊報文,一丟了之。這同樣會導致通信的障礙!
讀者會有疑問,為何其它APP可以通信?
分兩種情況:
較小的MSS尺寸
沒出問題的APP使用較小的TCP報文尺寸,比如536-1440,所以一切正常。
正常的MSS(1460)尺寸
盡管也會遭遇分片,但是目的地的服務器對分片很友好,沒有鄙視而丟棄。而是將分片重組完成,并提交給應用程序,通信完全沒有問題,盡管性能會有所下降。
重點來了,為何修改MTU到1480就沒有問題了?
手機APP會說,你寬帶路由器修改MTU和我有啥關系,風馬牛不相及!?
寬帶路由器鄙夷臉:“You are too NAIVE”!難道你的流量不經過我家門口?我不可以修改你的MSS?
手機APP好像有點懂了。哦,原來你會偷偷修改我的MSS值,將它改小。當你的接口MTU = 1480時,你會將我的MSS修改成 1480 -20 -20 =1440 字節。我的TCP報文撐死也不會超過1480字節,不會被分片,不會受到歧視,對嗎?
對的!寬帶路由器露出欣慰的笑臉。。。
謝謝你的耐心解釋!手機APP很誠懇地說道。
推薦閱讀:
深圳電信寬帶、重慶電信寬帶、昆明電信寬帶、貴陽電信寬帶、長沙電信寬帶、成都電信寬帶、廈門電信寬帶、上海電信寬帶、北京電信寬帶、呼和浩特電信寬帶、拉薩電信寬帶、石家莊電信寬帶、沈陽電信寬帶、長春電信寬帶、哈爾濱電信寬帶、濟南電信寬帶、合肥電信寬帶、杭州電信寬帶、武漢電信寬帶、福州電信寬帶、南昌電信寬帶、?陔娦艑拵、南京電信寬帶、南寧電信寬帶、貴陽電信寬帶、烏魯木齊電信寬帶、蘭州電信寬帶