5.2.5 IP數(shù)據(jù)報(bào)(三)IP數(shù)據(jù)報(bào)的分片與重組
前面我們?cè)趯W(xué)習(xí)IP數(shù)據(jù)報(bào)的格式中,提及了數(shù)據(jù)報(bào)的分片,這里我們要弄明白幾個(gè)問題
-
為什么要分片?
前面我們已經(jīng)解釋過,如圖
因?yàn)樵跀?shù)據(jù)報(bào)傳送的過程中如果總長度超出了某個(gè)網(wǎng)絡(luò)的MTU的情況下就會(huì)使該IP數(shù)據(jù)報(bào)無法封裝到一個(gè)完整的數(shù)據(jù)幀里,所以必須要進(jìn)行分片 -
分片工作是由誰來完成的?
分片工作通常是由網(wǎng)絡(luò)互連設(shè)備路由器(圖中R1)來完成,也就是說路由器會(huì)根據(jù)實(shí)際的需要來完成數(shù)據(jù)報(bào)的分片工作,然后每個(gè)數(shù)據(jù)報(bào)片都被封裝在單個(gè)數(shù)據(jù)幀中發(fā)送,并且作為獨(dú)立的IP數(shù)據(jù)報(bào)進(jìn)行傳輸。
-
數(shù)據(jù)報(bào)分片的重組工作由誰來負(fù)責(zé)?
與數(shù)據(jù)報(bào)分片相反的就是分片的重組,也就是把若干個(gè)分片重新組合成原始的IP數(shù)據(jù)報(bào),考慮到各個(gè)分片在到達(dá)目的主機(jī)之前還有可能會(huì)被再次分片,所以說在沿途路由器上不進(jìn)行分片的重組,這里我們要注意,對(duì)數(shù)據(jù)報(bào)分片的重組工作是由目的主機(jī)來完成的。
-
如何分片?(這是最重要的問題)
如圖
我們?cè)谇懊鎸W(xué)習(xí)IP數(shù)據(jù)報(bào)的格式中曾經(jīng)說過對(duì)IP數(shù)據(jù)報(bào)的分片處理會(huì)用到IP數(shù)據(jù)報(bào)首部的三個(gè)字段標(biāo)識(shí)、標(biāo)志、片偏移,下面我們就著重的學(xué)習(xí)一下這三個(gè)字段。
一、標(biāo)識(shí)字段
標(biāo)識(shí)(identification)占16bit,它是一個(gè)計(jì)數(shù)器,是源主機(jī)賦予數(shù)據(jù)的惟一標(biāo)識(shí)符。在分片的時(shí)候,該字段會(huì)被復(fù)制到各個(gè)分片首部中的標(biāo)識(shí)字段。
標(biāo)識(shí)字段占了16比特2個(gè)字節(jié),是源主機(jī)賦予數(shù)據(jù)報(bào)的惟一標(biāo)識(shí)符,比如在源主機(jī)的內(nèi)存中保持了一個(gè)全局計(jì)數(shù)器,每產(chǎn)生一個(gè)新的數(shù)據(jù)報(bào)計(jì)數(shù)器就會(huì)加一,因?yàn)闃?biāo)識(shí)占用16個(gè)比特所以計(jì)數(shù)器可以統(tǒng)計(jì) 2 16 2^{16} 216個(gè)標(biāo)識(shí),當(dāng)達(dá)到65535的時(shí)候該字段置為全零,總之就是要保證同一主機(jī)發(fā)出的各個(gè)數(shù)據(jù)報(bào)的標(biāo)識(shí)字段在較長時(shí)間內(nèi)是唯一的,一個(gè)數(shù)據(jù)報(bào)分片其實(shí)是把數(shù)據(jù)部分進(jìn)行拆分,因?yàn)槊總€(gè)分片都有首部,并且數(shù)據(jù)報(bào)片的首部主要從初始數(shù)據(jù)報(bào)首部中復(fù)制,僅做少量修改,也就是說對(duì)于標(biāo)識(shí)字段必須不加修改的復(fù)制到各個(gè)分片的首部中以方便目的主機(jī)在重組時(shí)能夠識(shí)別出屬于同一初始數(shù)據(jù)報(bào)的所有分片。
二、標(biāo)志字段
標(biāo)志字段占3bit,第一個(gè)比特不用
第二個(gè)比特DF位(Don’t Fragment flag):是否允許被分片(0:允許)當(dāng)該比特等于1的時(shí)候表示數(shù)據(jù)報(bào)不允許被分片,0的時(shí)候允許被分片。也就是說如果某數(shù)據(jù)報(bào)太長,路由器必須現(xiàn)對(duì)其進(jìn)行分片才能轉(zhuǎn)發(fā)的時(shí)候,結(jié)果發(fā)現(xiàn)該數(shù)據(jù)報(bào)的DF位置為1時(shí)路由器會(huì)丟棄該數(shù)據(jù)報(bào),并想源主機(jī)發(fā)送一個(gè)差錯(cuò)報(bào)告報(bào)文。
第三個(gè)比特是MF位(More Fragment flag,簡稱MF),表示是否有后續(xù)分片,MF位=1表示該數(shù)據(jù)報(bào)不是最后一個(gè)分片,當(dāng)該比特位等于零的時(shí)候是最后一個(gè)分片。
三、片偏移量
片偏移占用13個(gè)比特位,該字段指出本數(shù)據(jù)報(bào)片中的數(shù)據(jù)部分第一個(gè)字節(jié)相對(duì)于原數(shù)據(jù)報(bào)中數(shù)據(jù)部分的偏移量,請(qǐng)注意:該字段是以8個(gè)字節(jié)為單位來計(jì)算偏移量的。對(duì)于未分片的數(shù)據(jù)報(bào)或第一個(gè)分片來說該字段等于零。
由于各個(gè)分片在傳輸?shù)倪^程中是獨(dú)立的也就是說由于IP協(xié)議無法保證這些分片一定按需到達(dá)目的主機(jī),所以目的主機(jī)能夠根據(jù)分片中的源主機(jī)IP地址、標(biāo)識(shí)、標(biāo)志字段中的MF位以及偏移量來重裝出最初始數(shù)據(jù)報(bào)的完整副本,除非沒能收齊所有分片。也就意味著只要有一個(gè)分片丟失就無法重組,意味著整個(gè)數(shù)據(jù)報(bào)都丟失了,所以在實(shí)際的應(yīng)用中,如果需要分片,總是希望分片的個(gè)數(shù)越少越好,又因?yàn)槠屏渴且?字節(jié)為單位,所以除了最后一個(gè)分片外,其余分片的數(shù)據(jù)部分的大小應(yīng)盡量接近但不超過網(wǎng)絡(luò)的MTU,并且是8字節(jié)的整數(shù)倍。
四、示例
我們通過一個(gè)例子來介紹有關(guān)數(shù)據(jù)報(bào)分片的計(jì)算。
如圖
圖中所示的小型互聯(lián)網(wǎng)中,主機(jī)A向B發(fā)送了一個(gè)首部20字節(jié),數(shù)據(jù)部分1400字節(jié)長,且DF位為0的IP數(shù)據(jù)報(bào),請(qǐng)問該數(shù)據(jù)報(bào)會(huì)被分片么?如果需要分片,請(qǐng)寫出分片結(jié)果。
從圖中我們可以看到由于主機(jī)A發(fā)送出去的是總長度為1420字節(jié)的IP數(shù)據(jù)報(bào),要經(jīng)過一個(gè)MTU值是660字節(jié)的網(wǎng)絡(luò)2才能夠到達(dá)目的網(wǎng)絡(luò)3,所以在路由器R1處必須要進(jìn)行分片,此外,該數(shù)據(jù)報(bào)的標(biāo)志字段中的DF位為0表示可以分片,這里我們要知道所謂的分片其實(shí)是將數(shù)據(jù)部分拆開,因?yàn)槊總€(gè)分片都有首部,并且每個(gè)分片的數(shù)據(jù)部分長度要滿足的條件是小于等于網(wǎng)絡(luò)2的MTU660個(gè)字節(jié)減去首部的長度也就是640個(gè)字節(jié),并且數(shù)據(jù)部分的長度還應(yīng)該是8字節(jié)的整數(shù)倍,在這個(gè)實(shí)例中網(wǎng)絡(luò)2可傳輸?shù)臄?shù)據(jù)報(bào)長度為640個(gè)字節(jié)恰巧可以被8整除,所以每個(gè)分片的數(shù)據(jù)部分的長度我們選擇六百四十字節(jié)即可。所以我們得到如下結(jié)果
分片個(gè)數(shù)= 1400 640 \frac{1400}{640} 6401400?,然后向上取整,最終結(jié)果是3。其中前面兩個(gè)分片的數(shù)據(jù)部分長度都是640個(gè)字節(jié),最后一個(gè)分片的長度會(huì)比較短。如圖
如圖我們得到的分片結(jié)果
第一個(gè)分片的數(shù)據(jù)部分是640字節(jié),其中標(biāo)志字段的MF位等于1表示有后續(xù)分片,因?yàn)閿?shù)據(jù)部分第一個(gè)字節(jié)就是原始數(shù)據(jù)報(bào)中編號(hào)為0的那個(gè)字節(jié),所以他的片偏移字段的值就是 0 8 \frac{0}{8} 80?就是該字段為全零。
第二個(gè)分片的數(shù)據(jù)部分仍然是640個(gè)字節(jié),其中標(biāo)志字段的MF位等于1表示有后續(xù)分片,因?yàn)槠鋽?shù)據(jù)部分第一個(gè)字節(jié)的編號(hào)是640,所以他的片偏移字段的值就是 640 8 = 80 \frac{640}{8}=80 8640?=80所以片偏移字段的值為0000001010000
第三個(gè)分片比較短,它的數(shù)據(jù)部分長度是 1400 ? 2 × 640 = 120 1400-2\times640=120 1400?2×640=120個(gè)字節(jié),因?yàn)槠涫亲詈笠粋€(gè)分片,后沒有分片因此其MF字段值為0,同時(shí)他的數(shù)據(jù)部分第一個(gè)字節(jié)編號(hào)是1280,所以他的片偏移字段的值是 1280 8 = 160 \frac{1280}{8}=160 81280?=160,字段值是0000010100000
這里需要我們注意的是很多人在計(jì)算分片的個(gè)數(shù)時(shí),習(xí)慣用原始數(shù)據(jù)報(bào)的總長度去除每個(gè)分片的總長度,這都是錯(cuò)誤的,因?yàn)槊總€(gè)分片都有首部,這里我們一定要注意分片是吧數(shù)據(jù)部分拆開了。
這里我們?cè)賮硭伎既绻咽纠械木W(wǎng)絡(luò)2的MTU改為600的情況下,每個(gè)分片的數(shù)據(jù)部分長度是580個(gè)字節(jié)么?歡迎大家留言討論。文章來源:http://www.zghlxwxcb.cn/news/detail-650425.html
以上就是數(shù)據(jù)報(bào)的分片與重組。我們知道在互聯(lián)網(wǎng)絡(luò)層中使用的是IP地址,而前面我們學(xué)習(xí)知道在實(shí)際使用的是網(wǎng)卡的MAC地址進(jìn)行通信的,這兩種地址之間的關(guān)系就與我們后面要學(xué)到的地址解析協(xié)議ARP有關(guān)。文章來源地址http://www.zghlxwxcb.cn/news/detail-650425.html
到了這里,關(guān)于5.2.5 IP數(shù)據(jù)報(bào)(三)IP數(shù)據(jù)報(bào)的分片與重組的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!