一、IP數據報的格式如下圖所示
版本 |
首部長度 |
服務類型 |
數據報長度 |
|
16比特標識 |
標志 |
13比特片偏移 |
||
壽命 |
上層協議 |
首部檢驗和 |
||
32比特源IP地址 |
||||
32比特目的IP地址 |
||||
選項(如果有的話) |
||||
數據 |
IPv4數據報格式
二、各部分語義
1)版本(號):4bit,規定了數據包的IP協議版本;通過查看版本號,路由器能夠確定如何解釋IP數據報的剩余部分
2)首部長度:因為IPV4數據報可包含一些可變數量的選項,所以需要用這4bit來確定首部的長度,以確定IP數據報的數據部分實際從哪里開始。大多數IP數據報不包含選項,所以一般IP數據報具有20字節的首部
3)服務類型:8bit,服務類型包含在首部中以使不同類型的IP數據報能相互區分開來,例如,將實時數據報(如用於IP電話應用)與非實時流量(如FTP)區分開來也許是有用,提供特定等級的服務是一個由路由器管理員決定的策略問題
4)數據報長度:這是IP數據報的總長度(首部加上數據),以字節計,因為該字段長為16bit,所以IP數據報的理論最大長度為65535字節,然而數據報很少有超過1500字節的(因為IP數據還要靠數據鏈路層運輸的,而鏈路層幀能承載的最大數據量為叫做最大運輸單元(Maximum Transmission Unit,MTU))
5)標識、標志、片偏移:
要理解這三個內容,要先理解一些其他知識
(1)分片:把IP數據報中的數據分成兩個或者更多個較小的IP數據報,用單獨的鏈路層幀封裝成較小的IP數據報,每個這些較小的數據報稱為片
(2)為什么要分片:因為每個IP數據報封裝在鏈路層幀中從一台路由器傳輸到下一台路由器,而鏈路層幀能承載的最大數據量(最大運輸單 元(Maximum Transmission Unit,MTU)是一定的,故鏈路層幀嚴格限制着IP數據報的長度;而且發送方和與目的路徑上的每段鏈路可能使用不同的鏈路層協議,且每種協議可能具有不同的MTU,所以就更有可能需要分片了,以便能夠使得數據報能夠順利的傳遞數據報
(3)組裝:目的主機從相同源收到一系列數據報時,需要確定哪些數據報是分片,如果是分片的話,還要進一步指導何時收到最后一個分片,如何將接收到的分片拼接起來以形成初始的數據報,故IPV4的設計者將標識、標志和片偏移字段放在IP數據報首部中,當生成一個數據報時,發送主機為該數據報設置源和目的地址的同時,再填上標識號
標識:16bit,源主機發送IP數據報的時候,通常為它發送的每個數據報的標識號加1,所以當某個路由器需要對某一個數據報分片時,形成的每個數據報(分片)具有初始數據報的源地址、目的地址、與標識號,這樣目的主機就可以判別哪些分片是屬於一個初始數據報的
標志:3bit,由於IP是一種不可靠服務,一個或者多個片可能永遠到不了目的地,所以為了讓目的主機絕對的相信它已經收到了初始數據報的最后一個片,最后一個片的標志比特被設置為0,而所有其他片的標志比特被設置為1
片偏移:13bit,標示數據相對於初始數據報的偏移值,並且偏移值應當被規定以8字節塊為單位。所以除了最后一個片的所有初始有效載荷數據的數量應當是8字節的倍數
6)壽命:8bit,壽命(Time-To_Live ,TTL )字段是用來確保數據報不會永遠(如由於長時間的路由選擇環路)在網絡中循環,每當數據報由一台路由器處理時,該字段的值減1。若TTL字段減為0,則該數據報必須丟棄。
7)協議:8 bit,該字段僅當一個IP數據報到達其最終目的地才會有用,改字段指示了IP數據報的數據部分應交給哪個特定的運輸層協議,如:值為6應該交給TCP,而值為17表示數據部分要交給UDP ,其他可能值查看 https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
8)首部檢驗和: 16bit,首部檢驗和用於幫助路由器檢測收到的IP數據報中的比特錯誤。首部檢驗和是這樣計算的:將首部中的每2個字節當做一個數,用反碼運算對這些數求和;具體到發送方或接收方計算如下:
在發送數據時,為了計算IP數據包的校驗和。應該按如下步驟:
(1)把IP數據包的校驗和字段置為0;
(2)把首部看成以16位為單位的數字組成,依次進行二進制反碼求和;
(3)把得到的結果存入校驗和字段中。
在接收數據時,計算數據包的校驗和相對簡單,按如下步驟:
(1)把首部看成以16位為單位的數字組成,依次進行二進制反碼求和,包括校驗和字段;
(2)檢查計算出的校驗和的結果是否等於零(反碼應為16個0);
(3)如果等於零,說明被整除,校驗和正確。否則,校驗和就是錯誤的,協議棧要拋棄這個數據包。
路由器要對每個收到的IP數據報計算其首部檢驗和,如果數據報首部中攜帶的檢驗和與計算得到的檢驗和不一致,則檢驗出是個差錯,路由器一般會丟棄檢測出錯誤的數據報
9)源和目的IP地址:32bit,當某源生成一個數據報時,在這兩個字段中插入發送主機的IP地址和目的地的IP地址,通常源主機DNS查找來決定目的地址
10)選項:32bit,選項字段允許IP首部被擴展。首部選項意味着很少使用,因此決定對每個數據報首部不包括選項字段的信息,這樣能夠節約開銷,但是因為有些數據報有選項,有些數據報沒有選項,故導致一台路由器處理一個IP數據報所需的時間變化很大。
11)數據(有效荷載):32bit,這是數據報存在的首要理由!大多數情況下,IP數據報中的數據字段包含要交付給目的地運輸層報文段(UDP或TCP)
注:注意到一個IP數據報有總長為20字節的首部(假設無選項)如果一個數據報承載一個TCP報文,則每個(無分片的)數據報共承載了總長40字節的首部(20字節的IP數據報加上20字節的TCP首部)以及應用文報文
三、關於標識、標志、片偏移的例子
假設一個4000字節的數據報(20字節加上3980字節IP數據有效荷載)到達路由器,且必須被轉發到一條MTU為1500字節鏈路上,該如何進行分片?
答:初始數據報會被分為3個片,其中的每個片也是一個IP數據報,假定該數據報的發送時,主機給予的標識號為777,三個片的特點如下:
片 |
字節 |
ID |
偏移 |
標志 |
第一片 |
1480
|
ID=777 |
Offset=0 |
Flag=1 |
第二片 |
1480
|
ID=777 |
Offset=185 |
Flag=1 |
第三片 |
1020(3980-1480*2) |
ID=777 |
Offset=370 |
Flag=0 |
注:此時就需要4040個字節來運輸初始數據報,所以分片是需要開銷的