MTU MSS 详解记录
生活随笔
收集整理的這篇文章主要介紹了
MTU MSS 详解记录
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
???? ???? 先學(xué)習(xí)理解一下幀的封裝格式:
需要注意的是,區(qū)別兩種幀封裝格式:802標(biāo)準(zhǔn)幀和以太網(wǎng)幀 1,在802標(biāo)準(zhǔn)定義的幀格式中,長度字段是指它后續(xù)數(shù)據(jù)的字節(jié)長度,但不包括C R C檢驗(yàn)碼。RFC 1042(IEEE 802) 2,RFC 894(以太網(wǎng)) 所以,以太網(wǎng)幀報(bào)頭為目的地址6+源地址6+類型2+CRC 4=18bytes 而802幀沒有CRC,所以為14bytes。Sniffer采用的是802幀為14bytes ? ? 轉(zhuǎn)載文章: MTU: Maxitum Transmission Unit 最大傳輸單元
MSS: Maxitum Segment Size 最大分段大小 ? 由于以太網(wǎng)EthernetII最大的數(shù)據(jù)幀是1518Bytes這樣,刨去以太網(wǎng)幀的幀頭(DMAC目的地址MAC48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗(yàn)部分4Bytes(這個(gè)部門有時(shí)候大家也把它叫做FCS),那么剩下承載上層協(xié)議的地方也就是Data域最大就只能有1500Bytes. 這個(gè)值我們就把它稱之為MTU。 ? 以太網(wǎng)的MTU是1500,再減去PPP的包頭包尾的開銷(8Bytes),就變成1492。 ? MSS就是TCP數(shù)據(jù)包每次能夠傳輸?shù)淖畲髷?shù)據(jù)分段。為了達(dá)到最佳的傳輸效能 TCP協(xié)議在建立連接的時(shí)候通常要協(xié)商雙方的MSS值,這個(gè)值TCP協(xié)議在實(shí)現(xiàn)的 時(shí)候往往用MTU值代替(需要減去IP數(shù)據(jù)包包頭的大小20Bytes和TCP數(shù)據(jù)段的 包頭20Bytes)所以往往MSS為1460。通訊雙方會(huì)根據(jù)雙方提供的MSS值得最小 值確定為這次連接的最大MSS值。 ? ? 先說說這MTU最大傳輸單元,這個(gè)最大傳輸單元實(shí)際上和鏈路層協(xié)議有著密切的關(guān)系,讓我們先仔細(xì)回憶一下EthernetII幀的結(jié)構(gòu)DMAC+SMAC+Type+Data+CRC。由于以太網(wǎng)傳輸電氣方面的限制,每個(gè)以太網(wǎng)幀都有最小的大小64bytes,最大不能超過1518bytes,對(duì)于小于或者大于這個(gè)限制的以太網(wǎng)幀我們都可以視之為錯(cuò)誤的數(shù)據(jù)幀,一般的以太網(wǎng)轉(zhuǎn)發(fā)設(shè)備會(huì)丟棄這些數(shù)據(jù)幀。(注:小于64Bytes的數(shù)據(jù)幀一般是由于以太網(wǎng)沖突產(chǎn)生的“碎片”或者線路干擾或者壞的以太網(wǎng)接口產(chǎn)生的,對(duì)于大于1518Bytes的數(shù)據(jù)幀我們一般把它叫做Giant幀,這種一般是由于線路干擾或者壞的以太網(wǎng)口產(chǎn)生) ? 由于以太網(wǎng)EthernetII最大的數(shù)據(jù)幀是1518Bytes這樣,刨去以太網(wǎng)幀的幀頭(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗(yàn)部分4Bytes(這個(gè)部門有時(shí)候大家也把它叫做FCS),那么剩下承載上層協(xié)議的地方也就是Data域最大就只能有1500Bytes這個(gè)值我們就把它稱之為MTU。這個(gè)就是網(wǎng)絡(luò)層協(xié)議非常關(guān)心的地方,因?yàn)榫W(wǎng)絡(luò)層協(xié)議比如IP協(xié)議會(huì)根據(jù)這個(gè)值來決定是否把上層傳下來的數(shù)據(jù)進(jìn)行分片。就好比一個(gè)盒子沒法裝下一大塊面包,我們需要把面包切成片,裝在多個(gè)盒子里面一樣的道理。 ? 當(dāng)兩臺(tái)遠(yuǎn)程PC互聯(lián)的時(shí)候,它們的數(shù)據(jù)需要穿過很多的路由器和各種各樣的網(wǎng)絡(luò)媒介才能到達(dá)對(duì)端,網(wǎng)絡(luò)中不同媒介的MTU各不相同,就好比一長段的水管,由不同粗細(xì)的水管組成(MTU不同 :))通過這段水管最大水量就要由中間最細(xì)的水管決定。 ? 對(duì)于網(wǎng)絡(luò)層的上層協(xié)議而言(我們以TCP/IP協(xié)議族為例)它們對(duì)水管粗細(xì)不在意它們認(rèn)為這個(gè)是網(wǎng)絡(luò)層的事情。網(wǎng)絡(luò)層IP協(xié)議會(huì)檢查每個(gè)從上層協(xié)議下來的數(shù)據(jù)包的大小,并根據(jù)本機(jī)MTU的大小決定是否作“分片”處理。分片最大的壞處就是降低了傳輸性能,本來一次可以搞定的事情,分成多次搞定,所以在網(wǎng)絡(luò)層更高一層(就是傳輸層)的實(shí)現(xiàn)中往往會(huì)對(duì)此加以注意!有些高層因?yàn)槟承┰蚓蜁?huì)要求我這個(gè)面包不能切片,我要完整地面包,所以會(huì)在IP數(shù)據(jù)包包頭里面加上一個(gè)標(biāo)簽:DF(Donot Fragment)。這樣當(dāng)這個(gè)IP數(shù)據(jù)包在一大段網(wǎng)絡(luò)(水管里面)傳輸?shù)臅r(shí)候,如果遇到MTU小于IP數(shù)據(jù)包的情況,轉(zhuǎn)發(fā)設(shè)備就會(huì)根據(jù)要求丟棄這個(gè)數(shù)據(jù)包。然后返回一個(gè)錯(cuò)誤信息給發(fā)送者。這樣往往會(huì)造成某些通訊上的問題,不過幸運(yùn)的是大部分網(wǎng)絡(luò)鏈路都是MTU1500或者大于1500。 ? 對(duì)于UDP協(xié)議而言,這個(gè)協(xié)議本身是無連接的協(xié)議,對(duì)數(shù)據(jù)包的到達(dá)順序以及是否正確到達(dá)不甚關(guān)心,所以一般UDP應(yīng)用對(duì)分片沒有特殊要求。 ? 對(duì)于TCP協(xié)議而言就不一樣了,這個(gè)協(xié)議是面向連接的協(xié)議,對(duì)于TCP協(xié)議而言它非常在意數(shù)據(jù)包的到達(dá)順序以及是否傳輸中有錯(cuò)誤發(fā)生。所以有些TCP應(yīng)用對(duì)分片有要求---不能分片(DF)。 ? 花開兩朵,各表一枝,說完MTU的故事我們該講講今天的第二個(gè)豬腳---PPPoE所謂PPPoE就是在以太網(wǎng)上面跑PPP協(xié)議,有人奇怪了,PPP協(xié)議和Ethernet不都是鏈路層協(xié)議嗎?怎么一個(gè)鏈路層跑到另外一個(gè)鏈路層上面去了,難道升級(jí)成網(wǎng)絡(luò)層協(xié)議了不成。其實(shí)這是個(gè)誤區(qū):就是某層協(xié)議只能承載更上一層協(xié)議。 為什么會(huì)產(chǎn)生這種奇怪的需求呢?這是因?yàn)殡S著寬帶接入(這種寬帶接入一般為Cable Modem或者xDSL或者以太網(wǎng)的接入)由于以太網(wǎng)缺乏認(rèn)證計(jì)費(fèi)機(jī)制而傳統(tǒng)運(yùn)營商是通過PPP協(xié)議來對(duì)撥號(hào)等接入服務(wù)進(jìn)行認(rèn)證計(jì)費(fèi)的,所以就出了這么一個(gè)怪胎:PPPoE。(有關(guān)PPPoE的詳細(xì)介紹參見V大以及本站其他成 員的一些介紹文章,我就不啰里啰唆的了) ? PPPoE帶來了好處,也帶來了一些壞處,比如:二次封裝耗費(fèi)資源,降低了傳輸效能等等,這些壞處俺也不多說了,最大的壞處就是PPPoE導(dǎo)致MTU變小了以太網(wǎng)的MTU是1500,再減去PPP的包頭包尾的開銷(8Bytes),就變成1492。 ? 如果兩臺(tái)主機(jī)之間的某段網(wǎng)絡(luò)使用了PPPoE那么就會(huì)導(dǎo)致某些不能分片的應(yīng)用無法通訊。 ? 這個(gè)時(shí)候就需要我們調(diào)整一下主機(jī)的MTU,通過降低主機(jī)的MTU,這樣我們就能夠順利地進(jìn)行通訊了。 ? 當(dāng)然對(duì)于TCP應(yīng)用而言還有另外的解決方案。馬上請(qǐng)出今天第三位豬腳:MSS。 MSS最大傳輸大小的縮寫,是TCP協(xié)議里面的一個(gè)概念。MSS就是TCP數(shù)據(jù)包每次能夠傳輸?shù)淖畲髷?shù)據(jù)分段。為了達(dá)到最佳的傳輸效能TCP協(xié)議在建立連接的時(shí)候通常要協(xié)商雙方的MSS值,這個(gè)值TCP協(xié)議在實(shí)現(xiàn)的時(shí)候往往用MTU值代替(需要減去IP數(shù)據(jù)包包頭的大小20Bytes和TCP數(shù)據(jù)段的包頭20Bytes)所以往往MSS為1460。通訊雙方會(huì)根據(jù)雙方提供的MSS值得最小值確定為這次連接的最大MSS值。 ? ? 我們回過頭來看前言里面的那個(gè)問題,我們試想一下,如果我們在中間路由器上把每次TCP連接的最大MSS進(jìn)行調(diào)整這樣使得通過PPPoE鏈路的最大MSS值加上數(shù)據(jù)包頭包尾不會(huì)超過PPPoE的MTU大小1492這樣就不會(huì)造成無法通訊的問題。 ? 所以上面的問題可以通過ip tcp adjust-mss 1452來解決。 ? 當(dāng)然問題也可以通過修改PC機(jī)的MTU來解決。 ? [后記] Cisco在IOS 12.2(4)T及以后的版本支持修改MSS大小的特性 ? Cisco的TCP Adjust MSS Feature: ? The TCP MSS Adjustment feature enables the configuration of the maximum segment size (MSS) for transient packets that traverse a router, specifically TCP segments in the SYN bit set, when Point to Point Protocol over Ethernet (PPPoE) is being used in the network. PPPoE truncates the Ethernet maximum transmission unit (MTU) 1492, and if the effective MTU on the hosts (PCs) is not changed, the router in between the host and the server can terminate the TCP sessions. The ip tcp adjust-mss command specifies the MSS value . the intermediate router of the SYN packets to avoid truncation. ? ? ? ? ? ? ? 附:MS文章---路徑最大傳輸單元 (PMTU) 黑洞路由器 當(dāng)路由器必須將 IP 包分段但又因 DF標(biāo)記設(shè)置為 1 而不能分段時(shí),路由器可采用以下任一種方式:
? PMTU 黑洞路由器會(huì)給 TCP連接帶來問題。例如,Microsoft? Windows? XP和 Windows Server?2003中的 TCP/IP協(xié)議默認(rèn)情況下會(huì)使用 PMTU發(fā)現(xiàn)。TCP會(huì)發(fā)送 DF標(biāo)記設(shè)置為 1的數(shù)據(jù)段,并且在需要時(shí),會(huì)根據(jù)符合 RFC 1191定義的“ICMP Destination Unreachable-Fragmentation Needed and DF Set(ICMP Type 3 Code 4)”消息的回執(zhí)(其中包含 IP MTU),更改 TCP MSS 值。 ? 在 TCP 三次握手期間交換的 TCP數(shù)據(jù)段不會(huì)太大,因而不會(huì)被 PMTU 黑洞路由器丟棄。但是,一旦開始在連接上傳輸數(shù)據(jù)—假定基于協(xié)商的 MSS確定的 PMTU 比實(shí)際 PMTU大—TCP 數(shù)據(jù)段的大于實(shí)際 PMTU的 IP 包就會(huì)被直接丟棄。 例如,您可以用 FTP 命令行工具成功地與 FTP服務(wù)器建立連接并登錄。但是,當(dāng)您試圖下載或者上載文件時(shí),中間的 PMTU 黑洞路由器就會(huì)丟棄達(dá)到最大大小的 TCP 數(shù)據(jù)段,從而導(dǎo)致錯(cuò)誤和文件傳輸失敗。 您可以按照下面的語法使用 Ping 工具來檢測 PMTU黑洞路由器: Pingdestination –f –l ICMPEchoPayloadSize
要計(jì)算 ICMPEchoPayloadSize,可用您想發(fā)送的 IP包的大小減去 28。這是因?yàn)?#xff0c;IP報(bào)頭的大小為 20 字節(jié),而 ICMP Echo消息的 ICMP 報(bào)頭的大小為 8字節(jié)。下圖顯示了二者的關(guān)系。 例如,要發(fā)送長度為 1500 字節(jié)的 ICMP Echo消息,您應(yīng)使用以下命令: ping destination –f –l 1472 如果有 IP MTU 更小的中間鏈路,且路由器發(fā)送了“ICMP Destination Unreachable-Fragmentation Needed and DF Set”消息,則 Ping工具會(huì)顯示“Packet needs to be fragmented but DF set”消息。如果有 IP MTU更小的中間鏈路,且 PMTU 黑洞路由器直接丟棄了包,則 Ping工具會(huì)顯示“Request timed out”消息。 要找出包含 PMTU 黑洞路由器的路徑的有效 IP MTU,請(qǐng)使用 Ping工具,同時(shí)不斷增大 Echo 消息的有效負(fù)載的大小。因?yàn)榈湫妥泳W(wǎng)的最小 IP MTU是 576字節(jié),因此開始時(shí)可將 ICMP Echo消息的有效負(fù)載設(shè)置為 548字節(jié),然后每次遞增 100字節(jié),直到找到有效 PMTU。 例如,如果 ping 10.0.0.10 -f -l 972 命令顯示“Reply from 10.0.0.10”,而命令 ping 10.0.0.10 -f -l 973顯示“Request timed out”,則 IP地址為 10.0.0.10 的節(jié)點(diǎn)的有效 PMTU為 1000 字節(jié) (972+28)。 ?
? ? ? ? ? ? ? 網(wǎng)絡(luò)故障舉例:[轉(zhuǎn)自華為3COM全球服務(wù)論壇] ? 現(xiàn)象描述:
組網(wǎng):
? ? PC-AR2831-AR2880-CISCO設(shè)備組成的核心網(wǎng)-SERVER
網(wǎng)絡(luò)運(yùn)行MPLS VPN;AR2880為PE;AR2831為CE,PE、CE間運(yùn)行OSPF,多CE配置;路由器各接口MTU、TCP MSS值采用默認(rèn)設(shè)置
AR2880:Version 3.30, Release 0008
AR2831:Version 3.30, Release 0008
現(xiàn)象1:
? ?? ? AR2880路由器的以太口MTU使用缺省設(shè)置時(shí),使用的OA系統(tǒng)(BS架構(gòu))部分流程無法運(yùn)行,上網(wǎng)發(fā)郵件時(shí)附件無法粘貼;但是在cisco設(shè)備上,同樣的組網(wǎng)沒有發(fā)現(xiàn)問題;
現(xiàn)象2:
? ?? ? 將AR2880路由器的以太口MTU改為512測試,郵件附件可以粘貼,但OA主頁打開后無內(nèi)容,刷新不了;將AR2880路由器的以太口MTU改為1200測試,郵件附件可以粘貼,OA主頁可以正常顯示,但是點(diǎn)擊OA系統(tǒng)的"起草公文"無頁面彈出,正常狀況下應(yīng)彈出新建公文頁面;
告警信息:
無??
原因分析:
原因分析:
可能是應(yīng)用軟件問題;可能是MTU、TCP MSS值協(xié)商配置問題;
具體分析:
1、接口MTU、TCP MSS采用缺省值1500時(shí),無法貼附件;
這是因?yàn)閼?yīng)用了三層MPLS VPN技術(shù),增加了8bit的標(biāo)簽,MTU值協(xié)商出現(xiàn)問題。
AR28XX路由器默認(rèn)在接口上自動(dòng)分片,所以在普通的應(yīng)用中采用默認(rèn)值不會(huì)影響業(yè)務(wù)。但路由器接口上收到一個(gè)報(bào)文長度大于本接口MTU值的報(bào)文,如果該報(bào)文被強(qiáng)制打上不分片的標(biāo)記,將丟棄報(bào)文,并返回一個(gè)ICMP差錯(cuò)報(bào)文(type 3,code 4),通知報(bào)文發(fā)起者丟棄原因。報(bào)文發(fā)起者將發(fā)送比較小的報(bào)文。通過多次上述報(bào)文協(xié)商,將得到對(duì)于某一個(gè)固定路徑上的最小Mtu值,這個(gè)過程叫做Mtu Discovery,通過MTU Discovery來確定報(bào)文路徑上最小可通過的MTU;如果兩個(gè)設(shè)備相連,沒有MTU Discovery功能并且MTU值不一致,將可能導(dǎo)致丟棄報(bào)文。只有把雙方設(shè)備的Mtu為對(duì)端設(shè)備MRU的最小值,才能正常通信。由于某些組網(wǎng)考慮到網(wǎng)絡(luò)安全問題和性能,往往會(huì)把ICMP報(bào)文過濾掉,引起Mtu Discovery不能正常運(yùn)行;應(yīng)用軟件由于程序算法問題或根本沒有相應(yīng)協(xié)商功能,也會(huì)導(dǎo)致了部分應(yīng)用異常。
2、更改接口MTU值以后,仍然有部分業(yè)務(wù)不正常;
這是因?yàn)?/span>TCP MSS值協(xié)商的問題。
?MSS值的計(jì)算方法是:MSS=MTU-IP-TCP(如果有其他pppoe、加密報(bào)文頭的話也同樣減去),也就是說MSS值其實(shí)就是TCP所承載的凈載荷的長度。由于AR28XX接口缺省的MTU是1500字節(jié),故一般要求加密報(bào)文頭+鏈路層開銷+IP頭(20-60字節(jié))+TCP報(bào)文(20字節(jié))小于1500字節(jié),即TCP分片配置1200左右比較適合。缺省情況下,TCP報(bào)文不分片。因此TCP MSS不匹配也會(huì)引起部分應(yīng)用異常。
處理過程:
? ?? ?本例中通過修改路由器接口MTU、TCP MSS值,解決問題。
? ???具體報(bào)文mtu、tcp mss大小要根據(jù)具體應(yīng)用,按經(jīng)驗(yàn)值進(jìn)行嘗試,選擇最佳值;其中MTU值的選擇可以通過ping命令設(shè)置不分片來進(jìn)行測試;TCP MSS值的選擇則可以通過MTU減去相應(yīng)其它加密、鏈路層開銷、IP頭、TCP頭等字節(jié)計(jì)算。
? ???具體過程如下:
? ???1、本例中使用cisco路由器時(shí)相關(guān)應(yīng)用正常。初步估計(jì)是mtu值問題,但是對(duì)普通應(yīng)用AR28系列路由器會(huì)自動(dòng)分片,不會(huì)影響業(yè)務(wù)。測試發(fā)現(xiàn)在client上ping大包的時(shí)候,如果不設(shè)置不允許分片,業(yè)務(wù)正常。看來客戶應(yīng)用中做了不允許分片的設(shè)置或其它原因mtu協(xié)商錯(cuò)誤。更改路由器接口mtu為1500-8=1492以后,業(yè)務(wù)正常。
? ???2、更改接口mtu以后,其它部分業(yè)務(wù)還不正常。分析原因是tcp mss值的問題。減小tcp mss值8字節(jié)1460-8=1452,但是還有部分業(yè)務(wù)不正常。詢問軟件集成商,得到答復(fù)部分軟件中使用了加密技術(shù)。而且不同的應(yīng)用加密強(qiáng)度不同。
? ???3、逐步調(diào)整路由器接口的tcp mss值,減到到1200以后,所有業(yè)務(wù)測試通過。
命令說明:
? ???1、mtu命令用來設(shè)置以太網(wǎng)接口的MTU(最大傳輸單元),undo mtu命令用來恢復(fù)MTU的缺省值。缺省的MTU為1500。使用mtu命令改變接口最大傳輸單元MTU后,需要先對(duì)接口執(zhí)行shutdown命令,再執(zhí)行undo shutdown命令將接口重啟,以保證設(shè)置的MTU生效。
? ???2、tcp mss命令用來配置TCP報(bào)文分片,undo tcp mss命令用來取消TCP報(bào)文分片。 ? ? ? ? ? ? ? 個(gè)人總結(jié): ? ? MTU=MSS+IP header+TCP header+鏈路層開銷+加密報(bào)文頭(某些程序加密強(qiáng)度不一樣) ? MTU,對(duì)UDP和TCP報(bào)文都檢測,當(dāng)超過時(shí),如果報(bào)文DF=0,就進(jìn)行分段,如果DF=1,就丟棄,同時(shí)返回RFC 792定義的ICMP Type3 Code 4(ICMP Destination Unreachable-Fragmentation Needed and DF Set)或 RFC 1191定義的ICMP包(包含轉(zhuǎn)發(fā)失敗鏈路的MTU),主機(jī)收到后會(huì)調(diào)節(jié)MSS以適應(yīng),后續(xù)包不會(huì)分片就可進(jìn)行傳輸。如果兩端之間某Router配置了ACL ,deny掉所有的ICMP,那就無法收到咯。 ? MSS其實(shí)就是TCP報(bào)文payload大小。一般的應(yīng)用軟件,當(dāng)客戶端和服務(wù)器端在建立TCP連接的時(shí)候需要根據(jù)實(shí)際傳輸?shù)膱?bào)文大小來協(xié)商TCP的窗口大小MSS。Tcp連接成功后會(huì)進(jìn)行兩次滑動(dòng)窗口的協(xié)商,一次是pc與server,一次是與網(wǎng)關(guān),然后在兩次協(xié)商里選擇一個(gè)較小的值作為窗口來發(fā)送報(bào)文。 ? 當(dāng)協(xié)商出來的MSS比較大時(shí),加上IP header+TCP header+鏈路層開銷+加密報(bào)文頭后,就有可能大于MTU,當(dāng)DF=1時(shí),就會(huì)丟棄掉。 ? 正如????所說:“對(duì)于UDP協(xié)議而言,這個(gè)協(xié)議本身是無連接的協(xié)議,對(duì)數(shù)據(jù)包的到達(dá)順序以及是否正確到達(dá)不甚關(guān)心,所以一般UDP應(yīng)用對(duì)分片沒有特殊要求。”所以在路由器上進(jìn)行ip tcp mss命令只對(duì)tcp packet檢測就夠了。 ? 再提供一個(gè)案例:MSN是使用https方式登陸的,有時(shí)會(huì)有突發(fā)大報(bào)文,而且DF位是設(shè)置為1的。雖然目前大部分出現(xiàn)的故障現(xiàn)象都是:不能發(fā)送附件;不能打開網(wǎng)頁等。都是在PPPoE中發(fā)生的。但就算源和目的網(wǎng)絡(luò)的MTU都是1500,但是由于中間經(jīng)過的節(jié)點(diǎn)鏈路可能存在不同,可能少于1500。或者在傳輸過程中的某個(gè)路由器設(shè)置了較小的MTU。而往往配置路由器或交換機(jī)時(shí),習(xí)慣禁止了所有的ICMP信息,這樣的話那路由器就無法返回ICMP 3/4的包給源主機(jī)了。 RFC 2923(TCP Problems with Path MTU Discovery)。 ? 所以,有時(shí)候出現(xiàn)的故障,不止要調(diào)試MTU值,還要調(diào)試MSS值,才能使所有應(yīng)用正常 其實(shí)碰到此問題時(shí),最好是借助Sniffer抓包分析(不過奇怪,銳捷NBR1000無法抓到ICMP Type 3 Code 4的包,所以無法抓包提供分析圖,好可惜!是路由器不支持還是其他原因,以后有機(jī)會(huì)考證) ? 附:Sniffer抓包協(xié)助理解分片過程以及DF ? ? 上圖是:Ping –l 2000 [url]www.163.com[/url] 首先看IP header,More fragments位為1,向?qū)Ψ酵ǜ娲藬?shù)據(jù)包為多幀發(fā)送(分段),total lengt=1300bytes(1280bytes+IP報(bào)頭20bytes)。再看ICMP處,可以看到分了兩個(gè)包,大小分別為1280bytes和728bytes,2008 bytes of reassembled data指明重組后的數(shù)據(jù)為2008bytes(icmp包頭8bytes,數(shù)據(jù)2000bytes)。然后看DLC部分,指明了以太類型0800(IP),幀大小為1314bytes(ICMP的1280bytes+IP報(bào)頭20bytes+幀14bytes) ? 再接著看下一個(gè)幀。首先看到DLC部分寫著了幀大小為762bytes,IP部分,continuation of frame 17 ,第17個(gè)幀的后續(xù)。Fragment offset 分段偏移量為1280bytes(第一個(gè)包的大小)。至此,第一個(gè)icmp echo包全部發(fā)送完畢。 ? ping –f –l 1200 [url]www.163.com[/url] -f命令:將數(shù)據(jù)報(bào)DF(don’t fragment)位設(shè)置為1(不能分段)
需要注意的是,區(qū)別兩種幀封裝格式:802標(biāo)準(zhǔn)幀和以太網(wǎng)幀 1,在802標(biāo)準(zhǔn)定義的幀格式中,長度字段是指它后續(xù)數(shù)據(jù)的字節(jié)長度,但不包括C R C檢驗(yàn)碼。RFC 1042(IEEE 802) 2,RFC 894(以太網(wǎng)) 所以,以太網(wǎng)幀報(bào)頭為目的地址6+源地址6+類型2+CRC 4=18bytes 而802幀沒有CRC,所以為14bytes。Sniffer采用的是802幀為14bytes ? ? 轉(zhuǎn)載文章: MTU: Maxitum Transmission Unit 最大傳輸單元
MSS: Maxitum Segment Size 最大分段大小 ? 由于以太網(wǎng)EthernetII最大的數(shù)據(jù)幀是1518Bytes這樣,刨去以太網(wǎng)幀的幀頭(DMAC目的地址MAC48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗(yàn)部分4Bytes(這個(gè)部門有時(shí)候大家也把它叫做FCS),那么剩下承載上層協(xié)議的地方也就是Data域最大就只能有1500Bytes. 這個(gè)值我們就把它稱之為MTU。 ? 以太網(wǎng)的MTU是1500,再減去PPP的包頭包尾的開銷(8Bytes),就變成1492。 ? MSS就是TCP數(shù)據(jù)包每次能夠傳輸?shù)淖畲髷?shù)據(jù)分段。為了達(dá)到最佳的傳輸效能 TCP協(xié)議在建立連接的時(shí)候通常要協(xié)商雙方的MSS值,這個(gè)值TCP協(xié)議在實(shí)現(xiàn)的 時(shí)候往往用MTU值代替(需要減去IP數(shù)據(jù)包包頭的大小20Bytes和TCP數(shù)據(jù)段的 包頭20Bytes)所以往往MSS為1460。通訊雙方會(huì)根據(jù)雙方提供的MSS值得最小 值確定為這次連接的最大MSS值。 ? ? 先說說這MTU最大傳輸單元,這個(gè)最大傳輸單元實(shí)際上和鏈路層協(xié)議有著密切的關(guān)系,讓我們先仔細(xì)回憶一下EthernetII幀的結(jié)構(gòu)DMAC+SMAC+Type+Data+CRC。由于以太網(wǎng)傳輸電氣方面的限制,每個(gè)以太網(wǎng)幀都有最小的大小64bytes,最大不能超過1518bytes,對(duì)于小于或者大于這個(gè)限制的以太網(wǎng)幀我們都可以視之為錯(cuò)誤的數(shù)據(jù)幀,一般的以太網(wǎng)轉(zhuǎn)發(fā)設(shè)備會(huì)丟棄這些數(shù)據(jù)幀。(注:小于64Bytes的數(shù)據(jù)幀一般是由于以太網(wǎng)沖突產(chǎn)生的“碎片”或者線路干擾或者壞的以太網(wǎng)接口產(chǎn)生的,對(duì)于大于1518Bytes的數(shù)據(jù)幀我們一般把它叫做Giant幀,這種一般是由于線路干擾或者壞的以太網(wǎng)口產(chǎn)生) ? 由于以太網(wǎng)EthernetII最大的數(shù)據(jù)幀是1518Bytes這樣,刨去以太網(wǎng)幀的幀頭(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗(yàn)部分4Bytes(這個(gè)部門有時(shí)候大家也把它叫做FCS),那么剩下承載上層協(xié)議的地方也就是Data域最大就只能有1500Bytes這個(gè)值我們就把它稱之為MTU。這個(gè)就是網(wǎng)絡(luò)層協(xié)議非常關(guān)心的地方,因?yàn)榫W(wǎng)絡(luò)層協(xié)議比如IP協(xié)議會(huì)根據(jù)這個(gè)值來決定是否把上層傳下來的數(shù)據(jù)進(jìn)行分片。就好比一個(gè)盒子沒法裝下一大塊面包,我們需要把面包切成片,裝在多個(gè)盒子里面一樣的道理。 ? 當(dāng)兩臺(tái)遠(yuǎn)程PC互聯(lián)的時(shí)候,它們的數(shù)據(jù)需要穿過很多的路由器和各種各樣的網(wǎng)絡(luò)媒介才能到達(dá)對(duì)端,網(wǎng)絡(luò)中不同媒介的MTU各不相同,就好比一長段的水管,由不同粗細(xì)的水管組成(MTU不同 :))通過這段水管最大水量就要由中間最細(xì)的水管決定。 ? 對(duì)于網(wǎng)絡(luò)層的上層協(xié)議而言(我們以TCP/IP協(xié)議族為例)它們對(duì)水管粗細(xì)不在意它們認(rèn)為這個(gè)是網(wǎng)絡(luò)層的事情。網(wǎng)絡(luò)層IP協(xié)議會(huì)檢查每個(gè)從上層協(xié)議下來的數(shù)據(jù)包的大小,并根據(jù)本機(jī)MTU的大小決定是否作“分片”處理。分片最大的壞處就是降低了傳輸性能,本來一次可以搞定的事情,分成多次搞定,所以在網(wǎng)絡(luò)層更高一層(就是傳輸層)的實(shí)現(xiàn)中往往會(huì)對(duì)此加以注意!有些高層因?yàn)槟承┰蚓蜁?huì)要求我這個(gè)面包不能切片,我要完整地面包,所以會(huì)在IP數(shù)據(jù)包包頭里面加上一個(gè)標(biāo)簽:DF(Donot Fragment)。這樣當(dāng)這個(gè)IP數(shù)據(jù)包在一大段網(wǎng)絡(luò)(水管里面)傳輸?shù)臅r(shí)候,如果遇到MTU小于IP數(shù)據(jù)包的情況,轉(zhuǎn)發(fā)設(shè)備就會(huì)根據(jù)要求丟棄這個(gè)數(shù)據(jù)包。然后返回一個(gè)錯(cuò)誤信息給發(fā)送者。這樣往往會(huì)造成某些通訊上的問題,不過幸運(yùn)的是大部分網(wǎng)絡(luò)鏈路都是MTU1500或者大于1500。 ? 對(duì)于UDP協(xié)議而言,這個(gè)協(xié)議本身是無連接的協(xié)議,對(duì)數(shù)據(jù)包的到達(dá)順序以及是否正確到達(dá)不甚關(guān)心,所以一般UDP應(yīng)用對(duì)分片沒有特殊要求。 ? 對(duì)于TCP協(xié)議而言就不一樣了,這個(gè)協(xié)議是面向連接的協(xié)議,對(duì)于TCP協(xié)議而言它非常在意數(shù)據(jù)包的到達(dá)順序以及是否傳輸中有錯(cuò)誤發(fā)生。所以有些TCP應(yīng)用對(duì)分片有要求---不能分片(DF)。 ? 花開兩朵,各表一枝,說完MTU的故事我們該講講今天的第二個(gè)豬腳---PPPoE所謂PPPoE就是在以太網(wǎng)上面跑PPP協(xié)議,有人奇怪了,PPP協(xié)議和Ethernet不都是鏈路層協(xié)議嗎?怎么一個(gè)鏈路層跑到另外一個(gè)鏈路層上面去了,難道升級(jí)成網(wǎng)絡(luò)層協(xié)議了不成。其實(shí)這是個(gè)誤區(qū):就是某層協(xié)議只能承載更上一層協(xié)議。 為什么會(huì)產(chǎn)生這種奇怪的需求呢?這是因?yàn)殡S著寬帶接入(這種寬帶接入一般為Cable Modem或者xDSL或者以太網(wǎng)的接入)由于以太網(wǎng)缺乏認(rèn)證計(jì)費(fèi)機(jī)制而傳統(tǒng)運(yùn)營商是通過PPP協(xié)議來對(duì)撥號(hào)等接入服務(wù)進(jìn)行認(rèn)證計(jì)費(fèi)的,所以就出了這么一個(gè)怪胎:PPPoE。(有關(guān)PPPoE的詳細(xì)介紹參見V大以及本站其他成 員的一些介紹文章,我就不啰里啰唆的了) ? PPPoE帶來了好處,也帶來了一些壞處,比如:二次封裝耗費(fèi)資源,降低了傳輸效能等等,這些壞處俺也不多說了,最大的壞處就是PPPoE導(dǎo)致MTU變小了以太網(wǎng)的MTU是1500,再減去PPP的包頭包尾的開銷(8Bytes),就變成1492。 ? 如果兩臺(tái)主機(jī)之間的某段網(wǎng)絡(luò)使用了PPPoE那么就會(huì)導(dǎo)致某些不能分片的應(yīng)用無法通訊。 ? 這個(gè)時(shí)候就需要我們調(diào)整一下主機(jī)的MTU,通過降低主機(jī)的MTU,這樣我們就能夠順利地進(jìn)行通訊了。 ? 當(dāng)然對(duì)于TCP應(yīng)用而言還有另外的解決方案。馬上請(qǐng)出今天第三位豬腳:MSS。 MSS最大傳輸大小的縮寫,是TCP協(xié)議里面的一個(gè)概念。MSS就是TCP數(shù)據(jù)包每次能夠傳輸?shù)淖畲髷?shù)據(jù)分段。為了達(dá)到最佳的傳輸效能TCP協(xié)議在建立連接的時(shí)候通常要協(xié)商雙方的MSS值,這個(gè)值TCP協(xié)議在實(shí)現(xiàn)的時(shí)候往往用MTU值代替(需要減去IP數(shù)據(jù)包包頭的大小20Bytes和TCP數(shù)據(jù)段的包頭20Bytes)所以往往MSS為1460。通訊雙方會(huì)根據(jù)雙方提供的MSS值得最小值確定為這次連接的最大MSS值。 ? ? 我們回過頭來看前言里面的那個(gè)問題,我們試想一下,如果我們在中間路由器上把每次TCP連接的最大MSS進(jìn)行調(diào)整這樣使得通過PPPoE鏈路的最大MSS值加上數(shù)據(jù)包頭包尾不會(huì)超過PPPoE的MTU大小1492這樣就不會(huì)造成無法通訊的問題。 ? 所以上面的問題可以通過ip tcp adjust-mss 1452來解決。 ? 當(dāng)然問題也可以通過修改PC機(jī)的MTU來解決。 ? [后記] Cisco在IOS 12.2(4)T及以后的版本支持修改MSS大小的特性 ? Cisco的TCP Adjust MSS Feature: ? The TCP MSS Adjustment feature enables the configuration of the maximum segment size (MSS) for transient packets that traverse a router, specifically TCP segments in the SYN bit set, when Point to Point Protocol over Ethernet (PPPoE) is being used in the network. PPPoE truncates the Ethernet maximum transmission unit (MTU) 1492, and if the effective MTU on the hosts (PCs) is not changed, the router in between the host and the server can terminate the TCP sessions. The ip tcp adjust-mss command specifies the MSS value . the intermediate router of the SYN packets to avoid truncation. ? ? ? ? ? ? ? 附:MS文章---路徑最大傳輸單元 (PMTU) 黑洞路由器 當(dāng)路由器必須將 IP 包分段但又因 DF標(biāo)記設(shè)置為 1 而不能分段時(shí),路由器可采用以下任一種方式:
| ? | 發(fā)送符合 RFC 792 中最初定義的“ICMP Destination Unreachable-Fragmentation Needed and DF Set”消息,然后丟棄該包。 原始消息格式中不包含有關(guān)轉(zhuǎn)發(fā)失敗的鏈路的 IP MTU 的信息。 |
| ? | 發(fā)送符合 RFC 1191 中重新定義的“ICMP Destination Unreachable-Fragmentation Needed and DF Set”消息,然后丟棄該包。此新消息格式包含一個(gè) MTU字段,可指出轉(zhuǎn)發(fā)失敗的鏈路的 IP MTU。 RFC 1191 定義了路徑 MTU (PMTU)發(fā)現(xiàn),它使得成對(duì)的 TCP 對(duì)等方能夠動(dòng)態(tài)地發(fā)現(xiàn)二者之間路徑的 IP MTU,從而發(fā)現(xiàn)該路徑的 TCP MSS。一旦收到符合 RFC 1191定義的“Destination Unreachable-Fragmentation Needed and DF Set”消息,TCP就會(huì)將該連接的 MSS 調(diào)整為指定 IP MTU減去 TCP 和 IP報(bào)頭的大小。這樣,在該 TCP 連接上發(fā)送的后續(xù)包就不會(huì)超過最大大小,無需分段即可在該路徑上傳輸。 |
| ? | 直接丟棄包。 直接丟棄需分段但 DF 標(biāo)記設(shè)置為 1的包的路由器稱為 PMTU 黑洞路由器。 |
| ? | 此處的 destination 可以是一個(gè) IP地址,也可以是一個(gè)可解析為 IP 地址的名稱。 |
| ? | -f 選項(xiàng)可將 DF標(biāo)記設(shè)置為 1。 |
| ? | -l 選項(xiàng)指定 ICMP Echo消息的有效負(fù)載的大小。 |
| ? | ICMPEchoPayloadSize 是 ICMP Echo消息的有效負(fù)載的字節(jié)數(shù)。 |
PMTU 黑洞路由器的解決方案和工作方法
1. 配置中間路由器以支持路由器端 PMTU發(fā)現(xiàn)
解決專用 Intranet 中的 PMTU黑洞路由器問題的最簡單的方法,是將您的所有路由器配置為支持路由器端 RFC 1191,并支持發(fā)送 ICMP Destination Unreachable-Fragmentation Needed and DF Set消息(其中帶有轉(zhuǎn)發(fā)失敗的鏈路的 IP MTU)。這與將路由器配置為支持主機(jī)端 RFC 1191是有區(qū)別的,后者的路由器會(huì)對(duì)自己的 TCP 連接使用 PMTU發(fā)現(xiàn)。 在 Internet 上進(jìn)行通信時(shí),通常不太可能將 Internet路由器配置為支持路由器端 PMTU 發(fā)現(xiàn)。在這種情況下,您可以使用以下各節(jié)介紹的工作方法。 3. 確定最佳 IP MTU并通過 MTU 注冊表設(shè)置來設(shè)置該值 啟用 PMTU 黑洞路由器檢測的替代方法,是根據(jù)本文前面部分的介紹使用 Ping工具確定所有相關(guān)路徑的 PMTU 值,然后使用注冊表設(shè)置手動(dòng)配置發(fā)送接口的 IP MTU。 該方法通過不停發(fā)送 DF 標(biāo)記設(shè)置為 1,大小又不會(huì)導(dǎo)致 PMTU黑洞路由器將其直接丟棄的 IP 包來避開 PMTU黑洞路由器。手動(dòng)指定 IP MTU 意味著所有通信量(包括本地子網(wǎng)通信量和不包含 PMTU黑洞路由器的路徑上的通信量)都將使用較小的 IP MTU。 確定有效的 PMTU 后,您可以通過以下步驟手動(dòng)指定 TCP/IP接口的 IP MTU:| 1. | 打開 Network Connections 文件夾,記下 LAN連接的名稱,如“Local Area Connection”。 |
| 2. | 單擊開始,單擊“運(yùn)行”,鍵入“regedit.exe”,然后單擊“確定”。 |
| 3. | 使用注冊表編輯器工具的樹圖(左邊窗格)打開如下鍵:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control \Network\{4D36E972-E325-11CE-BFC1-08002BE10318} |
| 4. | 此鍵下面是與已安裝的 LAN 連接相關(guān)聯(lián)的全局唯一標(biāo)識(shí)符 (GUID)的一個(gè)或多個(gè)鍵。這些 GUID 鍵中的每一個(gè)都有一個(gè) Connection子鍵。打開每個(gè) GUID\Connection 鍵,尋找值與第一步中記下的 LAN連接的名稱匹配的 Name 設(shè)置。 |
| 5. | 如果找到包含與 LAN 連接匹配的 Name設(shè)置的 GUID\Connection 鍵,請(qǐng)寫下或記下該 GUID值。 |
| 6. | 使用注冊表編輯器的樹視圖打開如下鍵:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip \Parameters\Interfaces\GUID |
| 7. | 右鍵單擊樹視圖中的“GUID”鍵,指向“新建”,然后單擊“雙字節(jié)值”。 |
| 8. | 在注冊表編輯器工具的內(nèi)容窗格(右窗格)中,為新注冊表設(shè)置的值鍵入 MTU,然后按 ENTER。 |
| 9. | 在內(nèi)容窗格中,雙擊新的 MTU 設(shè)置,并在“編輯雙字節(jié)值”對(duì)話框中選擇“十進(jìn)制”,然后在“數(shù)值數(shù)據(jù)”中鍵入有效 MTU 值。 |
| 10. | 單擊“確定”。關(guān)閉注冊表編輯器工具。 |
| 11. | 重新啟動(dòng)計(jì)算機(jī)使 MTU 設(shè)置生效。 |
組網(wǎng):
? ? PC-AR2831-AR2880-CISCO設(shè)備組成的核心網(wǎng)-SERVER
網(wǎng)絡(luò)運(yùn)行MPLS VPN;AR2880為PE;AR2831為CE,PE、CE間運(yùn)行OSPF,多CE配置;路由器各接口MTU、TCP MSS值采用默認(rèn)設(shè)置
AR2880:Version 3.30, Release 0008
AR2831:Version 3.30, Release 0008
現(xiàn)象1:
? ?? ? AR2880路由器的以太口MTU使用缺省設(shè)置時(shí),使用的OA系統(tǒng)(BS架構(gòu))部分流程無法運(yùn)行,上網(wǎng)發(fā)郵件時(shí)附件無法粘貼;但是在cisco設(shè)備上,同樣的組網(wǎng)沒有發(fā)現(xiàn)問題;
現(xiàn)象2:
? ?? ? 將AR2880路由器的以太口MTU改為512測試,郵件附件可以粘貼,但OA主頁打開后無內(nèi)容,刷新不了;將AR2880路由器的以太口MTU改為1200測試,郵件附件可以粘貼,OA主頁可以正常顯示,但是點(diǎn)擊OA系統(tǒng)的"起草公文"無頁面彈出,正常狀況下應(yīng)彈出新建公文頁面;
告警信息:
無??
原因分析:
原因分析:
可能是應(yīng)用軟件問題;可能是MTU、TCP MSS值協(xié)商配置問題;
具體分析:
1、接口MTU、TCP MSS采用缺省值1500時(shí),無法貼附件;
這是因?yàn)閼?yīng)用了三層MPLS VPN技術(shù),增加了8bit的標(biāo)簽,MTU值協(xié)商出現(xiàn)問題。
AR28XX路由器默認(rèn)在接口上自動(dòng)分片,所以在普通的應(yīng)用中采用默認(rèn)值不會(huì)影響業(yè)務(wù)。但路由器接口上收到一個(gè)報(bào)文長度大于本接口MTU值的報(bào)文,如果該報(bào)文被強(qiáng)制打上不分片的標(biāo)記,將丟棄報(bào)文,并返回一個(gè)ICMP差錯(cuò)報(bào)文(type 3,code 4),通知報(bào)文發(fā)起者丟棄原因。報(bào)文發(fā)起者將發(fā)送比較小的報(bào)文。通過多次上述報(bào)文協(xié)商,將得到對(duì)于某一個(gè)固定路徑上的最小Mtu值,這個(gè)過程叫做Mtu Discovery,通過MTU Discovery來確定報(bào)文路徑上最小可通過的MTU;如果兩個(gè)設(shè)備相連,沒有MTU Discovery功能并且MTU值不一致,將可能導(dǎo)致丟棄報(bào)文。只有把雙方設(shè)備的Mtu為對(duì)端設(shè)備MRU的最小值,才能正常通信。由于某些組網(wǎng)考慮到網(wǎng)絡(luò)安全問題和性能,往往會(huì)把ICMP報(bào)文過濾掉,引起Mtu Discovery不能正常運(yùn)行;應(yīng)用軟件由于程序算法問題或根本沒有相應(yīng)協(xié)商功能,也會(huì)導(dǎo)致了部分應(yīng)用異常。
2、更改接口MTU值以后,仍然有部分業(yè)務(wù)不正常;
這是因?yàn)?/span>TCP MSS值協(xié)商的問題。
?MSS值的計(jì)算方法是:MSS=MTU-IP-TCP(如果有其他pppoe、加密報(bào)文頭的話也同樣減去),也就是說MSS值其實(shí)就是TCP所承載的凈載荷的長度。由于AR28XX接口缺省的MTU是1500字節(jié),故一般要求加密報(bào)文頭+鏈路層開銷+IP頭(20-60字節(jié))+TCP報(bào)文(20字節(jié))小于1500字節(jié),即TCP分片配置1200左右比較適合。缺省情況下,TCP報(bào)文不分片。因此TCP MSS不匹配也會(huì)引起部分應(yīng)用異常。
處理過程:
? ?? ?本例中通過修改路由器接口MTU、TCP MSS值,解決問題。
? ???具體報(bào)文mtu、tcp mss大小要根據(jù)具體應(yīng)用,按經(jīng)驗(yàn)值進(jìn)行嘗試,選擇最佳值;其中MTU值的選擇可以通過ping命令設(shè)置不分片來進(jìn)行測試;TCP MSS值的選擇則可以通過MTU減去相應(yīng)其它加密、鏈路層開銷、IP頭、TCP頭等字節(jié)計(jì)算。
? ???具體過程如下:
? ???1、本例中使用cisco路由器時(shí)相關(guān)應(yīng)用正常。初步估計(jì)是mtu值問題,但是對(duì)普通應(yīng)用AR28系列路由器會(huì)自動(dòng)分片,不會(huì)影響業(yè)務(wù)。測試發(fā)現(xiàn)在client上ping大包的時(shí)候,如果不設(shè)置不允許分片,業(yè)務(wù)正常。看來客戶應(yīng)用中做了不允許分片的設(shè)置或其它原因mtu協(xié)商錯(cuò)誤。更改路由器接口mtu為1500-8=1492以后,業(yè)務(wù)正常。
? ???2、更改接口mtu以后,其它部分業(yè)務(wù)還不正常。分析原因是tcp mss值的問題。減小tcp mss值8字節(jié)1460-8=1452,但是還有部分業(yè)務(wù)不正常。詢問軟件集成商,得到答復(fù)部分軟件中使用了加密技術(shù)。而且不同的應(yīng)用加密強(qiáng)度不同。
? ???3、逐步調(diào)整路由器接口的tcp mss值,減到到1200以后,所有業(yè)務(wù)測試通過。
命令說明:
? ???1、mtu命令用來設(shè)置以太網(wǎng)接口的MTU(最大傳輸單元),undo mtu命令用來恢復(fù)MTU的缺省值。缺省的MTU為1500。使用mtu命令改變接口最大傳輸單元MTU后,需要先對(duì)接口執(zhí)行shutdown命令,再執(zhí)行undo shutdown命令將接口重啟,以保證設(shè)置的MTU生效。
? ???2、tcp mss命令用來配置TCP報(bào)文分片,undo tcp mss命令用來取消TCP報(bào)文分片。 ? ? ? ? ? ? ? 個(gè)人總結(jié): ? ? MTU=MSS+IP header+TCP header+鏈路層開銷+加密報(bào)文頭(某些程序加密強(qiáng)度不一樣) ? MTU,對(duì)UDP和TCP報(bào)文都檢測,當(dāng)超過時(shí),如果報(bào)文DF=0,就進(jìn)行分段,如果DF=1,就丟棄,同時(shí)返回RFC 792定義的ICMP Type3 Code 4(ICMP Destination Unreachable-Fragmentation Needed and DF Set)或 RFC 1191定義的ICMP包(包含轉(zhuǎn)發(fā)失敗鏈路的MTU),主機(jī)收到后會(huì)調(diào)節(jié)MSS以適應(yīng),后續(xù)包不會(huì)分片就可進(jìn)行傳輸。如果兩端之間某Router配置了ACL ,deny掉所有的ICMP,那就無法收到咯。 ? MSS其實(shí)就是TCP報(bào)文payload大小。一般的應(yīng)用軟件,當(dāng)客戶端和服務(wù)器端在建立TCP連接的時(shí)候需要根據(jù)實(shí)際傳輸?shù)膱?bào)文大小來協(xié)商TCP的窗口大小MSS。Tcp連接成功后會(huì)進(jìn)行兩次滑動(dòng)窗口的協(xié)商,一次是pc與server,一次是與網(wǎng)關(guān),然后在兩次協(xié)商里選擇一個(gè)較小的值作為窗口來發(fā)送報(bào)文。 ? 當(dāng)協(xié)商出來的MSS比較大時(shí),加上IP header+TCP header+鏈路層開銷+加密報(bào)文頭后,就有可能大于MTU,當(dāng)DF=1時(shí),就會(huì)丟棄掉。 ? 正如????所說:“對(duì)于UDP協(xié)議而言,這個(gè)協(xié)議本身是無連接的協(xié)議,對(duì)數(shù)據(jù)包的到達(dá)順序以及是否正確到達(dá)不甚關(guān)心,所以一般UDP應(yīng)用對(duì)分片沒有特殊要求。”所以在路由器上進(jìn)行ip tcp mss命令只對(duì)tcp packet檢測就夠了。 ? 再提供一個(gè)案例:MSN是使用https方式登陸的,有時(shí)會(huì)有突發(fā)大報(bào)文,而且DF位是設(shè)置為1的。雖然目前大部分出現(xiàn)的故障現(xiàn)象都是:不能發(fā)送附件;不能打開網(wǎng)頁等。都是在PPPoE中發(fā)生的。但就算源和目的網(wǎng)絡(luò)的MTU都是1500,但是由于中間經(jīng)過的節(jié)點(diǎn)鏈路可能存在不同,可能少于1500。或者在傳輸過程中的某個(gè)路由器設(shè)置了較小的MTU。而往往配置路由器或交換機(jī)時(shí),習(xí)慣禁止了所有的ICMP信息,這樣的話那路由器就無法返回ICMP 3/4的包給源主機(jī)了。 RFC 2923(TCP Problems with Path MTU Discovery)。 ? 所以,有時(shí)候出現(xiàn)的故障,不止要調(diào)試MTU值,還要調(diào)試MSS值,才能使所有應(yīng)用正常 其實(shí)碰到此問題時(shí),最好是借助Sniffer抓包分析(不過奇怪,銳捷NBR1000無法抓到ICMP Type 3 Code 4的包,所以無法抓包提供分析圖,好可惜!是路由器不支持還是其他原因,以后有機(jī)會(huì)考證) ? 附:Sniffer抓包協(xié)助理解分片過程以及DF ? ? 上圖是:Ping –l 2000 [url]www.163.com[/url] 首先看IP header,More fragments位為1,向?qū)Ψ酵ǜ娲藬?shù)據(jù)包為多幀發(fā)送(分段),total lengt=1300bytes(1280bytes+IP報(bào)頭20bytes)。再看ICMP處,可以看到分了兩個(gè)包,大小分別為1280bytes和728bytes,2008 bytes of reassembled data指明重組后的數(shù)據(jù)為2008bytes(icmp包頭8bytes,數(shù)據(jù)2000bytes)。然后看DLC部分,指明了以太類型0800(IP),幀大小為1314bytes(ICMP的1280bytes+IP報(bào)頭20bytes+幀14bytes) ? 再接著看下一個(gè)幀。首先看到DLC部分寫著了幀大小為762bytes,IP部分,continuation of frame 17 ,第17個(gè)幀的后續(xù)。Fragment offset 分段偏移量為1280bytes(第一個(gè)包的大小)。至此,第一個(gè)icmp echo包全部發(fā)送完畢。 ? ping –f –l 1200 [url]www.163.com[/url] -f命令:將數(shù)據(jù)報(bào)DF(don’t fragment)位設(shè)置為1(不能分段)
本文出自 “我是木頭” 博客,請(qǐng)務(wù)必保留此出處http://infotech.blog.51cto.com/391844/123859
總結(jié)
以上是生活随笔為你收集整理的MTU MSS 详解记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 步步高回应“网传即将倒闭”:一切正常
- 下一篇: Boost库之function的使用