TCPIP協議——IP協議

引言

IP協議是TCP/IP協議族中最核心的協議,所有的TCP,UDP、ICMP以及IGMP等協議都以IP資料報的格式傳輸。IP協議提供最好的傳輸服務,其提供無連線、不可靠的資料傳輸。或許這句話讀起來很矛盾,為什麼說是最好的傳輸服務,但同時又是不可靠的呢。

最好的傳輸可以認為IP協議會盡一切能力到達目的主機,若中途發生錯誤無法到達目的主機,也會返回一個ICMP錯誤報文。收到IP協議返回的錯誤報文後,本機就知道報文沒有成功到達目的主機。而接下來的傳輸可靠性,即重傳,則不屬於IP協議的範疇,而是透過TCP協議(或者自己實現的應用層協議)來保證。

不可靠是指即使傳輸過程中出現錯誤,IP協議並不負責處理報文重傳的工作,而是交給上層協議。

無連線是指IP協議的首部中不儲存維護任何關於後續資料報的相關狀態資訊。

3。2。IP首部

IP資料報的格式如圖3-1:

TCP/IP協議——IP協議

3-1

版本:IP協議的版本號,IPV4即為4

首部長度:包含任意選項,以32位字為單位的長度。由於是一個4位元欄位,可知IP首部最長為16*4位元組,即64位元組

服務型別:包括一個3 bit的優先權子欄位(現在已被忽略),4 bit的TOS子欄位和1 bit未用位但必須置0。4 bit的TOS分別代表:最小時延、最大吞吐量、最高可靠性和最小費用。4 bit中只能置其中1 bit。如果所有4 bit均為0,那麼就意味著是一般服務。

總長度:代表IP資料包的總長(包括其後承載的協議首部與使用者資料),由於其有16bit,單位為位元組數,可知IP資料報的總長度為65536位元組。不過儘管IP首部允許其傳輸如此大的位元組數,乙太網封裝的鏈路層也是不允許的,乙太網封裝的鏈路層,最大允許承載的IP資料報長度為1500位元組。並且主機也要求不能接收超過576位元組的資料報。該限制不會影響到TCP協議,因為TCP協議會主動將資料包分段傳輸。

標識:唯一的標識主機發送的每一份資料報,通常每傳送一份資料報就會加1,在IP分片中起到順序重組的作用。

標誌:標誌該報文型別,在IP分片中代表該報文是否是分片報文

片偏移:分片報文中指明偏移量

生存時間TTL:設定資料報可以經過的路由跳數,每經過一個路由則減1,減到0仍為到達目的主機則丟棄該報文。可解決黑洞路由,報文一直佔用頻寬的問題。TTL最大值為255。

協議:即指明IP首部後承載的協議型別,如ICMP/IGMP/TCP/UDP等,前文曾提到該欄位。

首部檢驗和:僅包括IP資料報首部的檢驗和,檢驗和的計算不包含其承載的IGMP/ICMP等協議的報文內容。檢驗和可以檢驗IP資料報在傳輸過程中,首部是否出現的錯誤。RFC 1071包含了如何計算檢驗和的方法,感興趣可以瞭解。

源IP地址:即前文所述的32位網際網路地址,代表報文的始發主機。

目的ip地址:代表報文的目的主機。

選項:是一個任選項,可以用作以下領域,但很少被使用。

安全和處理限制(詳細內容可參考RFC 1108)

記錄路徑(即報文傳輸過程中,讓經過的路由器記錄其地址)

時間戳(即報文傳輸過程中,讓經過的路由器記錄其時間與地址)

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

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

很少被使用且並不是所有的主機與路由器都實現了這些選項。值得注意的是選項欄位必須是32位的整數倍,因為首部長度是32bit的整數倍。若未達到32位的整數倍,可以用0填充。

3。3。IP路由選路

IP協議提供的最本質的服務之一就是為報文提供選路功能。

IP層的路由功能存在兩種模式,一種是路由器模式,一種是主機模式。一般來說,主機是不作為路由器模式使用。

路由器模式與主機模式的本質區別在於系統是否轉發從網路口接收進來的報文。若配置為主機模式,則對目的ip非本機的報文,系統做丟棄處理,而路由器則會去查詢路由表(提供選路資訊的轉發表),若查詢到則將該報文從對應的網路介面轉發出去,轉發之前需要更改報文的源目MAC地址,且TTL-1(如前文所述,為了防止黑洞路由佔用頻寬),若TTL被減為0,則做丟棄處理不轉發。兩種模式對於目的ip屬於本機或者為廣播地址(廣播地址即前文所述的5類網際網路地址中主機號為全1的網際網路地址)的報文,資料報就被送到由I P首部協議欄位所指定的協議模組進行處理。

包含選路資訊的路由表中,一般都包含以下這些資訊:

目的IP地址:可以是一個主機地址(即全掩碼的IP地址,主機號包含非0值,這種稱為主機路由),也可以是一個網路地址(即非全掩碼的IP地址,主機號為全0,這種稱為網路路由)

下一跳路由器的IP地址或直連IP的網路地址:下一跳路由器的IP地址即報文需要轉發到的下一個網路介面的IP地址(這個網路介面與當前的路由器直連);而直連IP的網路地址會直接標明該網段IP地址的路由出口,報文直接從該出口轉發(前提是該報文的目的IP必須存在,可透過ARP報文探測驗證)。

標誌:指明路由的型別,例如路由是直連網路地址還是真正的下一跳地址,路由時OSPF協議計算地址還是BGP協議學習地址等。

網路介面:為資料報傳輸指定一個網路介面。

IP路由選擇是逐跳地(hop-by-hop)進行的。從這個路由表資訊可以看出,IP並不知道到達任何目的的完整路徑(當然,除了那些與主機直接相連的目的)。所有的I P路由選擇只為資料報傳輸提供下一站路由器的IP地址。它假定下一站路由器比傳送資料報的主機更接近目的,而且下一站路由器與該主機是直接相連的。

IP路由選擇主要完成以下這些功能:

搜尋路由表,尋找能與目的IP地址完全匹配的表目(網路號和主機號都要匹配)。如果找到,則把報文傳送給該表目指定的下一站路由器或直接連線的網路介面(取決於標誌欄位的值)。

搜尋路由表,尋找能與目的網路號相匹配的表目。如果找到,則把報文傳送給該表目指定的下一站路由器或直接連線的網路介面(取決於標誌欄位的值)。目的網路上的所有主機都可以透過這個表目來處置。例如,一個乙太網上的所有主機都是透過這種表目進行尋徑的。這種搜尋網路的匹配方法必須考慮可能的子網掩碼。關於這一點我們在下一節中進行討論。

搜尋路由表,尋找標為“預設(default)”的表目。如果找到,則把報文傳送給該表目指定的下一站路由器。

如果上面這些步驟都沒有成功,那麼該資料報就不能被傳送。如果不能傳送的資料報來自本機,那麼一般會向生成資料報的應用程式返回一個“主機不可達”或“網路不可達”(即IP協議附屬ICMP協議報文)的錯誤。

圖3-2,是我在一個路由器檢視路由表的結果:

TCP/IP協議——IP協議

3-2

S代表該路由時靜態配置,不是透過協議生成。重點關注標註的三條路由,分別是主機路由、網路路由和預設路由。查表時,優先查詢主機路由表,若能匹配中,則報文直接按照查表結果轉發。若無法匹配中,則繼續查詢網路路由表,若匹配中網路路由則按照查表結果轉發。若仍無法匹配中,查詢是否存在預設路由,存在的話匹配預設路由轉發。若所有的都無法匹配中,那麼丟棄該報文。

舉個例子,一個目的IP是200。1。1。2的報文進來,那麼直接命中主機路由表,報文直接按照查表結果,往下一跳網路介面IP為192。168。3。1的路由器轉發。若進來的報文目的IP為200。1。1。3,那麼無法命中主機路由表,而命中了網路路由表,那麼就往下一跳網路介面IP為192。168。4。1的路由器轉發。若進來的報文目的IP為100。1。1。2,那麼既不能命中主機路由表,也不能命中網路路由表,只能命中預設路由,那麼就往下一跳網路介面IP為101。0。0。1的路由器轉發。

這裡有人可能會疑問,明顯主機路由能更精確匹配,直接全部使用主機路由就完事了,為什麼還需要網路路由的存在。這裡主要考慮的是資源容量問題,硬體資源是有限的,一個路由表不可能無限大,能讓你容納那麼多的主機路由。因此,網路路由是很有必要的,網路路由的存在大大縮減了對路由表容量的要求。

值得注意的是,在這個轉發過程中,報文中的目的IP地址始終都未修改(使用源路由選項時會修改,但這種情況很少出現),所有的路由決策都是透過這個目的IP來決策。

3。4。子網定址與子網掩碼

現在所有的主機都要求支援子網定址(RFC 950規定)。不再把一個網際網路IP地址單純的認作由網路號與主機號組成,而是將主機號再次進行劃分,主機號分為子網號和主機號兩部分。這麼做的主要好處在於使得網際網路地址的使用更加靈活,因為往往一個網路號後是用不了這麼多主機的,例如B類的網際網路地址,有16位的主機號,即可以包含2^16的主機數量,而往往這一個網路號下不會存在這麼多主機,存在極大的浪費。圖3-3展示了B類地址的一種子網編址方式。

TCP/IP協議——IP協議

3-3

這種對B類地址的子網劃分是比較典型的劃分方法,這種方式在利用點分十進位制的方式表示IP地址時,可以很容易的區分子網號和主機號。大部分對網際網路地址的劃分都是對B類網際網路地址的劃分,其實對C類地址也是可以劃分的,只是C類地址的主機號本身只有8位,可用來劃分的位數較少。不止C類地址,A類地址也是經常會被劃分。

總結一句,這種劃分子網的方式非常靈活,不一定需要8位一個整體的劃分,可以透過子網掩碼來精確劃分到具體的位。例如一個A類地址表示成40。40。40。2/24,那麼24就標識前24位屬於網路號+子網號,而我們知道A類地址的網路號只有8位,可以知道該地址的網路號為前8位,即40,而子網號有16位,即40。40,主機號為2。掩碼有一種經常使用的表示方法,40。40。40。2/24這個也可以等價表示為40。40。40。2 255。255。255。0,其中255。255。255。0就是我們所說的真正的子網掩碼。

3。5。ifconfig命令與netstat命令

既然我們已經瞭解了所謂的IP地址與子網掩碼,那麼在我們的主機上可以如何檢視自己的網路介面所屬的IP地址與相應的子網掩碼呢。

在unix系統與類unix系統(linux)上可以使用ifconfig命令檢視相應的ip地址,圖3-4是我在一個linux系統上用命令檢視的結果

TCP/IP協議——IP協議

3-4

可以看到存在多個網路介面,分別分配有B類地址,C類地址與環回地址,其中netmask即子網掩碼,可以發現在這臺主機上,子網掩碼與網際網路地址的網路號位數相同。同時可以發現,各個網路介面的MTU最大值為1500(前文鏈路層所述,乙太網介面的IP資料報MTU範圍為46-1500),而環回介面的MTU為65536,是IP首部所能承載的最大資料報位元組數。這是因為環回介面接收的包是由本機發出,不需經過網路傳輸(前文TCP/IP簡介所述,MTU的限制與傳輸時延相關),因此可以發最大的IP資料報。

除了ifconfig可以查詢本機網路介面的資訊,也可以透過netstat -in來檢視主機的網路介面與IP地址。

3。6。小結

本篇主要講述了

IP首部的具體格式,並初步講述了各個欄位的用途。

IP的重要功能選路,講述了選路的原理,即根據報文的目的IP來查路由表,決策最終的報文出口。也大概講述了主機與路由器在處理報文時的差別。

介紹了子網以及子網掩碼的概念

講述了在系統上查閱主機網路介面的兩條重要命令,ifconfig與netstat