MSS,最大報文段長度(Maximum Segment Size?),是TCP協(xié)議的一個選項,用于在TCP連接建立時义屏,收發(fā)雙方協(xié)商通信時每一個報文段所能承載的最大數(shù)據(jù)長度(不包括文段頭)。
在這之前蜂大,我們需要先來看一下IP分片闽铐。IP協(xié)議的設(shè)計初衷是應(yīng)用于廣泛的傳輸介質(zhì)。IPv4數(shù)據(jù)包的最大長度為65535字節(jié)奶浦。帶有逐跳擴展頭部和巨型幀負載選項的IPv6數(shù)據(jù)包最長可以支持4294967295字節(jié)兄墅。但多數(shù)傳輸鏈路都會強制使用一個比較小的最大數(shù)據(jù)包長度,這個長度稱為最大傳輸單元(Maximum Transmission Unit财喳,MTU)察迟。
當路由器收到比出接口MTU更大的IPv4數(shù)據(jù)包時,它就必須對數(shù)據(jù)包進行分片耳高。IP分片發(fā)生在IP層扎瓶,不僅源端主機會進行分片,中間的路由器也有可能分片泌枪,因為不同的網(wǎng)絡(luò)的MTU是不一樣的概荷,如果傳輸路徑上的某個網(wǎng)絡(luò)的MTU比源端網(wǎng)絡(luò)的MTU要小,路由器就可能對IP數(shù)據(jù)報再次進行分片碌燕。而分片數(shù)據(jù)的重組只會發(fā)生在目的端的IP層误证。
IP分片會造成以下問題:
[if !supportLists]1、[endif]對數(shù)據(jù)進行分片會消耗CPU和內(nèi)存修壕;
[if !supportLists]2愈捅、[endif]目標設(shè)備重組時也會消耗CPU和內(nèi)存資源;
[if !supportLists]3慈鸠、[endif]分片之后蓝谨,如果有一個分片被丟棄,則整個數(shù)據(jù)需要重傳青团;
[if !supportLists]4譬巫、[endif]執(zhí)行4到7層過濾的防火墻有可能無法正確處理IPv4分片。
為了避免出現(xiàn)這樣的情況督笆,TCP最大分段長度(Maximum Segment Size芦昔,MSS)定義了接收方設(shè)備在一個TCP段中可以接受的最大數(shù)據(jù)量。TCP段可以通過一個IPv4數(shù)據(jù)包進行發(fā)送娃肿,也可以分片后使用多個IPv4數(shù)據(jù)包發(fā)送咕缎。發(fā)送方和接收方之間不會對MSS進行協(xié)商。發(fā)送設(shè)備需要對TCP分段的尺寸進行限制咸作,使其不大于接收方設(shè)備所報告的MSS長度锨阿。
為了對避免IPv4數(shù)據(jù)包進行分片,所選TCP MSS為出接口的最小緩沖區(qū)大小和MTU減40字節(jié)记罚。40字節(jié)包含了20字節(jié)的IPv4頭部和20字節(jié)的TCP頭部墅诡。比如說,默認的以太網(wǎng)MTU是1500字節(jié)桐智。那么末早,通過以太網(wǎng)接口發(fā)出的IPv4數(shù)據(jù)包,其TCP段的TCP MSS就應(yīng)該是1460说庭,即用以太網(wǎng) MTU的1500字節(jié)減去IPv4頭部的20字節(jié)然磷,再減去TCP頭部的20字節(jié)。對于UDP包刊驴,我們需要在應(yīng)用層去限制每個包的大小姿搜,一般不要超過1472字節(jié)寡润,即以太網(wǎng)MTU(1500)—UDP首部(8)—IP首部(20)。
TCP MSS有助于避免在TCP連接兩端對數(shù)據(jù)包進行分片舅柜,但是并不能避免因路徑中的鏈路MTU更小而造成的分段梭纹。
在IPv6上,IPv6路由器不會對數(shù)據(jù)包進行分片致份,除非這臺設(shè)備是數(shù)據(jù)包的源变抽。如果一臺IPv6路由器收到了比其出接口MTU大的數(shù)據(jù)包,它會丟棄這個數(shù)據(jù)包并向源發(fā)送一個ICMPv6數(shù)據(jù)包過大消息氮块,其中會包含這個較小的MTU绍载。