TCP/IP 第三章 IP:網際協議
引言
IP是TCP/IP協議族中最核心的協議。所有的TCP、UDP、ICMP及IGMP資料都以IP資料報格式傳輸。IP提供不可靠、無連線的資料報傳送服務
- 不可靠:它不能保證IP資料報能成功地到達目的地。IP僅提供最好的傳輸服務。如果發生某種錯誤,如某個路由器暫時用完了緩衝區,IP有一個簡單的錯誤處理演算法:丟棄該資料報,然後傳送ICMP訊息報給信源端。任何要求的可靠性必須由上層來提供(如TCP)
- 無連線:IP並不維護任何關於後續資料報的狀態資訊。每個資料報的處理是相互獨立的。即IP資料報可以不按傳送順序接收。如果一信源向相同的信宿傳送兩個連續的資料報(先是A,後是B),每個資料報都是獨立地進行路由選擇,可能選擇不同的路線,因此B可能在A到達之前先到達
IP首部
IP資料報的格式如圖所示:
IP資料報說明:
- 普通的IP首部長為20個位元組,除非含有選項欄位。最高位在左邊,記為0bit;最低位在右邊,記為31bit
- 4個位元組的32 bit值以下面的次序傳輸:首先是0~7bit,其次8~15bit,然後16~23bit,最後是24~31bit。這種傳輸次序稱作big endian位元組序。由於TCP/IP首部中所有的二進位制整數在網路中傳輸時都要求以這種次序,因此又稱作網路位元組序
- 目前的協議版本號是4,因此IP有時也稱作IPv4
- 服務型別(TOS)欄位包括一個3 bit的優先權子欄位(現在已被忽略),4bit的TOS子欄位和1bit未用位,但必須置0。4bit的TOS分別代表:最小時延、最大吞吐量、最高可靠性和最小費用。 4 bit中只能置其中1bit。如果所有4bit均為0,那麼就意味著是一般服務。下圖列出了對不同應用建議的TOS值
- 現在大多數的TCP/IP實現都不支援TOS特性
- 總長度欄位是指整個IP資料報的長度,以位元組為單位。由於該欄位長16位元,所以IP資料報最長可達65535位元組
- 標識欄位唯一地標識主機發送的每一份資料報。通常每傳送一份報文它的值就會加1
- TTL生存時間欄位設定了資料報可以經過的最多路由器數。它指定了資料報的生存時間。 TTL的初始值由源主機設定(通常為32或64),一旦經過一個處理它的路由器,它的值就減去1。當該欄位的值為0時,資料報就被丟棄,併發送ICMP報文通知源主機
- 協議欄位可以識別是哪個協議向IP傳送資料
- 首部檢驗和欄位是根據IP首部計算的檢驗和碼
- 任選項,是資料報中的一個可變長的可選資訊。這些選項很少被使用,並非所有的主機和路由器都支援這些選項
IP路由選擇
IP路由選擇是簡單的,特別對於主機來說。如果目的主機與源主機直接相連(如點對點鏈路)或都在一個共享網路上(乙太網或令牌環網),那麼IP資料報就直接送到目的主機上。否則,主機把資料報發往一預設的路由器上,由路由器來轉發該資料報
大多數多使用者系統,都可以配置成一個路由器。我們可以為它指定主機和路由器都可以使用的簡單路由演算法。本質上的區別在於主機從不把資料報從一個介面轉發到另一個介面,而路由器則要轉發資料報
(1)IP資料報處理過程
IP可以從TCP、UDP、ICMP和IGMP接收資料報(即在本地生成的資料報)並進行傳送,或者從一個網路介面接收資料報(待轉發的資料報)並進行傳送。IP層在記憶體中有一個路由表。當收到一份資料報並進行傳送時,它都要對該表搜尋一次。當資料報來自某個網路介面時, IP首先檢查目的IP地址是否為本機的IP地址之一或者IP廣播地址。
如果是這些地址:資料報就被送到由IP首部協議欄位所指定的協議模組進行處理。如果不是這些地址:如果IP層被設定為路由器的功能,那麼就對資料報進行轉發;否則資料報被丟棄。
(2)路由表包含的資訊
路由表中的每一項都包含下面這些資訊:
- 目的IP地址:它既可以是一個完整的主機地址,也可以是一個網路地址,由該表目中的標誌欄位來指定。主機地址有一個非0的主機號,以指定某一特定的主機,而網路地址中的主機號為0,以指定網路中的所有主機(如乙太網,令牌環網)。
- 下一跳路由器的IP地址,或者有直接連線的網路IP地址:下一跳路由器是指一個在直接相連網路上的路由器,通過它可以轉發資料報。下一跳路由器不是最終的目的,但是它可以把傳送給它的資料報轉發到最終目的。
- 標誌:其中一個標誌指明目的IP地址是網路地址還是主機地址,另一個標誌指明下一跳路由器是否為真正的下一跳路由器,還是一個直接相連的介面。
(3)IP路由選擇主要完成的功能
IP路由選擇是逐跳地進行的。IP並不知道到達任何目的的完整路徑(當然,除了那些與主機直接相連的目的)。所有的IP路由選擇只為資料報傳輸提供下一跳路由器的IP地址。它假定下一跳路由器比傳送資料報的主機更接近目的,而且下一跳路由器與該主機是直接相連的。
- 搜尋路由表,尋找能與目的IP地址完全匹配的表目(網路號和主機號都要匹配)。如果找到,則把報文傳送給該表目指定的下一站路由器或直接連線的網路介面(取決於標誌欄位的值)
- 搜尋路由表,尋找能與目的網路號相匹配的表目。如果找到,則把報文傳送給該表目指定的下一站路由器或直接連線的網路介面
- 搜尋路由表,尋找標為“預設”的表目。如果找到,則把報文傳送給該表目指定的下一站路由器
說明:
- 如果上面這些步驟都沒有成功,那麼該資料報就不能被傳送。如果不能傳送的資料報來自本機,那麼一般會向生成資料報的應用程式返回一個“主機不可達”或“網路不可達”的錯誤
- 完整主機地址匹配在網路號匹配之前執行。只有當它們都失敗後才選擇預設路由
- 為一個網路指定一個路由器,而不必為每個主機指定一個路由器,這是IP路由選擇機制的一個基本特性。這樣做可以極大地縮小路由表的規模,例如Internet上的路由器有隻有幾千個表目,而不會是超過100萬個表目
子網定址
所有的主機都要求支援子網編址。不是把IP地址看成由單純的一個網路號和一個主機號組成,而是把主機號再分成一個子網號和一個主機號。原因是:A類和B類地址為主機號分配了太多的空間,可分別容納的主機數為2^24-2和2^16-2,在一個網路中人們並不安排這麼多的主機。
全0或全1的主機號都是無效的,因此總數減去2。
子網對外部路由器來說隱藏了內部網路組織(一個校園或公司內部)的細節。縮減了路由表的規模,但子網對於子網內部的路由器是不透明的。
子網掩碼
任何主機在引導時進行的部分配置是指定主機IP地址。除了此以外,還需要知道有多少位元用於子網號和多少位元用於主機號。這是在引導過程中通過子網掩碼來確定的。子網掩碼是一個32 bit的值,其中值為1的位元留給網路號和子網號,為0的位元留給主機號。
一個B類地址的兩種不同的子網掩碼格式:
第一個例子,子網號和主機號都是8 bit。第二個例子,子網號是10 bit,主機號是6 bit
特殊情況的IP地址
介紹7個特殊的IP地址。0表示所有位元位全為0;-1表示所有位元位全為1; netid、subnetid和hostid分別表示不為全0或全1的對應欄位。子網號欄為空表示該地址沒有進行子網劃分
ifconfig和netstat命令
- ifconfig(8)命令一般在引導時執行,以配置主機上的每個介面。由於撥號介面可能會經常接通和結束通話(如SLIP鏈路),每次線路接通和結束通話時,ifconfig都必須以某種方法執行。這個過程如何完成取決於使用的SLIP軟體
- netstat(1)命令提供系統上的介面資訊。-i引數將打印出介面資訊,-n引數則打印出IP地址,而不是主機名字.這個命令打印出每個介面的MTU、輸入分組數、輸入錯誤、輸出分組數、輸出錯誤、衝突以及當前的輸出佇列長度。