pppoe環境下的mtu和mss的配合問題


一、問題描述

前端是連接因特網的路由器,中間利用LINUX –IPTABLES搭建的防火牆,由PPPOE協議承擔撥入功能,並開通NAT,后端是客戶機,故障現象是當LINUX系統撥入VPN后,LINUX系統本身域名解析和網站瀏覽正常,NAT后端客戶機出現域名解析正常但網站瀏覽失敗。

二、問題解決

我們在給防火牆加入以下規則后,網絡通信恢復正常。

iptables -A FORWARD -p tcp -m tcp--tcp-flags SYN,RST SYN -j  TCPMSS--clamp-mss-to-pmtu

我們現在來看下這條規則的具體功能,-A 是增加,-FORWARD是要處理通過的數據包,-p,指定要審查tcp協議,審查內容是SYN, RST標志,TCPMSS,是指通過TCPMSS模塊調整MSS的大小。

那么為什么通過調整MSS的大小就可以解決的網絡通信的故障呢?

三、MSS和MTU

 1、什么是TCP-MSS?

MSS: Maxitum Segment Size 最大分段大小,MSS就是TCP每次能夠傳輸的最大數據分段。為了達到最佳的傳輸效能,TCP協議在建立連接時要協商雙方的MSS值,現實情況下,常使用二層協議中的MTU值代替。

 

TCP報文中MSS的位置在選項的位置,選項中內容有很多種,MSS是其中的一種。MSS在TCP報文中是可選項不是必選項,換句話說MSS是可協商的,而且在協商過后該選項內容可以改變也可以沒有,在協商MSS時一般是建立TCP連接的兩端發送[Syn]標志報文時互相通報然后選取最小MSS作為雙方的約定。

這里又出現了一個概念,MTU。

2、什么是MTU

我們可以根據下面這面圖表來了解MTU

 

 

MTU:MaxitumTransmission Unit 最大傳輸單元,在以太網中數據幀最長為1518Bytes,扣除幀頭14Bytes和幀尾CRC校驗部分4Bytes,承載上層協議的數據部分最大是1500Bytes. 這個值我們就把它稱之為MTU。網絡層的IP協議會根據這個值來決定如何對數據進行分片,在網絡,兩台終端進行網絡通信時,數據需要經過各種型號的路由器和多種傳輸媒介才能到達對端,網絡中不同媒介的MTU各不相同,最終取值由最小的MTU值決定。對於網絡層的上層協議而言,它們對MTU的值並沒有特別關心,它們認為這個是網絡層的工作。網絡層IP協議會檢查每個從上層協議下來的數據包的大小,並根據本機MTU的大小決定是否作“分片”處理。分片最大的壞處就是降低了傳輸性能,所以在網絡層更高一層(傳輸層)的實現中往往會對此加以注意。有些高層協議要求在IP包中設置DF標志,DF(Donot Fragment),說明不能進行分片,這樣當這個IP數據包在網絡傳輸的時候,如果遇到MTU小於IP數據包的情況,轉發設備就會根據要求丟棄這個數據 包,然后返回一個錯誤信息給發送者。這樣會造成某些通訊上的問題,不過現實情況是大部分網絡鏈路都是MTU1500或者大於1500。

3、MTU和MSS的聯系

MTU是一個二層的概念,以太網最大的MTU是1500Bytes,MSS是TCP協議中一個可協商的選項,,它是TCP數據包每次能夠傳輸的最大數據分段, IP MTU=MSS+20Bytes(IP包頭)+20Bytes(TCP包頭)。在PPPoE的情況下,還要包括6Bytes的PPPoE頭部和2Bytes的PPP協議ID號,因此, PPP負載數據不能超過1492字節,也就是相當於在PPPOE環境下的MTU是1492字節,MSS是1452字節。

四、原因

現在回頭看下問題的產生原因:在利用pppoe+nat組網時,由於PPPOE是按下圖的形式進行封裝的,

IP

PPP

PPPoE

Ethernet

 

隨着寬帶接入,PPPOE由於具有認證和計的費功能而得廣泛應用。

下面是PPPOE的數據報文格式:

版本

類型

代碼

會話ID

長度

凈載荷

PPPOE是通過以太網傳輸的,其含有PPPOE協議頭有6個字節和以太網幀類型2字節。這個8字節的PPPOE封裝字段會在數據從撥號接口發送出去時被添加到數據報文中。因此,該數據報文從撥號接口出去時的真實長度會大於物理以太網接口的MTU值1500,因此,該數據包將會被丟棄,PPPOE造成的影響是二次封裝耗費資源,降低了傳輸效能等等,最大的不足就是PPPoE導致MTU變小了,以太網的MTU是1500,再減去PPP的包頭包尾的開銷(8Bytes),就變成1492,所以在PPPOE環境下,設置接口MTU時需要將8個字節的PPPOE封裝字段考慮進去,MTU=1500-8=1492,這樣,當IP報頭(20)+ICMP報頭(8)+ICMP凈荷載長度+PPPOE頭(8)<=物理接口1500(即ICMP凈載荷<=1500-28=1472)時,該數據包不會因為數據包長度超過接口MTU值被丟棄,而且還可以在不需要分片的情況下最大限度的發送數據包,提高傳輸效率

所以有可能由於報文太大需要分片,導致必須通過設置tcpmss解決。另外IP 報文里是由五元組組成的的,報文要進行分片的,這時就有可能只有第一片報文帶有IP的五元組信息(源目的ip位址,源目的端口號,協議號),后續的分片不再保留 TCP/UDP報文所有的標識信息,如端口號信息等,這時,當網關進行NAT轉換時,將導致報文不能正確組包,

因此可以看出,MTU和TCP MSS是密不可分的,在PPPOE+NAT環境下尤為重要。如果是PPPOE+NAT上網出現網站打開不流暢,就有可能是MTU或MSS設置不當了,至此,對PPPOE+NAT上網環境下MTU和MSS的問題基本搞清楚了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM