官术网_书友最值得收藏!

2.4.4 IP協議

網絡層中最主要的協議是IP協議(Internet Protocol)。IP協議的數據包中包含了目的地的地址信息,我們之前提到的數據轉發就是根據這個目的地址來決定的。在發送數據時,如果數據包無法直接發送給對端,我們就需要通過路由器來進行數據中轉,IP協議會根據目的地址決定向哪一個后繼路由器(或節點)進行數據轉發。這個過程會一直持續,直到數據包發送到對端為止。

現在,我們考慮一種特殊情況,當IP數據包發送到某一個路由器時,吧嗒,停電了。這時問題就來了,我們這個數據包并沒有成功發送到對端,而此時數據發送的源端也可能不知道數據有沒有發送成功,怎么辦呢?ICMP協議(Internet Control Message Protocol)在這個時候就可以大顯身手了。我們把這種協議稱為Internet控制報文協議,其作用就是探測網絡連接。該協議提供了簡單的出錯報告信息,發送的出錯報文會返回到發送數據的源端。發送端隨后可根據ICMP報文確定發生錯誤的類型,并確定如何才能更好地重發失敗的數據包。需要注意的是,ICMP只負責報告錯誤,而如何處理某個特定錯誤,則由發送端自己決定,如圖2-10所示。

圖2-10 ICMP原理

1.協議詳解

接下來,我們來一起了解一下IP協議頭部的構造。首先是IPv4版本的IP協議頭,如圖2-11所示。

圖2-11 IP頭部

1)版本:該字段的長度為4 bit。對于IPv4版本的IP協議來說,其值是4。

2)頭部長度:該字段的長度為4 bit。用于指定當前IP頭部的總長度(單位是32 bit)。由于該字段總長度為4位,用二進制表示的最大十進制數字為15(用二進制位表示是1111),因此IP協議頭部的總長度最大為15×32/8=60 Bytes在計算機中,一個字節等于8 bit。,即60字節。

3)服務類型:該字段的長度為8 bit。用于分配優先級、延遲、吞吐量以及可靠性。該字段的最高3 bit用于定義IP優先級,同理,我們可以用這3 bit來定義8種不同的服務優先級參考RFC1122的定義。。其次,第3至第6 bit用于定義最低延遲、最高吞吐量、可靠性和最小開銷參考RFC791和RFC1349的定義。。而最后1 bit則必須置0。需要注意的是,第3至第6 bit的定義中,至多只能有一位置1,應用程序需要根據特定需求來進行置位。

4)長度:該字段的長度為16 bit。用于定義整個IP數據報的總字長,同理,我們可以通過16 bit計算出一個IP數據報的最大字長,即216-1=65535 Bytes。不過,低層(鏈路層)會限制能支持的IP數據報長度。例如,Ethernet協議包含一個名為MTU(Maximum Transfer Unit,最大傳輸單元)的協議參數,其值為1518字節,Ethernet的幀首部使用18字節,因此只能攜帶1500字節的數據。因此,實際情況下的IP數據報總長度遠比我們計算出來的65535 Bytes小。

現在需要考慮一個問題,我們怎樣才能發送超過MTU的IP數據報呢?最簡單和直接的想法就是把超過MTU長度的數據拆分成多個數據報再分別發送。嗯,這種方法完全可行!

5)認證:該字段的長度為16 bit。用于對IP數據報進行唯一標識,其值從一個隨機數開始,隨著發送的IP數據報每次加1。不過,對于字長超過MTU的IP數據報,拆分后發送的數據報具有相同的認證。

6)標志:該字段的長度為3 bit。第1位為保留字段,第2位置1則表示禁止對IP數據報拆分。如果將該位置為1,那么網絡層將不會對IP數據報進行拆分,取而代之的是返回一個ICMP差錯報文。第3位表示是否還包含更多分片,除了最后一個分片以外,其他IP數據報都應將該值置為1。

7)段偏移量:該字段的長度為13 bit。用于表示分片相對原始IP數據報開始處的偏移量。

8)TTL:該字段的長度為8 bit。用于指定數據報到達目的地之前允許經過的最大路由跳數。

9)協議:該字段的長度為8 bit。用于表示當前上層所使用的協議類型。在Linux操作系統下,/etc/protocols文件定義了所有上層協議使用的協議字段值,如表2-1所示。

表2-1 協議字段

10)校驗和:該字段的長度為16 bit。通過CRC算法計算出來,用于檢查接收到的數據是否正確。

11)源IP地址:該字段的長度為32 bit。用于標識發送端。

12)目的IP地址:該字段的長度為32 bit。用于標識接收端。

13)選項:該字段的長度為40字節。雖然這個字段的總長度不能超過40字節,但是在這個范圍內,該字段的長度是可變的,我們可以具體定義多種類型的選項參考RFC791的定義。

IPv6頭部由40個字節的定長頭部與不定長的擴展字段組成,其結構如圖2-12所示。

圖2-12 IPv6頭部

IPv6逐跳頭:此擴展頭必須緊隨在IPv6頭之后,它包含包所經路徑上的每個節點都必須檢查的可選數據。到目前為止,只定義了一個選項:巨型凈荷選項。該選項指明,此包的凈荷長度超出了IPv6的16位凈荷長度字段。只要包的凈荷(包括逐跳選項頭)超出65535字節,就必須包含該選項。如果節點不能轉發此包,則必須返回一個ICMPv6出錯報文。逐跳頭的定義如圖2-13所示。

圖2-13 IPv6逐跳頭

IPv6路由頭:此擴展頭指明包在到達目的地途中將經過的特殊的節點。它包含包沿途經過的各節點的地址列表。IPv6頭的最初目的地址不是包的最終目的地址,而是選路頭中所列的第一個地址。此地址對應的節點接收到該包后,對IPv6頭和選路頭進行處理,然后將包發送到選路頭列表中的第二個地址。如此繼續,直至該包到達最終目的地。路由頭的定義如圖2-14所示。

圖2-14 IPv6路由頭

IPv6目的選項頭:此擴展頭包含只能由最終目的地節點所處理的選項。目前,只定義了填充選項,將該頭填充為64位邊界,以備將來所用。目的選項頭的定義如圖2-15所示。

圖2-15 IPv6目的選項頭

IPv6封裝安全載荷頭:這是最后一個擴展頭,不進行加密,它指明剩余的凈荷已經加密,并為已獲得授權的目的節點提供足夠的解密信息。封裝安全載荷頭的定義如圖2-16所示。

圖2-16 IPv6封裝安全載荷頭

2.路由與轉發規則

IP協議的路由轉發規則就是依照我們之前描述的路由算法實現的。流程如圖2-17所示。

圖2-17 轉發規則流程

轉發的具體流程如下。

1)收到IP報文,查找路由表。

2)如果路由表中有路由項和報文目標IP匹配,則認為路由項匹配,并轉發到對應的端口上。

3)如果沒有找到任何匹配項,則將IP報文丟棄。

其中比較復雜的就是路由表項的匹配過程。我們一般將路由表中的目的地址與路由表中的子網掩碼進行邏輯與操作,得到一個網絡地址,然后將該地址與路由表中的地址進行比較,如果相同則表示匹配。

如果發現匹配的路由表項,則看路由器是否與該目標節點直接相連,如果沒有,則以該匹配的路由網絡地址為目標地址,再次進行匹配,直至找出與該路由器直接相連的匹配項為止。

確定了路由項之后,我們就將IP報文封裝成數據鏈路層的幀并轉發到對應端口上。

由于我們有多重方式可以匹配到不同的路由,因此為了統一,業界將路由匹配規則按照優先級分為以下3種匹配規則。

1)路由最長匹配原則:我們優先選擇子網掩碼最長的路由表項進行匹配。因為子網掩碼越長,表示網絡號越長,代表其網絡范圍越小,越精確。

2)路由迭代查找原則:上文闡述過,如果當前匹配結果不與路由器直接相連,那么就以匹配結果為目標節點。

3)默認路由匹配原則:一般地,如果IP報文與任何表項都無法匹配,我們會將其丟棄。但是我們可以設置一種默認原則,當報文不與其他表項匹配時,我們轉發到某個特定端口上。其原理很簡單,我們在路由器中加入一條IP地址和子網掩碼均為0.0.0.0的路由表項,由于該表項長度最短,因此處于最低優先級。另外,該子網掩碼與任何地址做與運算都是0.0.0.0,肯定與目的地址相匹配。因此只有在沒有其他任何路由匹配IP報文的情況下,系統才會按照默認路由轉發。

主站蜘蛛池模板: 衡阳县| 邯郸县| 韩城市| 类乌齐县| 东乌珠穆沁旗| 循化| 石柱| 延庆县| 宜丰县| 遂溪县| 万盛区| 巴东县| 浠水县| 平原县| 衢州市| 象山县| 兴化市| 平湖市| 长乐市| 汾西县| 宁远县| 石门县| 伊金霍洛旗| 偏关县| 尖扎县| 邵阳市| 昭苏县| 青铜峡市| 沅陵县| 肥乡县| 沽源县| 都昌县| 白水县| 阜城县| 龙岩市| 岚皋县| 平阳县| 扶绥县| 汾西县| 镶黄旗| 封丘县|