不想飛的餘
出問題的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個分片愉快到達目的地,但目的地對分片很敏感,認為是不懷好意的碎片攻擊報文,一丟了之。這同樣會導致通信的障礙!
<strong>
<strong>
讀者會有疑問,為何其它APP可以通信?
分兩種情況:
較小的MSS尺寸
沒出問題的APP使用較小的TCP報文尺寸,比如536-1440,所以一切正常。
正常的MSS(1460)尺寸
儘管也會遭遇分片,但是目的地的服務器對分片很友好,沒有鄙視而丟棄。而是將分片重組完成,並提交給應用程序,通信完全沒有問題,儘管性能會有所下降。
重點來了,為何修改MTU到1480就沒有問題了?
手機APP會說,你寬帶路由器修改MTU和我有啥關係,風馬牛不相及啊!?
寬帶路由器鄙夷臉:你的流量經過我家門口時,我不可以修改你的MSS?
手機APP好像有點懂了。哦,原來你會偷偷修改我的MSS值,將它改小。當你的接口MTU = 1480時,你會將我的MSS修改成 1480 -20 -20 =1440 字節。我的TCP報文撐死也不會超過1480字節,不會被分片,不會受到歧視,對嗎?
對的!寬帶路由器露出欣慰的笑臉。。。
謝謝你的耐心解釋!手機APP很誠懇地說道。
不客氣!如果你聽明白了,點贊並分享給你的小夥伴!
車小胖談網絡
mtu是最大傳輸單元的意思,設置多少是要跟局端路由器相同,一般局端是1500或者1485,如果局端是1485的話,那你設置1500那就不通了…