IP數(shù)據(jù)報(bào)的分片與重組分析
在IP協(xié)議的報(bào)頭中,除了TTL字段,還有幾個(gè)字段是非常重要的,這就是我們今天要討論的標(biāo)識(shí)符、標(biāo)志位以及偏移量,這3個(gè)字段在IP數(shù)據(jù)報(bào)的分片與重組中,是非常重要的字段。
我們都知道,不同類(lèi)型的網(wǎng)絡(luò),其MTU(最大傳輸單元)各不相同,如以太網(wǎng)中,最大的傳輸幀為1518字節(jié),F(xiàn)DDI為4500字節(jié),令牌環(huán)幀在4500字節(jié)到17800字節(jié)之間,而IP協(xié)議的一個(gè)重要功能,就是能夠?qū)鬏數(shù)臄?shù)據(jù)大于硬件接口的MTU時(shí),對(duì)其進(jìn)行分段傳輸。即大于MTU的數(shù)據(jù)報(bào)將被分為2個(gè)或多個(gè)的合適的大小被傳輸。一個(gè)分片在到達(dá)接收主機(jī)的路徑中,還可能被繼續(xù)分片,因此,分片的IP數(shù)據(jù)報(bào)可能會(huì)以不同的路徑傳輸?shù)浇邮罩鳈C(jī),接收主機(jī)通過(guò)一系列的重組,將其還原為一個(gè)完整的IP數(shù)據(jù)報(bào),再提交給上層協(xié)議處理。
IP標(biāo)識(shí)符
IP標(biāo)識(shí)符、標(biāo)志、偏移量3個(gè)字段在IP報(bào)頭中的位置如下圖1所示:
本文引用地址:http://2s4d.com/article/201706/353701.htm
在發(fā)送數(shù)據(jù)報(bào)前,發(fā)送主機(jī)給每個(gè)數(shù)據(jù)報(bào)一個(gè)ID值,放在16位的標(biāo)識(shí)符字段中。此ID用于標(biāo)識(shí)唯一的數(shù)據(jù)報(bào)或數(shù)據(jù)流。接收主機(jī)利用此ID對(duì)收到的數(shù)據(jù)報(bào)進(jìn)行重組。正如前面所說(shuō),當(dāng)分片的IP數(shù)據(jù)報(bào)從源地址發(fā)送到目的地址的時(shí)候,由于網(wǎng)絡(luò)延遲或者不同的傳輸路徑的關(guān)系,在到達(dá)目的主機(jī)時(shí),這些分片數(shù)據(jù)報(bào)并不總是有序的排列,而是處于一種無(wú)序狀態(tài),因此,接收主機(jī)便用此ID判斷接收的這些分片數(shù)據(jù)報(bào)是否屬于同一個(gè)數(shù)據(jù)流,然后再進(jìn)行重組(重組將在偏移量中討論)。
標(biāo)志
標(biāo)志字段在IP報(bào)頭中占3位,第1位作為保留,置0;第2位,分段,有兩個(gè)不同的取值:該位置0,表示可以分段;該位置1,表示不能分段;第3位,更多分段,同樣有兩個(gè)取值:該位置0,表示這是數(shù)據(jù)流中的最后一個(gè)分段,該位置1,表示數(shù)據(jù)流未完,后續(xù)還有分段,當(dāng)一個(gè)數(shù)據(jù)報(bào)沒(méi)有分段時(shí),則該位置0,表示這是唯一的一個(gè)分段。見(jiàn)下圖2:
當(dāng)目的主機(jī)接收到一個(gè)IP數(shù)據(jù)報(bào)時(shí),會(huì)首先查看該數(shù)據(jù)報(bào)的標(biāo)識(shí)符,并且檢查標(biāo)志位的第3位是置0或置1,以確定是否還有更多的分段,如果還有后續(xù)報(bào)文,接收主機(jī)則將接收到的報(bào)文放在緩存直到接收完所有具有相同標(biāo)識(shí)符的數(shù)據(jù)報(bào),然后再進(jìn)行重組。
更多分段位能夠讓接收主機(jī)判斷分片的數(shù)據(jù)報(bào)是否發(fā)送完畢;而分段位除了能夠?qū)?shù)據(jù)報(bào)分段,而且還能夠?qū)崿F(xiàn)另一個(gè)用途,在某些情況下,可以利用分段位動(dòng)態(tài)的找到網(wǎng)絡(luò)端到端的MTU大小。如果路由器配置時(shí),置此位為0,則當(dāng)主機(jī)嘗試發(fā)送一個(gè)比傳輸路徑上的數(shù)據(jù)報(bào)大的幀時(shí),路由器不轉(zhuǎn)發(fā)該幀,而是丟棄,并給源主機(jī)發(fā)送ICMP報(bào)文,說(shuō)明該數(shù)據(jù)報(bào)太大,源主機(jī)利用此信息調(diào)整數(shù)據(jù)報(bào)大小,再重新發(fā)送。
偏移量
13位的偏移量字段用來(lái)表示分段的數(shù)據(jù)報(bào)在整個(gè)數(shù)據(jù)流中的位置,即相當(dāng)于分片數(shù)據(jù)報(bào)的順序號(hào)。發(fā)送主機(jī)對(duì)第一個(gè)數(shù)據(jù)報(bào)的偏移量置為0,而后續(xù)的分片數(shù)據(jù)報(bào)的偏移量則以網(wǎng)絡(luò)的MTU大小賦值。偏移量對(duì)于接收方進(jìn)行數(shù)據(jù)重組的時(shí)候,這是一個(gè)關(guān)鍵的字段。對(duì)于分片的數(shù)據(jù)段(單位:字節(jié))必須為8的整數(shù)倍,否則IP無(wú)法表達(dá)其偏移量。如下圖3所示:
以太網(wǎng)中,源主機(jī)如果需要通過(guò)UDP傳送3000字節(jié)的數(shù)據(jù)到目的主機(jī),這時(shí)的分段情況如下圖4所示(在同一網(wǎng)段):
此處需要注意的是對(duì)于分片1的報(bào)頭,相對(duì)于其他兩個(gè)分片的報(bào)頭而言,要多出8個(gè)字節(jié)UDP協(xié)議的報(bào)頭開(kāi)銷(xiāo),因此,在計(jì)算實(shí)際傳輸?shù)臄?shù)據(jù)凈載荷時(shí),分片1要多減去8字節(jié)UDP報(bào)頭。最后,接收主機(jī)通過(guò)此偏移值將數(shù)據(jù)重組成完整的數(shù)據(jù)報(bào)。
總結(jié)
IP協(xié)議雖然是我們司空見(jiàn)慣的一個(gè)協(xié)議,但是,對(duì)于其報(bào)頭結(jié)構(gòu),報(bào)頭中每個(gè)字段的含義,還是需要我們不斷學(xué)習(xí),才能真正理解IP協(xié)議的精髓。
評(píng)論