出了紕漏,舊文重發,20張圖理解 IP 協議

張哥說技術發表於2023-03-10

輕解網路系列又來了,今天我們們說說 IP 協議,這可是網路協議中最最核心的一個協議了,還記得我們剛剛知道什麼是IP地址、怎麼給電腦修改 IP 的時候嗎?今天我們就來探究一下 IP 協議。

出了紕漏,舊文重發,20張圖理解 IP 協議

IP協議是TCP\IP協議簇中最核心的協議,大部分的上層(傳輸層、應用層)應用都直接或間接的使用IP協議傳輸,TCP協議、UDP協議都會使用 IP 協議。

出了紕漏,舊文重發,20張圖理解 IP 協議

這張資料在 TCP\IP 協議模型中的加工流程一定要記到腦子中,這樣當我們思考網路的問題時,可以有一個大局觀。

IP 協議是無連線的,不可靠的網路層協議,它只負責資料的傳輸,但是並不能保證資料一定能到達,要想保證資料可靠,需要上層應用處理,例如 TCP協議利用IP協議傳輸資料,但是丟包、超時等情況還是要靠 TCP 自己解決。

IPv4 分類法

IP 在直觀上是有一個分類的,尤其是IPv4。

傳統的 IP 地址分類法

在網際網路誕生之初,IP 地址就有一套標準的分類方法,因為當時網際網路上的裝置還很少,需要用到 IP 的企業和機構也沒有那麼多。誰知道後來網際網路發展的如此迅猛,導致這種分類方式用起來不太合理。

這種分類方式是將 IP 地址分成 A、B、C、D、E 五類,每一類都有固定的字首和應用場景。

一個 IP 地址佔用 32 bit ,用點分十進位制表示,例如 192.168.0.188,一個點號分隔一個 8 bit。

  1. IP 地址可分為 A、B、C、D、E 五類,D類是廣播地址,E類是保留地址(未啟用),所以重點關注 A、B、C類;
  2. A、B、C 類地址分為網路地址和主機地址,網路地址表示一個網路,主機地址分給具體的主機;
  3. 主機地址全為 0 和全為 1 的IP 有特殊用途,主機地址全為 0 ,表示網路號,代表這個網路本身;主機地址全為1,表示廣播地址,代表這個網路中的所有主機;
  4. 每個類別中(除了 D、E類),都有一些地址有特殊的使用者,留作私有地址或者回環地址,例如192.168、127.0.0.1;
  5. 子網掩碼全為1的位數就是網路地址的位數;
出了紕漏,舊文重發,20張圖理解 IP 協議

A 類

出了紕漏,舊文重發,20張圖理解 IP 協議

A 類地址前 8 位為網路地址,後24位為主機地址。

網路地址中第一位固定為0,有從0~127共128個網路,每個網路可容納 =16,777,214臺主機。但其實可用的 IP 地址從 [1.0.0.0]~[126.255.255.255]。

特殊網路地址:

但其中網路地址全0和全1的為特殊地址,不能使用,所以 A 類地址可用的網路數其實是 126個。

127.0.0.1,這個地址我們都非常熟悉,一般我們說這個是本地地址(localhost),其實這個地址準確的名稱叫做「迴環地址」,

可以理解為一個虛擬網路卡,這個網路卡只接收來自本機的資料包。

0.0.0.0,這個地址其實才代表本機,假設一臺主機上有兩個網路卡,一個服務監聽了 0.0.0.0 這個IP ,則發給這兩個網路卡的資料都會被監聽到。

還有網路地址 10 開頭的地址用作內網地址,從 10.0.0.0~10.255.255.255。好多公司的內網 IP 都是10網段的。

特殊主機地址:

每一個網路,主機地址全 0 和 全 1 的都是保留地址,所以每一個網路的主機數都是 ,n 是主機地址的位數。

B類

出了紕漏,舊文重發,20張圖理解 IP 協議

16位網路地址,16位主機地址。網路地址中前兩位固定為 10,有 =16384個網路,每個網路可容納  =65534臺主機。

但其實可用的 IP 地址從128.0.0.0到191.255.255.250。

特殊網路地址:

172.16.0.0~172.31.255.255是私有地址。

10101100.0001000.00000000.00000000 ~ 10101100.00011111.11111111.11111111

169.254.0.0到169.254.255.255是保留地址。

10101001.11111110.00000000.00000000 ~ 10101001.11111110.11111111.11111111

特殊主機地址:

每一個網路,主機地址全 0 和 全 1 的都是保留地址,所以每一個網路的主機數都是 ,n 是主機號的位數。

C類

出了紕漏,舊文重發,20張圖理解 IP 協議

24位網路地址,8位主機地址。網路地址中前三位固定為110,有 個網路,每個網路可容納 =254臺主機。

但其實可用的 IP 地址從192.0.0.0~223.255.255.255。

特殊網路地址:

192.168.0.0~192.168.255.255 留作私有地址使用。

D 類

出了紕漏,舊文重發,20張圖理解 IP 協議

D類地址以 1110 開始,並且不區分網路地址和主機地址,這類地址用作是廣播地址,用來接收廣播訊息

E類

出了紕漏,舊文重發,20張圖理解 IP 協議

E類地址以1111開始,保留地址,還未啟用。

傳統分類法缺陷

出了紕漏,舊文重發,20張圖理解 IP 協議

網路數和主機數搭配不協調

A類、B類可用網路數很少,只有1萬多個,但是每個網路的主機數又太多了,

現實中沒有哪個機構或企業的主機數會有那麼多,所以如果一個企業得到一個B類地址,其實只能用到很少的主機地址,剩下的就浪費了。

整體網路數太少

A、B、C類的網路數加起來只有200多萬個,但是全世界有那麼多機構、企業,每個企業都申請一個網路地址,顯然是不夠用的。

路由難以聚合,路由表過大

雖然200多萬的網路資料量在全世界範圍內不算多,但是對於一個路由器的路由表來說就太多了。假設一個地區有十幾萬個 C類地址,那路由器想要路由這些地址,就要在路由表中記錄這麼多的路由表項,顯然是不太合理的。

無類別域間路由(CIDR)分類法

正是因為傳統的A、B、C、D、E類分法的一些缺陷,CIDR 便應運而生。

CIDR 仍然是用點分十進位制的方式表示,IP v4 中仍然是 32 位,每8位一組,共4組。只是需要在後面加一個數字字尾,表示這個地址的網路地址是多少位。

傳統的分類方法是以 8 位為最小單元,網路地址只能是8位、16位、24位,而在 CIDR 中用子網掩碼區分網路地址和主機地址,連續為1的位數就是網路地址位數,用二進位制可以清楚的看出來。

例如子網掩碼是 11111111.00000000.00000000.00000000,前面8位連續都是1,表示8位的網路地址,子網掩碼就是 255.0.0.0。

再比如子網掩碼是 11111111.11100000.00000000.00000000,前面11位連續都是1,表示11位的網路地址,子網掩碼就是 255.224.0.0。這與傳統的 IP 地址分類法就不一樣了。

看下面兩個 CIDR IP 地址,一個 11位網路地址的 IP ,一個 22 位網路地址的 IP。

例如 209.34.21.7/11,表示前11位代表網路地址,後面的21位都是主機地址。

出了紕漏,舊文重發,20張圖理解 IP 協議

207.128.28.4/22,表示前22位是網路地址,後面10位是主機地址。

出了紕漏,舊文重發,20張圖理解 IP 協議

超網和子網

IP 地址的申請有專門的管理機構控制,網際網路地址頂級指派機構會負責分派超大地址塊,地址塊就是一個IP下包換的 IP 地址集合。這些超大地址塊會分配給大型網路提供商,大型的網路提供商又可以再分派小一些的地址塊,這些小的地址塊會分配給中型、小型的網路服務提供商,最後一些企業或機構再跟這些中小型的網路服務提供商申請供內部使用、有對外功能的 IP 地址。

這些分配給大型網路提供商的超大的地址塊就可以被稱為超網,下面分派出去的地址塊可以被稱為子網。當然這個超網和子網的概念是相對的,對於一個企業而言,分給它 IP 的網路服務提供商所擁有的網路就是超網。

出了紕漏,舊文重發,20張圖理解 IP 協議

上圖這個例子中,假設 209.32.0.0/11這個11位字首的網路被分給了一個大型網路服務提供商 A,那它可分配的地址數高達 200多萬個,可想而知,沒有任何一家企業或機構需要這麼多個 IP 地址吧。

B 是比較大的企業,財大氣粗,它去找A申請,於是 A 將 209.34.20.0/22這個字首長度為22位的地址塊分給了 B 。B 的旗下還有分公司,於是它又將 209.34.21.0/24這個地址塊分給了其中的一個子公司。於是這個子公司就擁有了200多個 IP 地址,比如 209.34.21.1/24

什麼是路由聚合

前面在說傳統分類方式的時候,提到了一個缺點,就是路由難以聚合,可能會導致路由表過大,一個路由表可能要存上萬、甚至更多的 C類地址記錄。

CIDR 正好可以解決這個問題,這就是我們所說的路由聚合能力。那什麼叫路由聚合呢。

路由聚合的意思是根據字首進行聚合,有一些網路地址塊它們雖然是不同的,但是他們的一部分字首是相同的,這也是二進位制的特性決定的。

十進位制的 8 和 9是完全不同的兩個數對不對,但是我們把它們改為二進位制的看一下,就會發現他們的前三位都是一樣的。

出了紕漏,舊文重發,20張圖理解 IP 協議

看下面這張圖中的例子,是將兩個20位字首的網路聚合為一個19位字首的路由。

出了紕漏,舊文重發,20張圖理解 IP 協議

我們看到上面這兩個網路 209.34.48.0/20209.34.32.0/20,它們的前19位二進位制都是完全一致的,上面說到的,相同就可以聚合,所以將前19位聚合,聚合成一個 19位字首的網路,也就是 209.34.32.0/19

當有訪問到 209.34.48.0/20209.34.32.0/20 這兩個網路中的地址時,其實它們兩個對外都是顯示的  209.34.32.0/19,也就是說這兩個網路都會命中 19位字首的路由記錄,也就縮小了這個路由器的記錄規模,而到哪個具體的 IP,就靠子網路中的路由了。

這相當於一種分而治之的策略,保證頂層路由表不會過大,子路由表也不會過大。

IPv6

即使有了 CIDR 分類法,IPv4 的數量依然十分緊俏。目前 IPv4的地址已全部分配完畢,分到中國的大概有3億多,而中國的終端裝置這麼多,大多數情況下要多個裝置共用一個地址,這種情況下就要藉助 NAT 技術了。

什麼是 NAT

NAT 就是讓多個內網主機,轉成一個公網IP來連線網際網路。拿平時用微信聊天來說,我們在公司的時候那麼多同事共用一個熱點,訊息是怎麼來回傳送,而且每次都準確的到達終端的呢。

當傳送訊息的時候,訊息經過 NAT 裝置的轉發,將傳送地址變換為當前網路對外的公網地址;

當接收到訊息時,訊息經過 NAT 裝置,根據 NAT 裝置記錄的資訊(和埠號有關),將訊息轉發給對應的內網終端。

但是 NAT 會導致網路的效能變差,而且 NAT 也是有數量限制的。這就使得 IPv6 勢在必行了,目前,有很大一部分網際網路公司都已經支援 IPv6了。

IPv6地址長度為 128位(bit),是IPv4的4倍。其所包含的 IP 個數為 個,這個數字太大了,這麼說吧,按照現在的人口數,隨便用,根本就用不完。

表示方法

常用的就是前面兩種。

冒分十六進位制表示法

用 8 組冒號分隔的16進位制數分隔,例如 2408:8207:2462:bcc0:89b:16e1:771d:4bec

0位壓縮表示法

在某些情況下,一個IPv6地址中間可能包含很長的一段0,可以把連續的一段0壓縮為“::”。但為保證地址解析的唯一性,地址中”::”只能出現一次,例如:

FF01:0:0:0:0:0:0:1101 → FF01::1101

0:0:0:0:0:0:0:1 → ::1

0:0:0:0:0:0:0:0 → ::

IPv6的特點

  1. IP地址依然適應網際網路分層構造。分配與其地址結構相適應的IP地址,儘可能避免路由表膨脹。

  2. 包首部長度採用固定的值 (40 位元組),不再採用首部檢驗碼。簡化首部結構,減輕路由器負荷。路由器不再做分片處理(透過路徑 MTU 發現只由傳送端主機進行分片處理),提升了效能。

  3. 支援即插即用功能,即使沒有DHCP 伺服器也可以實現自動分配IP 地址。

  4. 採用認證與加密功能,應對偽造 IP 地址的網路安全功能以及防止線路竊聽的功能 (IPsec)。

IPv4 協議格式

出了紕漏,舊文重發,20張圖理解 IP 協議

版本

版本欄位佔用 4 bit,用來標示當前使用的 IP 協議版本,只有 IPv4(0100) 和 IPv6(0110) 兩個版本區分。

首部長度

首部長度表示佔32bit的數目,也就是有多少個4位元組(32bit/8=4位元組),比如首部長度是5,就表示有5個4位元組,也就是20個位元組。

而用來表示首部長度的欄位是4bit,這樣一來它可表示的最大長度就是二進位制的「1111」,也就是2^4-1=15,也就是最大可以是 15個4位元組,也就是15*4=60個位元組,也就是說首部的最大長度是60個位元組,而透過圖可以看出來固定的部分佔20位元組,那可選項部分的最大長度就是40位元組。

服務型別

出了紕漏,舊文重發,20張圖理解 IP 協議

服務型別,英文全稱 Type of Service。用來標示是一個什麼型別的應用正在使用IP協議。

前面 3 個bit 用來標示優先順序,但現在已經被忽略了。接著 4 個bit 用來標示子型別,每一個bit分別代表最小延遲、最大吞吐量、最高可靠性、最小費用。例如 Telnet 應用要求最小延遲,所以這4個bit分別是 「1000」。

最後一個bit是保留位,但必須是0。

但是現在很少有應用支援 TOS,所以瞭解一下就可以了。這屬於理想很豐滿,現實很骨感的一個體現。標準是標準,但是實現上會有一定差異。

總長度欄位

IP 報文除了首部還要攜帶資料,總長度欄位指整個 IP 報文的長度,單位是位元組。總長度欄位佔2個位元組,16bit,這樣算下來,總共可以表示2^15-1 ,也就是65535個位元組。雖然可以表示這麼多位元組,但是絕多數情況下都不會一次性傳輸這麼大的資料量,會有很多因素影響每個資料包的最大值。

資料包的最大長度主要和上層應用限制和MTU限制有關係。

例如DNS服務就限制資料包最大長度為 512位元組。

另外我們常用的乙太網 MTU (最大傳輸單元)就是 1500位元組,所以在乙太網上的報文不能超過 1500位元組。

可以用 netstat -in 檢視本機網路介面的 MTU。

出了紕漏,舊文重發,20張圖理解 IP 協議

總長度-首部長度=資料長度。有一種情況,乙太網要求報文的最小長度是46位元組,但是 IP 資料包的總長度可能不足46位元組,例如只傳輸很少的資料,這種情況下,乙太網鏈路層就要將不足46位元組的部分補全。這樣一來,當接收方IP層接到這個報文後,就可以透過總長度欄位和首部長度得出真正的資料長度,從而將後面多餘的資料部分去掉。

分片標示

出了紕漏,舊文重發,20張圖理解 IP 協議

如果報文超過 IP 層允許的最大報文長度,就會進行 IP 分片,將原本的大報文分片成一個個小的報文,每一個小的報文都可能會從不同的路徑傳送到目標主機,而每一個分片報文傳送到目的主機的順序也不一定是按照原有順序到達的。所以,在目的主機端獲取到所有的報文分片後,要按照原始的順序將一個個小的分片還原成原始的報文。

在還原的過程中就需要知道各個分片的順序,標誌、標示和片偏移欄位就是為了完成這個還原的過程。

標誌欄位,當資料包被分片後,來自一個大報文的每個分片都會被賦予相同的值,用來表示這些分片來自同一個報文,在報文還原的時候用。

標示欄位為 3 佔3個bit,第一位始終是0,第二位是DF位,如果是1表示不分片,第三位是MF,如果是1,表示這個分片不是最後一個,後面還有更多的分片。

片偏移欄位表示這個分片的偏移量,單位是 8 個位元組,也就是 8*8=64個bit。例如第一個分片的偏移量是0,第二個分片的偏移量是1,則第二個分片相對第一個分片的偏移量是1,也就是 8 個位元組。如下圖所示。

出了紕漏,舊文重發,20張圖理解 IP 協議

如果第二個偏移量的值是3,則相對於第一個分片的偏移量是 3*8位元組=24位元組。

TTL

IP資料包的生存時間,單位不是時間單位,而是跳數。在網路上,沒經過一個路由器,叫做一跳,例如我們經常聽到的下一跳路由,就是指一個資料包要經過的下一個路由器。

一般TTL是32或64,由初始主機設定,表示這個IP報文最多可經過32個路由或64個路由,每經過一個路由器,TTL 的值就減一,當這個值為0時,路由器就直接將這個報文丟棄。併傳送 ICMP 報文給源主機,由源主機商的服務決定是重發還是怎麼樣。

之所以要設定一個值,是防止浪費太多網路資源,如果一個報文經過了好多路由器還沒有到達目的地,很有可能就是網路有問題了,比如進入了一個迴圈網路,或者目的端未聯網。

協議

協議欄位,長度為8個bit,標識了上層所使用的協議,下面是幾個比較常用的協議號。1:ICMP,2:IGMP,6:TCP,17:UDP

首部檢驗和

首部檢驗和用來檢驗一份報文的正確性,當報文到達目的端後,用首部檢驗和規定的校驗方法計算,並用計算出的結果和此報文字身攜帶的首部檢驗和欄位做比較,如果結果一致,則說明報文沒有問題,如果結果不一致,則直接丟棄報文。

在傳輸過程中 TTL 的值會一點點減小,所以在TTL減小的同時,也會動態調整首部檢驗和的內容,因為如果首部檢驗和如果不根據TTL進行調整的話,在報文達到目的端後,根據首部各欄位的值進行計算,由於TTL已經減小,最終算出的檢驗和必定會與最開始的檢驗和不一致,即使是沒有問題的報文也會被丟棄。

可選項

可選項可有可無,它有如下幾種功能:

• 安全和處理限制(用於軍事領域)

• 記錄路徑(讓每個路由器都記下它的 IP地址)

• 時間戳(讓每個路由器都記下它的 IP地址和時間)

• 寬鬆的源站選路(為資料包指定一系列必須經過的 IP地址)

• 嚴格的源站選路(與寬鬆的源站選路類似, 但是要求只能經過指定的這些地址, 不能經過其他的地址)。

這些選項很少被使用,並非所有的主機和路由器都支援這些選項。選項欄位一直都是以 32 bit作為界限,在必要的時候插入值為 0的填充位元組。這樣就保證 IP首部始終是32 bit的整數倍。但是最大長度不能超過40位元組。

資料

資料就是真正要傳輸的內容了,當然包括上一層的頭資訊,例如 TCP頭、UDP頭。

IPv6 協議格式

出了紕漏,舊文重發,20張圖理解 IP 協議

版本

版本欄位佔用 4 bit,用來標示當前使用的 IP 協議版本,IPv6 固定為 0110,也就是 6 。

通訊量類

相當於IPv4 的 TOS (Type Of Service)欄位,佔用8 bit。由於 TOS 在 IPv4 中幾乎都沒有什麼用處,未來可能會刪掉這個欄位。

流標號

佔用20bit,準備用於服務質量(QoS)控制。使用這個欄位提供怎樣的服務已經成為未來研究的課題。不使用 QoS時,直接將所有位設定為 0 即可。

在進行服務質量控制時,將流標號設定為一個隨機數,然後利用一種可以設定流的協議 RSVP (Resource Reservation Protocol)在路由器上進行QoS 設定。當某個包在傳送途中需要 QoS時,需要附上 RSVP 預想的流標號。路由器接收到這樣的 IP 包後先將流標號作為查詢關鍵字,迅速從服務質量控制資訊中查詢並做相應處理。

此外,只有流標號、源地址以及目標地址三項完全一致時,才被認為是一個流(例如資料包進行了分片)。

有效載荷長度

佔用 16bit,有效荷載長度是指包的資料部分的長度。IPv4的總長度是指包含首部在內的所有長度。然而IPv6中的這個有效載荷長度不包括首部,只表示資料部分的長度。

下一個首部

佔用 8 bit,相當於IPv4中的協議欄位。通常表示IP的上一層協議是TCP或UDP。不過在有IPv6擴充套件首部的情況下,該欄位表示後面第一個擴充套件首部的協議型別。

跳數限制(Hop Limit)

佔用 8 bit。與 IPv4中的TTL概念一致。為了強調“可透過路由器個數”這個概念,才將名字改為Hop Limit。資料每經過一次路由器就減1,減到0則丟棄資料。

源地址

佔用128bit,16位元組。表示傳送端IP地址。因為 IPv6 長度就是128bit。

目標地址

佔用128bit,16位元組。表示接收端IP地址。

擴充套件首部

IPv6的首部長度是固定的,共40位元組。IPv4中的可選項就沒地方放了,而 IPv6 增加了擴充套件首部的概念,透過擴充套件首部來實現IPv4中的可選項。在IPv4中可選項長度固定為40位元組,但是在IPv6中沒有這樣的限制。也就是說,IPv6的擴充套件首部可以是任意長度。擴充套件首部當中還可以包含擴充套件首部協議以及下一個擴充套件首部欄位。

資料

要傳輸的資料,當然也就包含上層的頭資訊,例如UDP頭、TCP頭。

路由選擇

IP協議有一個特別重要的特質就是路由選擇,就是決定一個 IP 資料包從哪條路走,最終能不能成功的到達目的端,全靠 IP 的路由選擇功能。

出了紕漏,舊文重發,20張圖理解 IP 協議

如上圖所示,主機1想把資料發往主機3,中間經過兩個路由器,真實環境下會更多。最終路徑假設是圖中紅線連線的部分,每一個紅線都稱為一跳。

IP資料包在每次發往下一跳地址的時候都會被重新封裝,封裝的頭資訊中的目的地址就是下一跳的 IP 地址。

每一個裝置是怎麼得到下一跳 IP 的呢,這就要提到路由表了。

路由器(包括可轉發資料的主機)中維護著一張路由表,主要存放網路、主機與下一跳的對應關係。例如下表這樣:

目標子網掩碼下一跳網路介面
192.168.8.0255.255.255.00.0.0.0en0
114.21.1.0255.255.255.0114.21.1.100en0
0.0.0.00.0.0.0192.168.8.1en1

差錯報告

前面說了,IP 協議不可靠,不保證資料一定能正確到達目的端,但是它還是提供了必要的差錯報告機制,用來返回給上層使用程式,讓上一層知道當前傳輸的資料發生了什麼錯誤。至於如何處理,就不管了。

差錯報文用 ICMP 協議傳送,ICMP 是網際網路控制報文協議,分為主動查詢報文和差錯報告報文,主動查詢的例如 ping命令,絕大多數都是為了表示資料傳輸過程中發生了錯誤,以此來提示傳送端。

傳送ICMP差錯報文

例如當資料包到達一個路由器,在路由器搜尋了路由表的所有記錄後,仍然沒有發現合適的記錄,並且路由表也沒有配置預設項(預設項就是在沒有找到絕對匹配的記錄時預設傳送的配置),這時候就會傳送一個 ICMP 差錯報文,表示網路或主機不可達,傳送給誰呢,傳送給這個IP資料包的傳送端。

傳送ICMP重定向報文

出了紕漏,舊文重發,20張圖理解 IP 協議

重定向報文更像是一種最佳化策略,如圖,假設一個主機同時連線了兩臺路由器A和B,而路由表中只有其中一個路由器A的配置項。在某次傳送資料時,主機1將資料包發給下一跳路由器A,而路由器A接收到資料包後,透過路由選擇,下一跳是路由器B,就是圖中紅色的①②的路徑,而此時路由器A發現自身、路由器B、主機1在同一區域網中,此時,路由器A便向主機1傳送一個ICMP重定向報文。用來告訴主機1,“下次再有類似的包,直接發給路由器B就行了,別繞彎子了”。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024923/viewspace-2938986/,如需轉載,請註明出處,否則將追究法律責任。

相關文章