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