《圖解TCP/IP》讀書筆記四:IP協議

衣舞晨風發表於2018-02-10

這裡寫圖片描述

4.1 IP即網際協議

      TCP/IP的心臟是網際網路層。這一層主要是由IP(Internet Protocol)和ICMP(Internet Control Message Protocol)兩個協議組成。

4.1.1 IP相當於OSI參考模型的第3層

      IP(IPv4、IPv6)相當於OSI參考模型中的第3層–網路層。
      網路層的主要作用是“實現終端節點之間的通訊”。這種終端節點之間的通訊也叫“點對點(end-to_end)通訊”。
      網路層的下一層—資料鏈路層的主要作用是在互聯同一種資料鏈路的節點之間進行包傳遞。
這裡寫圖片描述

4.1.2 網路層與資料鏈路層的關係

  • 資料鏈路層提供直連兩個裝置之間的通訊功能。
  • 網路層的IP則負責在沒有直連的兩個網路之間進行通訊傳輸。

這裡寫圖片描述

      仔細分析機票和火車票,每張票只能夠在某一限定區間內移動。此處的“區間內”就如同通訊網路上的資料鏈路。而這個區間內的出發地點和目的地點就如同某一個資料鏈路的源地址和目標地址等首部資訊。這個全稱的行程表的作用就相當於網路層。

4.2 IP基礎知識

      IP大致分為三大作用模組,它們是IP定址、路由(最終節點為止的轉發)以及IP分包與組包。

4.2.1 IP地址屬於網路層地址

      MAC地址在資料鏈路層,是用來標識同一個鏈路中不同計算機的一種識別碼。

      網路層的IP,也有這種地址資訊。一般叫做IP地址。IP地址用於在“連線到網路中的所有主機中識別出進行通訊的目標地址”。因此,在TCP/IP通訊中所有主機或路由器必須設定自己的IP地址。

      不論一臺主機與哪種資料鏈路連線,其IP地址的形式都保持不變。乙太網、無線區域網、PPP等,都不會改變IP地址的形式。網路層對資料鏈路層的某些特性進行了抽象。資料鏈路的型別對IP地址形式透明,這本身就是其中抽象化的一點。

      另外,在網橋或交換集線器等物理層或資料鏈路層資料包轉發裝置中,不需要設定IP地址(在用SNMP進行網路管理時有必要設定IP地址)。因為這些裝置只負責將IP包轉化為0,、1位元流轉發或對資料鏈路幀的資料部分進行轉發,而不需要應對IP協議。

4.2.2 路由控制

      路由控制(Routing)是指將分組資料傳送到最終目標地址的功能。一個資料包之所以能夠成功地到達最終的目標地址,全靠路由控制。

傳送資料至最終目標地址

      Hop譯為中文“跳”。它是指網路中的一個區間。IP包正式在網路中一個跳間被轉發。因此IP路由也叫做多跳路由。在每個區間決定著包在下一跳被轉發的路徑。
這裡寫圖片描述

一跳的範圍
一跳(1 Hop)是指利用資料鏈路層以下分層的功能傳輸資料幀的一個區間。
乙太網等資料鏈路中使用MAC地址傳輸資料幀。此時的一跳是指從源MAC地址到目標MAC地址之間傳輸幀的區間。 就是說它是主機或路由器網路卡不經其他路由器而能直接到達的相鄰主機或路由器網路卡之間的一個區間。在一跳的這個區間內,電纜可以通過網橋或交換集線器相連,不會通過路由器或閘道器相連。

      多跳路由是指路由器或主機在轉發IP資料包時只指定下一個路由器或主機,而不是將到最終目標地址為止的所有通路全都指定出來。因為每一個區間(跳)在在轉發IP資料包時會分別指定下一跳的操作,直至包達到最終的目標地址。

路由控制表

      為了將資料包發給目標主機,所有主機都維護著一張路由控制表(Routing Table)。該表記錄IP資料在下一步應該發給哪個路由器。IP包將根據這個路由表在各個資料鏈路上傳輸。
這裡寫圖片描述

資料鏈路的抽象化

      IP是實現多個資料鏈路之間通訊的協議。資料鏈路根據種類的不同各有特點。對這些不同資料鏈路的相異特性進行抽象化也是IP的重要作用之一。資料鏈路的地址可以被抽象化為IP地址。因此,對IP的上一層來說,不論底層資料鏈路使用乙太網還是無線LAN、PPP,都將被一視同仁。

      不同資料鏈路有個最大的區別,就是它們各自最大傳輸單位(MTU:Maximum Transmission Unit)不同。就好像人們在郵寄或行李時有各自的大小限制一樣。

      MTU的值在乙太網中是1500位元組,在FDDI中是4352位元組,而ATM則為9180位元組。IP的上一層可能會要求傳送比這些MTU更多位元組的資料,因此必須線上路上傳送比包長還要小的MTU。

      為了解決這個問題,IP進行分片處理(IP Fragmentation),所謂分片,就是講較大的IP包分成多個較小的IP包。分片的包到了對端目標地址後再被組合起來傳給上一層。從IP的上層看,它完全可以忽略資料包在途中的各個資料鏈路上的NTU,而只需要按照源地址傳送的長度接收資料包。IP以這種方式抽象化了資料鏈路層,使得從上層更不容易看到底層網路構造的細節。

4.2.4 IP屬於面向無連線型

      IP面向無連線。即在發包之前,不需要建立與對端目標地址之間的連線。上層如果遇到需要傳送給IP的的資料,該資料會立即被壓縮成IP包傳送出去。

      面向有連線的情況下,需要事先建立連線。一個沒有建立連線的主機也不能傳送資料過來。

      面向無連線的情況不同,即使對端主機關機或不存在,資料包還是會被髮送出去。反之,對於一臺主機來說,它會何時從哪裡收到資料也是不得而知的。

為什麼IP要採用面向無連線呢?

      主要有兩點原因: 一是為了簡化,二是為了提速。 面向連線比起面向無連線處理相對複雜。甚至管理每個連線本身就是一個相當繁瑣的事情。 此外,每次通訊之前都要實現建立連線, 又會降低處理速度。需要有連線時,可以委託上一層提供此項服務。因此,IP為了實現簡單化與高速化採用面向無連線的方式。

為了提高可靠性,上一層的TCP採用面向有連線型
       IP提供盡力服務(Best Effort),意指”為了把資料包傳送到最終目標地址,盡最大努力。”
      然而,它並不做”最終收到與否的驗證”。 IP資料包在途中可能會發生丟包、錯位以及資料量翻倍等問題。
      如果傳送端的資料未能真正傳送到對端目標主機會造成嚴重問題。
      例如,傳送一封電子郵件,如果郵件內容中很重要的一部分丟失,會讓收件方無法及時獲取資訊。
      因此提高通訊的可靠性很重要。TCP就提供這種功能。如果說IP只負責將資料發給目標主機,那麼TCP則負責保證對端主機確實收到資料。
      那麼,有人可能會提出疑問:為什麼不讓IP具有可靠傳輸的功能,從而把這兩種協議合併到一起呢?
      這其中的緣由就在於,如果要一種協議規定所有的功能和作用, 那麼該協議的具體實施和程式設計就會變得非常複雜,無法輕易實現。相比之下,按照網路分層,明確定義每層協議的作用和責任以後,針對每層具體的協議進行程式設計會更加有利於該協議的實現。
      網路通訊中如果能進行有效分層,就可以明確TCP與IP各自協議的最終目的,也有利於後續對這些協議進行擴充套件和效能上的優化。分層也簡化了每個協議的具體實現。網際網路能夠發展到今天,與網路通訊的分層密不可分。

4.3 IP地址基礎知識

      在用TCP/IP通訊時,用IP地址識別主機和路由器。為了保證正常通訊,有必要為每個裝置配置正確的IP地址。在網際網路通訊中,全世界都必須設定正確的IP地址。否則,根本無法實現正常的通訊。 因此,IP地址就像是TCP/IP通訊的一塊基石。

4.3.1 IP地址的定義

      IP地址(IPv4)由32位正整數來表示。TCP/IP通訊要求將這樣的IP地址分配給每一個參與通訊的主機。IP地址在計算機內部都以二進位制方式被處理。 然而,由於人類社會並不習慣於採用二進位制方式,需要採用一種特殊的標記方式。那就是將32位的IP地址以每8位為一組,分成4組,每組以”.”隔開,再將每組數轉換為十進位制數。下面舉例說明這一方法。

這裡寫圖片描述
      實際上,IP地址並非是根據主句臺數來配置的,而是每臺主機上的每一塊網路卡(NIC)都要設定IP地址。通常一塊網路卡只設定一個IP地址,其實一塊網路卡也可以配置多個IP地址。此外,一臺路由器通常都會配置兩個以上的網路卡,因此可以設定兩個以上的IP地址。

4.3.2 IP地址由網路和主機兩部分標識組成

      IP地址由“網路標識(網路地址)”和“主機標識(主機地址)”兩部分組成。

      網路標識在資料鏈路的每個段配置不同的值。網路標識必須保證相互連線的每個段的地址不相重複。而相同段內相連的主機必須有相同的網路地址。IP地址的“主機標識”則不允許在同一個網段內重複出現。

      可以通過設定網路地址和主機地址,在相互連線的整個網路中保證每臺主機的IP地址都不會相互重疊,即IP地址具有了唯一性。

      IP包被轉發到途中某個路由器,正是利用目標IP地址的網路標識進行路由。因為就是不看主機標識,只要一見到網路標識就能判斷出是否為該網段內的主機。
這裡寫圖片描述

4.3.3 IP地址的分類

      IP地址分為四個級別,A、B、C、D類(還有一個一直未使用的E類)。它根據IP地址中從第1位到第4位的位元列對其網路標識和主機標識進行區分。

A類地址

      A類IP地址是首位以“0”開頭的地址,從第1位到第8位(去掉分類位剩下7位)是它的網路標識。用十進位制表示的話,0.0.0.0-127.0.0.0是A類網路地址。A類地址的後24位相當於主機標識。因此,一個網段內可容納的主機地址上限為16,777,214個。

B類地址

      B類地址是前兩位為“10”的地址,從第1位到第16位是它的網路標識,用十進位制表示,128.0.0.1-191.255.0.0是B類網路地址,B類地址的後16位相當於主機地址。因此,一個網段內可容納主機地址上限為65,534個。
這裡寫圖片描述

C類地址

      C類IP地址是前三位為“110”的地址。從第1位到第24位是它的網路標識。用十進位制表示的話,192.168.0.0-239.255.255.0是C類的網路地址。C類地址的後8位相當於主機標識。因此,一個網段內可容納主機地址上限為254個。

D類地址

      D類IP地址是前四位為“1110”的地址。從第1位到第32位是它的網路標識,用十進位制表示,224.0.0.0-239.255.255.255是D類的網路地址。D類沒有主機標識,常被用於多播。

關於分配IP主機地址的注意事項

      要用位元位表示主機地址時,不可以全部為0或全部為1。因為全部為0在標識對應的網路地址或IP地址不可獲知的情況下才使用。全部為1的主機通常作為廣播地址。

      因此,在分配過程中,應該去掉這兩種情況。這也是為什麼C類地址每個網段最多隻能有254(2的8次方-2=254)個主機地址的原因。

4.3.6 子網掩碼

分類造成浪費?

      一個IP地址只要確定了其分類,也就確定了它的網路標識和主機標識。例如A類地址前8位(除首位“0”還有7位)、B類地址前16位(除首位“10”還有14位)、C類地址前24位(除首位“110”還有21位)分別是它們各自的網路標識部分。

由此,按照每個分類所表示的網路標識的範圍如下所示:
這裡寫圖片描述
      用“1”表示IP網路地址的位元範圍,用“0”表示IP主機的地址範圍。
    將它們以10進製表示,如下圖所示。其中“1”的部分是網路地址部分,“0”的部分是主機地址部分。
這裡寫圖片描述
    網路標識相同的計算機必須同屬同一個鏈路。例如,架構B類IP網路時,理論上一個鏈路內允許6萬5千多臺計算機連線。然而,在實際網路架構當中,一般不會有在同一個鏈路上連線6萬5千多臺計算機的情況。因此,這種網路結構實際上市不存在的。

    因此,直接使用A類或B類地址,確實有些浪費。隨著網際網路的覆蓋範圍逐漸增大,網路地址會越來越不足以應對需求,直接使用A類、B類、C類地址就更顯的浪費資源。為此,人們已經開始一種新的組合方式以減少這種浪費。

子網和子網掩碼

    現在,一個IP地址的網路標識和主機標識已不再受限於該地址的類別,而是一個叫做“子網掩碼”的識別碼通過子網網路地址細分出比A、B、C更小粒度的網路。這種方式實際上就是將原來A、B、C類等分類中的主機地址部分用作子網地址,可以將原網路分為多個物理網路的一種機制。

    子網劃分實際上就是將原來的兩級IP地址轉變為三級IP地址,表示如下:

IP地址 ::= {<網路號>, <子網號>, <主機號>}

    從上面的表示可以看出,子網劃分就是在32位中借了幾位用來表示子網號,注意,這裡的網路號的位數是不變的,子網號是從主機號中借走的,子網劃分實際上就是減少了主機數,分配到不同的子網,每個子網包含一定的主機數。

    子網的概念也就可以理解為,將一個大的網路在其內部劃分成幾個小的子網,但是需要注意的是,對於該網路的外層來看,還是一個大的網路,只有該網路內部才可以看到其進行了子網劃分。例如:某個機構給某高校分配了一個大的網路,而該高校內部又進行了子網劃分,將不同的子網分配給不同的學院,此時對於該機構來說,該高校還是一個大的網路,在其看來並沒有變化,只有該高校自己才知道自己內部又進行了子網劃分。

    自從引入子網後,一個IP地址就有了兩種識別碼。一是IP地址本身,另一個是標識網路部的子網掩碼。那麼什麼是子網掩碼呢?在傳輸的過程中,路由器是怎麼識別子網劃分後的IP地址中的網路地址的?如果不提供任何資訊,路由器肯定還是傻傻分不清楚,所以就出現了子網掩碼。

    子網掩碼用二進位制標識,也是一個32位的數字。它對應IP地址網路標識部分的位全部是“1”,對應IP地址主機標識的部分全部為“0”。由此,一個IP地址可以不再受限於自己的類別,而是可以用這樣的子網掩碼自由的定位自己的網路標識長度。當然,子網掩碼必須是IP地址的首位開始連續的“1”。

    對於子網掩碼,目前有兩種表示方法。以172.20.100.52的前26位是網路地址的情況為例,以下是其中一種表示方法,它將IP地址與子網掩碼地址分別用兩行來表示。
這裡寫圖片描述

    另一種標識方式如下。它在每個IP地址後面追加網路地址的位數用“/”隔開。
這裡寫圖片描述

    不難看出,在第二種方式下記述網路地址時可以省略後面的“0”。例如172.20.0.0/16跟172.20/16其實是一個意思。

子網掩碼可以靈活指定網路標識的長度:
這裡寫圖片描述

4.4 路由控制

      傳送資料包時所使用的地址是網路層的地址,即IP地址。然而僅僅有IP地址還不足以實現將資料包傳送到對端目的地址,在資料傳送過程中還需要類似於“指明路由器或主機”的資訊,以便真正發往目標地址。儲存這種資訊的就是路由控制表(Routing Table)。實現IP通訊的主機和路由器都必須持有一張這樣的表,它們也正是在這個表格的基礎上才得以進行資料包傳送的。

      路由控制表的形成方式有兩種:一種是管理員手動設定,另一種是路由器與其他路由器相互交換資訊時自動重新整理。前者叫靜態路由控制,後者叫動態路由控制。為了讓動態路由即時重新整理路由表,在網路上互連的路由器之間必須設定好路由協議,保證正常讀取路由控制資訊。

      IP協議始終認為路由表是正確的。然而,IP本身並沒有定義製作路由控制表的協議。即IP沒有製作路由控制表的機制。該表是由一個叫做“路由協議”的協議製作而成。

4.4.1 IP地址與路由控制

      IP地址的網路地址部分用於進行路由控制。

      路由控制表中記錄著網路地址與下一步應該傳送至路由器的地址。在傳送IP包時,首先要確定IP包首部中的目標地址,再從路由控制表中找到該地址具有相同網路地址的記錄,根據該記錄將IP包轉發給相應的下一個路由器。如果路由控制表中存在多條相同網路地址的記錄,就選擇一個最為吻合的網路地址。最為吻合是指相同位數最多的意思。

預設路由

      如果一張路由表中包含所有的網路及其子網的資訊,將會造成浪費。這時,預設路由(Default Route)是不錯的選擇。預設路由是指路由表中任何一個地址都能與之匹配的記錄。

      預設路由一般標記為0.0.0.0/0或default。這裡的0.0.0.0/0並不是指地址是0.0.0.0.由於後面是“/0”,所以沒有標識IP地址。它只是為了避免人們誤以為0.0.0.0是IP地址。

      預設路由是一種特殊的靜態路由,指的是當路由表中與包的目的地址之間沒有匹配的表項時路由器能夠做出的選擇。如果沒有預設路由,那麼目的地址在路由表中沒有匹配表項的包將被丟棄· 預設路由在某些時候非常有效,當存在末梢網路時,預設路由會大大簡化路由器的配置,減輕管理員的工作負擔,提高網路效能。

4.5.3 路徑MTU發現

      為了應對路由器的負荷加重,只要允許,是不希望由路由器進行IP資料包的分片處理的。且分片處理中,一旦某個分片丟失,則會照成整個IP資料包作廢。

      為了應對以上問題,產生了一種新的技術“路徑MTU發現”(Path MTU Discovery)。所謂路徑MTU(Path MTU)是指從傳送端主機到接收端主機之間不需要分片時最大MTU的大小。即路徑中存在的所有資料鏈路中最小的MTU。而路徑MTU發現從傳送主機按照路徑MTU的大小將資料包分片後進行傳送。進行路徑MTU發現,就可以避免在中途的路由器上進行分片處理,也可以在TCP中傳送更大的包。

路徑MTU發現機制(UDP情況下)
這裡寫圖片描述

路徑MTU發現機制(TCP情況下)

這裡寫圖片描述

4.7 IPv4首部

      通過IP進行通訊時,需要在資料的前面加入IP首部資訊。IP首部中包含著用於IP協議進行發包控制時所有的必要資訊。
這裡寫圖片描述

版本(Version)

      由4位元構成,表示標識IP首部的版本號。IPv4的版本號即為4,因此在這個欄位上的值也是“4”。

首部長度(IHL:Internet Header Length)

      由4位構成,表明IP首部的大小,單位為4位元組(32位元). 對於沒有可選項的IP包,首部長度則設定為5. 也就是說,當沒有可選項時,IP首部的長度為20位元組(4*5 = 20). 如果有可選項,這裡設定為6, 即24位元組。

區分服務(TOS:Type Of Service)

      由8位元構成,用來表明服務質量。每一位的具體含義如下:

  • 0,1,2位 優先度
  • 3 最低延遲
  • 4 最大吞吐
  • 5 最大可靠性
  • 6 最小代價
  • 3~6 最大安全
  • 7 未定義

      這個值通常由應用指定。而且現在也鼓勵這種結合應用的特性設定TOS的方法。然而在目前,幾乎所有的網路都無視這個欄位。這不僅僅是因為在符合質量要求的情況下按其要求傳送本身的功能實現起來十分困難,還因為若不符合質量要求就可能會產生不公平的現象。因此實現TOS控制變得極其複雜。這也導致TOS整個網際網路幾乎就沒有被投入使用。不過已有人提出將TOS欄位本身再劃分未DSCP和ECN兩個欄位的建議。

DSCP段與ECN段

這裡寫圖片描述

      DSCP(Differential Services Codeponit,差分服務程式碼點)是TOS(Type Of Service)的一部分。現在統稱為DiffServ,用來進行質量控制。

      ECN(Explicit Congestion Notification,顯式擁塞通告)。

總長度(Total Length)

      表示IP首部與資料部分合起來的總位元組數。該欄位長16位元。因此IP包的最大長度為65535(2^16)位元組。

      目前還不存在能夠傳輸最大長度的65535位元組的IP包的資料鏈路。不過,由於有IP分片處理,從IP的上一層角度看,不論底層採用何種資料鏈路,都可以認為能夠以IP的最大包長傳輸資料。

標識(ID:Identification)

      由16位元構成,用於分片重組。用以分片的標識值相同,不同分片的標識值不同。通常,每傳送一個IP包,它的值也逐漸增長。此外,即使IP相同,如果目標地址、源地址或協議不同的話,也會被認為是不同的分片。

標誌(Flags)

      由3位元構成,表示包被分片的相干資訊。每一位具體含義:
這裡寫圖片描述

片偏移(FO :Fragment Offset)

      由13位元構成,用來標識被分片的每一個分段相對於原始資料的位置。

生成時間(TTL:Time To Live)

      由8位元構成,它最初的意思是以秒為單位記錄當前包在網路上應該生存的期限。然而,在實際中它是指可以中轉多少個路由器的意思。每經過一個路由器,TTL會減少1,直到變成0則丟棄該包。

4.8 IPv6首部格式

      IPv6中為了減輕路由器壓力,省略了首部校驗和欄位(因為TCP和UDP在做校驗和計算的時候使用偽首部,所以可以驗證IP地址或協議是否正確。因此,即使在IP層無法提供可靠傳輸,在TCP或UDP層也可以提供可靠傳輸的服務)。用詞路由器不再需要檢驗和,從而也挺高了包的轉發效率。

      此刻外,分片處理所用的標識碼稱為可選項。為了讓64位CPU計算處理起來方便,IPv6首部及可選項都由8位元組構成。
這裡寫圖片描述

《圖解TCP/IP:第5版》下載地址:
http://download.csdn.net/download/xunzaosiyecao/10245906

個人微信公眾號:
這裡寫圖片描述

作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章