新鄉(xiāng)網(wǎng)站建設(shè)哪家好seo包年服務(wù)
本文簡述下TCP分段和IP分片的區(qū)別與聯(lián)系。
我們知道,用戶空間的數(shù)據(jù)拷貝到內(nèi)核空間的TCP發(fā)送緩沖區(qū)(這個(gè)是一個(gè)結(jié)構(gòu)體,叫sk_buffer,簡稱skb)后就由內(nèi)核網(wǎng)絡(luò)協(xié)議棧做后續(xù)的封裝和發(fā)送處理了,用戶無需考慮下層的網(wǎng)絡(luò)問題。
按理來說,MAC幀中搭載的數(shù)據(jù)部分越長,則一次可發(fā)送的數(shù)據(jù)越多,即數(shù)據(jù)發(fā)送效率就越大。但是由于數(shù)據(jù)鏈路的負(fù)載能力不是沒有上限的,而且為了更方便差錯(cuò)控制,每一種數(shù)據(jù)鏈路層協(xié)議都規(guī)定了數(shù)據(jù)幀的數(shù)據(jù)部分上線,即最大傳送單元MTU,MAC協(xié)議的MTU是1500字節(jié)。
這個(gè)1500字節(jié)不包括以太網(wǎng)的幀頭、幀尾,而是包括IP頭、TCP頭和數(shù)據(jù)部分。
因此,IP層如果封裝后的報(bào)文大于1500字節(jié),那就違反了MAC協(xié)議,因此無法被封裝成MAC幀,IP層此時(shí)必須將數(shù)據(jù)進(jìn)行分片。
而這1500字節(jié)里,還有固定的IP報(bào)頭20字節(jié),TCP報(bào)頭的20~60字節(jié)(一般是20字節(jié)),因此從TCP發(fā)送緩沖區(qū)到封裝成TCP報(bào)文,TCP層也需要對(duì)數(shù)據(jù)進(jìn)行分段,使其起碼要小于1460.當(dāng)然具體來說是小于(MTU - IP頭長度 - TCP頭度),這個(gè)長度成為最大報(bào)文長度MSS,英文全稱Maximum Segment Size。
這個(gè)過程如下圖:
問題一:為什么IP對(duì)數(shù)據(jù)分片了,還要TCP分段?
既然IP層會(huì)迫于MTU的限制而對(duì)數(shù)據(jù)報(bào)進(jìn)行分片,使其符合MAC協(xié)議,并能夠正常在以太網(wǎng)中傳輸。IP層使得數(shù)據(jù)報(bào)滿足了MTU,那里面負(fù)載的數(shù)據(jù)肯定小于MSS呀,為什么還需要TCP分段呢?
因?yàn)閷?duì)于一份很大的數(shù)據(jù),如果只是IP分片,那么某個(gè)數(shù)據(jù)片丟失后,TCP的重傳機(jī)制是對(duì)這整個(gè)數(shù)據(jù)進(jìn)行重傳,IP是它的下層協(xié)議,它不知道IP對(duì)這個(gè)數(shù)據(jù)分了多少片,自然也不知道是哪個(gè)片丟失了。
而TCP也分段之后,該段數(shù)據(jù)丟失了,那么TCP只需要重傳這一段就可以了。
問題二:TCP有分段,IP還要分片嗎?
既然TCP的分段使得數(shù)據(jù)滿足了MSS的要求,肯定也就滿足了MTU的要求吧,為什么IP層還是需要對(duì)數(shù)據(jù)分片。
IP分段取決于MTU大小,這個(gè)是和網(wǎng)絡(luò)負(fù)載能力有關(guān)的。實(shí)際上,不同鏈路負(fù)載能力不同,不是所有鏈路大小都是1500字節(jié)。比如IP數(shù)據(jù)報(bào)在到達(dá)某路由器時(shí),接下來要走的鏈路的MTU更小,那么路由器會(huì)在IP層對(duì)其繼續(xù)分片,使其滿足后面的鏈路的MTU要求。