筆者單位將中國電信ADSL 8M帶寬升級為100M光貓接入,即“吉比特無源光纖接入用戶端設備(GPON ONU)”接入。升級后發(fā)現(xiàn)基于UDP協(xié)議的游戲、即時通信QQ等正常,但基于TCP協(xié)議的有些網(wǎng)頁打開的速度很慢,后發(fā)現(xiàn)與路由器和防火墻端口的MSS值的大小設置有關。
網(wǎng)絡拓撲結構如圖1所示,華為路由器A2220-S,安裝在中國電信GPON ONU和天融信防火墻TG-61040之間,作為第二出口。
在防火墻上通過策略路由可以決定內網(wǎng)用戶由哪個出口連接Internet。之所以不把GPON ONU直接連接到防火墻,原因是通過路由器連接后,在防火墻上做策略路由會更方便些。但是,當基于源地址的策略路由指定某臺內網(wǎng)PC通過路由器AR2220-S由中國電信的GPON ONU訪問外網(wǎng)時,會出現(xiàn)上述故障現(xiàn)象。
圖1 網(wǎng)絡拓撲結構圖
中國電信的GPON ONU安裝好后,用手提電腦直接連接到其千兆LAN口,網(wǎng)頁打開速度正常,說明中國電信已經(jīng)連接好,故障點在單位路由器及以后。省去路由器,GPON ONU直接連接到防火墻后網(wǎng)頁打開速度正常,說明防火墻沒有問題。手提電腦直接連接到路由器的G0/0/2端口,有些網(wǎng)頁的打開速度就很慢,說明是路由器的問題。但該路由器安裝在其他地方使用又很正常。用另一臺路由器代替這臺路由器時也有同樣的故障現(xiàn)象,說明路由器的硬件正常,可能是某個參數(shù)的配置有問題。
1.MTU(Maximum Transmission Unit)最大傳輸單元。IP層接收到一份要發(fā)送的IP數(shù)據(jù)時,它要查詢該接口的MTU值。IP層把MTU與要發(fā)送的數(shù)據(jù)包長度進行比較,如果數(shù)據(jù)包的長度比MTU值大,那么IP層就需要進行分片,分片后的數(shù)據(jù)可以小于或等于MTU。如果設置強制不分片,IP層在傳輸數(shù)據(jù)時可能會出現(xiàn)丟包現(xiàn)象。如果MTU配置過小而報文尺寸較大,可能會造成分片過多,報文被QoS隊列丟棄。
2.MSS(Max Segment Size)TCP的最大報文段長度。通信雙方在建立TCP連接時會協(xié)商出MSS值,以確定TCP報文段的最大數(shù)據(jù)長度。當對端發(fā)送的TCP報文段的長度超過協(xié)商出來的MSS,報文會進行分片處理。為了保證TCP報文不分片,配置過程中需要注意MSS與MTU的關系,為了不影響報文傳輸,MSS值加上報文開銷(TCP首部、IP首部等)不超過MTU值。但是,如果將MSS設置為一個過小的數(shù)值,而TCP服務器端接受了該MSS值,那么TCP連接建立后,客戶端就可以通過一個應用向服務器提交大量的請求,從而引起服務器產生大量的應答報文,這可能導致TCP服務器或網(wǎng)絡的負荷大大增加。
3.ADSL是基于PPPoE(PPPoverEthernet)協(xié)議的,PPPoE頭 是6字 節(jié),PPP協(xié)議ID號兩個字節(jié),一共要占用8個字節(jié),而以太網(wǎng)的MTU值為1500,所以上層PPP負載數(shù)據(jù)不能超過1492字節(jié),PPP協(xié)商時協(xié)商的最大接收單元值不能超過1492字節(jié)。
4.GEM(G-PON Encapsulation Mode,GPON封裝方式)是一種在GPON上封裝數(shù)據(jù)的方式。GEM可以實現(xiàn)多種數(shù)據(jù)的簡單、高效的適配封裝,將變長或者定長的數(shù)據(jù)分片進行統(tǒng)一的適配處理,并提供端口復用功能,提供和ATM一樣的面向連接的通信。單從幀結構的角度來說,GEM與其他數(shù)據(jù)業(yè)務的成幀方法類似。但GEM是嵌入PON部分中的,也就是在ONU跟OLT兩個PON口之間才能被識別,獨立于OLT的SNI類型或ONU的UNI類型。
5.由于以太網(wǎng)傳輸電氣方面的限制,每個以太網(wǎng)幀都不能超過1518字節(jié),對于大于這個限制的以太網(wǎng)幀都視之為錯誤的數(shù)據(jù)幀,以太網(wǎng)轉發(fā)設備會丟棄這些數(shù)據(jù)幀。除去以太網(wǎng)幀的幀頭14字節(jié)和幀尾4字節(jié),剩下承載上層協(xié)議的Data域最大就只能有1500字節(jié)。用戶請求一個網(wǎng)頁時,用戶計算機與Web服務器之間進行協(xié)商,確定一個最大的MTU尺寸,進行協(xié)商的用戶計算機的默認MTU大小為1500個字節(jié),所以Web服務器經(jīng)協(xié)商確定的MTU大小為1500字節(jié)。因此,無論路由器MTU大小配置為多少,Web服務器所發(fā)送的數(shù)據(jù)包最大字節(jié)數(shù)仍為1500。
綜上所述,TCP封裝占20字節(jié),IP封裝占20字節(jié),PPPoE封裝 占8字 節(jié),TCP的最大報文段長度=以太幀最大值-以太封裝-TCP封 裝-PPPOE封 裝。 即MSS=1518-18-20-20-8=1452字節(jié)。
表1 實驗數(shù)據(jù)
天融信防火墻TG-61040的MTU缺省值為1500,有效范圍是68-1500;MSS的缺省值為off(不做MSS調整,默認),有效值為 <200-1460>。路由器AR2220-S的MTU缺省值為1500,有效范圍為<46-9206>;MSS的缺省設置命令為undo tcp adjustmss,也就是不具體指定MSS的值。
實驗過程主要是修改相關路由器和防火墻各端口的MTU和MSS值,觀察網(wǎng)頁打開的速度。修改的端口主要是路由器的外端口g0/0/1和內端口g0/0/2,防火墻的外端口eth32,實驗結果如下:
1.修改各端口MTU的值,不能排除故障。
2.修改路由器g0/0/1端口的MSS值,不能排除故障。
3.修改路由器G0/0/2端口防火墻eth32端口的MSS值,可以排除故障。
具體實驗數(shù)據(jù)如表1。
從實驗數(shù)據(jù)看出,實驗結果和上述的理論分析是相符的。
天融信防火墻修改端口MTU值的命令為TopsecOS.network.interface eth32#mtu <68-1500>;修改端口MSS值的命令為TopsecOS.network.interface eth32#mss-adjust <200-1460>;根據(jù)接口mtu做mss調整的命令為TopsecOS.network.interface eth32# mssadjust auto;不 做 MSS調整的設置命令為TopsecOS.network.interface eth32#mss-adjust off。顯示端口屬性的命令為TopsecOS.network.interface eth32#show;顯示端口詳細配置的命令為TopsecOS.network.interface eth32# show configuration。
華為路由器AR2220-S修改端口MTU的命令為mtu<46-9202>;修改端口MSS值的命令為tcp adjustmss <128-2048>;恢復默認的MSS值的命令是undo tcp adjust-mss。
當路由器或防火墻之間接口的MSS值設置不當時,基于非TCP協(xié)議的Ping不會有丟包;基于非TCP協(xié)議的即時通信工具如QQ、游戲等網(wǎng)絡通信正常;而只基于TCP協(xié)議的通信會不正常。
所以,如果遇到QQ正常、游戲正常、Ping正常,只是網(wǎng)頁打開不正常,就有可能是MSS值的設置問題了。