目錄
一、什么是分片?
二、如何分片?
三、如何組裝?(16位分片標(biāo)識、3位標(biāo)志、13位片偏移)
1、回顧16位分片標(biāo)識、3位標(biāo)志、13位片偏移
2、組合分片報文
四、分片的影響
1、對UDP的影響
2、對TCP的影響
一、什么是分片?
網(wǎng)絡(luò)層再繼續(xù)向下傳遞的時候,會限制報文的大小,mtu(max transform unit)是最大傳送單元,代表了每次所能傳輸報文的大小(含IP報頭)。當(dāng)我們的報文大?。ê琁P報頭)超過了1500 個字節(jié)的時候,將一個報文分成多部份來傳遞,這就是“分片”。
注意:分片不是大多數(shù)情況,而是特殊情況。本來傳遞一個報文就有著丟包的風(fēng)險,現(xiàn)在要傳遞一堆報文,丟包的概率會增加。
二、如何分片?
假設(shè) IP協(xié)議?收到上層的報文大小為 1700 字節(jié)。這1700字節(jié)在IP協(xié)議看來就是數(shù)據(jù),不考慮選項字段,加上IP報頭的20個字節(jié),要向下傳遞的大小為1720個字節(jié),很顯然超出了傳輸限制。
那么說明需要對這1700個字節(jié)進(jìn)行分片,注意,是1700個字節(jié)分片,而不是1720個字節(jié),先對數(shù)據(jù)進(jìn)行分片,然后每一部分再加上報頭。因為是分成多個報文來發(fā)送,每一個報文都要送到對端,那就必須加上報頭來告訴下一層目標(biāo)主機(jī)的IP地址。
三、如何組裝?(16位分片標(biāo)識、3位標(biāo)志、13位片偏移)
1、回顧16位分片標(biāo)識、3位標(biāo)志、13位片偏移
因為這些報文由一個完整的報文分片得到,不能隨意組合。這就需要用到IP報頭中的三個字段16位分片標(biāo)識、3位標(biāo)志、13位片偏移。
-
13位片偏移:分片以后,各個部分在原始報文的哪個位置,即在原始報文中的偏移量。
-
16位分片標(biāo)識:如果一個報文不分片,不同報文之間的16位標(biāo)識符是不同的;如果一個報文分片了,分片報文的16位標(biāo)識符是一樣的,說明這些分片報文原本屬于一個完整的報文。
-
3位標(biāo)識:1位保留、1位標(biāo)識禁止分片、1位標(biāo)識更多報文(1說明后面跟了具有16位標(biāo)志符的報文,0說明后面沒有)
2、組合分片報文
第一步,通過三位標(biāo)識符的第三位標(biāo)識“更多報文”判斷當(dāng)前收到的報文后面是否存在其他分片報文。
如果第三位標(biāo)識為1,說明當(dāng)前報文是分片報文,加入到具有相同16位標(biāo)識符的集合中。,進(jìn)入下一步;如果為0,可能為普通報文,也有可能是分片報文的最后一部分,此時需要根據(jù)片偏移判斷。
- 如果片偏移為0,說明是普通報文,結(jié)束判斷,直接向上層交付;
- 如果不為0,說明是分片報文,加入到具有相同16位標(biāo)識符的集合中。
第二步,判斷所有的報文是否收全。將集合中的報文按照片偏移進(jìn)行升序排序。
判斷起始分片報文是否收到:如果第一個報文的片偏移為0,說明起始分片報文收到了。
判斷末尾分片報文是否收到:如果最后一個報文的三位標(biāo)志位中的第三位為0,說明末尾分片報文收到了
判斷中間報文是否收到:以第二個報文為例,第二個報文的片偏移理應(yīng)等于 第一個報文的片偏移 + 第一個報文的數(shù)據(jù)長度,以此來判斷第二個報文是否收到;依此類推,可以判斷中間報文是否收到。
=》該集合中一旦發(fā)現(xiàn)少了任意一個報文,整個集合中的報文直接全部丟棄!也不會通知上層TCP
四、分片的影響
分片有風(fēng)險,只要有一部分丟了,如果對端網(wǎng)絡(luò)層無法組裝,要組裝的幾部分會全部丟棄,對方TCP沒有收到報文,就認(rèn)為是丟包了。所以一般不建議分片,分片會增加丟包概率。
1、對UDP的影響
UDP沒有發(fā)送緩沖區(qū),應(yīng)用層要發(fā)多少,到了網(wǎng)絡(luò)層就是多少,這個時候就得老老實實分片。分片會增加丟包的概率,一旦某個分片報文丟了導(dǎo)致無法組裝就會將相關(guān)的分片報文全部丟棄。(是否相關(guān)可以根據(jù)16位分片標(biāo)識來判斷)
2、對TCP的影響
因為TCP有緩沖區(qū)的存在,想發(fā)多少、什么時候發(fā)都由TCP決定,TCP可以做到自己控制數(shù)據(jù)段的長度,然后再傳到網(wǎng)絡(luò)層,此時就無需網(wǎng)絡(luò)層來分片了。文章來源:http://www.zghlxwxcb.cn/news/detail-455510.html
但TCP每次可以發(fā)送的數(shù)據(jù)長度不是無限大,受制于MTU和對方主機(jī)的MSS(Max Segment Size),即最大消息長度。文章來源地址http://www.zghlxwxcb.cn/news/detail-455510.html
- 受制于MTU的意思是,為了不分片,TCP每次最多攜帶的數(shù)據(jù)是多少。不同系統(tǒng)的MTU可能有所不同,MTU減去TCP報頭和IP報頭的大小,就是TCP每次最多可以發(fā)送的數(shù)據(jù)量。
- 受制于對方主機(jī)的MSS的意思是,對方每次最多可以接收多少。雙方在發(fā)送SYN的時候會在TCP頭部寫入自己可以支持的MSS值,在得知對方的MSS以后,選取較小的作為最終MSS。MSS的值就是在TCP首部的40字節(jié)變長選項中(kind=2);
到了這里,關(guān)于報文分片(16位分片標(biāo)識、3位標(biāo)志、13位片偏移字段詳解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!