IP(Internet Protocol,網際協議)是TCP/IP協議族中重要的協議,主要負責將數據包發送給目標主機。IP相當於OSI(圖1)的第三層網絡層。網絡層的主要作用是失陷終端節點之間的通信。這種終端節點之間的通信也叫點對點(point-to-point)通信。

圖1:OSI參考模型
1. IP的功能作用
1)IP尋址
作為網絡層的IP,一般稱為IP地址,主要用於在連接到網絡中的所有主機中識別出進行通信的目標地址,因此在TCP/IP通信中所有主機(在互聯網中,將那些配有IP地址的設備叫主機,嚴格意義上說,配有IP地址且不進行路由控制的設備叫主機,既配有IP地址又具有路由控制能力的設備叫路由器,而節點則是主機和路由器的統稱。)或路由器必須設定自己的IP地址。如圖2所示,連接互聯網的主機需要配置IP地址,不論哪一台主機與哪種數據鏈路連接,其IP地址的形式都一樣,以太網、無線局域網、PPP等都不會改變IP地址的形式。另外,在網橋或交換機集線器等物理層或者數據鏈路層數據包轉發設備中,不需要設置IP地址。因為這些設備只負責將IP包轉化為0、1比特流轉發或對數據鏈路幀的數據部分進行轉發,而不需要應對IP協議。

圖2:主機在互聯網互聯需要IP地址
2)路由
路由控制(Routing)是指將分組數據發送到最終目標地址的功能。即使網絡很復雜,也可以通過路由控制確定到達目標地址的通路。一旦這個路由控制的運行出現異常,分組數據極有可能“迷失”,無法到達目標地址。因此,一個數據包之所以能夠成功地到達最終的目標地址,全靠路由控制。
IP包在網路中一個個跳間(一跳(1Hop)是指利用數據鏈路層以下分層的功能傳輸數據幀的一個區間。以太網等數據鏈路中使用MAC地址傳輸數據幀。此時的一跳是指從源MAC地址到目標MAC地址之間傳輸幀的區間。也就是說它是主機或路由器網卡不經其他路由器而能直接到達的相鄰主機或路由器網卡之間的一個區間。在一跳的這個區間內,電纜可以通過網橋或交換集線器相連,不會通過路由器或網關相連)被轉發,因此IP路由也叫多條路由。在每一個區間內決定着包在下一跳被轉發的路徑。
多跳路由是指路由器或主機在轉發IP數據包時只指定下一個路由器或主機,而不是將到最終目標地址為止的所有通路全都指定出來。因為每一個區間(跳)在轉發IP數據包時會分別指定下一跳的操作,直至包達到最終的目標地址。
為了將數據包發給目標主機,所有主機都維護着一張路由控制表(Routing table)。該表記錄IP數據在下一步應該發給哪個路由器。IP包將根據這個路由表在各個數據鏈路上傳輸。

圖3:路由控制表
3)IP分包和組包
IP是失陷多個數據鏈路之間通信的協議。數據鏈路根據種類的不同各有特點。對不同數據鏈路的特異性進行抽象化也是IP的重要作用。不同數據鏈路有個最大的區別,就是各自的最大傳輸單位(Maximum Transmission Unit,MTU)不同。以太網的MTU是1500字節,FDDI(Fiber Distributed Data Interface,光纖分布式數據接口)的MTU是4352字節,ATM(Automated Teller Machine,自動取款機)的MTU是9180字節。IP的上一層會要求傳送比MTU更多字節的數據,因此必須在線路上傳送比包長還要小的MTU。為解決這個問題,IP進行分片處理(IP Fragmentation)。所謂分片處理就是將較大的IP包分成多個較小的IP包。分片的包到了對端目標地址后再被組合起來傳給上一層。從IP的上層看,它完全可以忽略數據包在途中的各個數據鏈路上的MTU,而只需要按照源地址發送的長度接收數據包。IP就實現了數據鏈路層的抽象,使得從上層更不容易看到底層網絡構造的細節。
4)IP屬於無連接型
IP面向無連接,也就是在發包之前,不需要建立與目標地址之前的連接。當數據鏈路層有需要發送的數據,該數據會立即被壓縮成IP包發送出去。而面向有連接的情況則不同,目標主機關機或者不存在則不可能建立連接,那么也不可能發送數據過去。為什么IP要采用面向無連接呢?原因在於簡化和提速。有連接型要比無連接型復雜的多,如前期需要握手,而且在處理連接過程中,需要耗費時間。
IP提供盡力服務(Best Effort),就是盡最大努力將數據包發送到最終目標地址,然而其並不做“最終是否收到的驗證”。因此IP數據包在途中可能會發生丟失、錯位以及數據翻倍等問題。為了提高通信的可靠性,TCP發揮重要作用,如果說IP只負責將數據發給目標主機,那么TCP則負責保證對目標確實收到數據。為什么不讓IP具有可靠傳輸的功能呢?原因在於如果要一種協議規定所有的功能和作用,那么該協議的具體實現和編程會變得非常復雜,無法輕易實現,而且難以維護。相比而言,按照網絡分層,明確定義每層協議的作用和責任后,針對每層具體的協議進行編程會更加有利於該協議的實現。
2. IP地址基礎知識
1)IP地址定義
在使用TCP/IP通信時,用IP地址識別主機和路由器。為了保證正常通信,有必要為每個設備正確配置IP地址。IP地址分為IPv4和IPv6。IP地址(以IPv4為例)由32位正整數來表示。TCP/IP通信要求將這樣的IP地址分配給每一個參與通信的主機。IP地址在計算機內部以二進制(二進制是指用0、1表示數字的方法)方式被處理。而我們並不習慣用二進制方式計數,因而將32位的IP地址以每8位為一組,分為4組,每組以“.”隔開,再將每組數轉為十進制數。以圖4為例。注意在這里2進制轉10進制=2^7 + 2^5 +2^3 + 2^2 = 172如圖5,而10進制轉2進制=10101100如圖6。

圖4:IP地址數字表示

圖5:二進制轉10進制計算方法

圖6:10進制轉2進制計算方法
將表示成IP地址的數字整體計算,最多大概允許2^32 = 4294967296台計算機連接到網絡。
2)IP地址組成
IP地址由網絡標識和主機標識兩部分組成。例如IP地址192.168.128.10/24,“/24”表示從第一位到24位屬於網絡標識,在這里“192.168.128”屬於網絡標識也就是網絡地址,而最后的“10”為主機標識也就是主機地址。網絡標識在數據鏈路的每個段配置不同的值。網絡標識必須保證相互連接的每個段的地址不相重復。而相同段內相連的主機必須有相同的網絡地址。IP地址的主機標識不允許在相同的網段內重復出現。由此,可以通過設置網絡地址和主機地址在相互連接的整個網絡中保證每台主機的IP地址都不會相互重疊。即IP地址具有唯一性。如圖7所示,IP包被轉發到途中某個路由器時,正是利用目標IP地址的網絡標識進行路由。路由器只要一看IP地址的網絡標識就可以進行轉發。

圖7:IP地址的網絡標識
3)IP地址的分類
IP地址分為A類、B類、C類、D類四類。根據IP地址中從第1位到第4位的比特列對其網絡標識和主機標識進行區分。如圖8所示,A類IP地址是首位以“0”開頭的地址從第1位到第8位是網絡標識(去掉分類位剩下7位)。用十進制表示的話,0.0.0.0~127.0.0.0是A類的網絡地址。A類地址的后24位相當於主機標識。因此一個網絡內可容納的主機地址上限為16,777,214個。B類地址是前兩位為“10”的地址。從第1位到第16位是網絡標識。用十進制表示的話,128.0.0.0~191.255.0.0是B類的網絡地址。B類地址的后16位相當於主機標識。因此一個網絡內可容納的主機地址上限是65,534個。C類地址是前三位“110”的地址。從第1位到第24位是它的網絡標識。用十進制表示的話,192.0.0.0~223.255.255.0是C類的網絡地址。C類地址的后8位相當於主機標識,因此一個網絡內可容納的主機地址上限為254個。D類地址是前四位為“1110”的地址。從第1位到第32位是它的網路地址。用十進制表示的話,224.0.0.0~239.255.255.255是D類的網絡地址。D類地址沒有主機識別地址,常被用於多播。注意分配IP地址時,不可以全部為0或全部為1.因為全部為0在表示對應的網絡地址或IP地址不可獲知的情況下才使用。而全部為1的主機地址通常作為廣播地址。因此C類地址的個數是2^8-2=254個。

圖8:IP地址的分類
廣播地址用於在同一個鏈路相互連接的主機之間發送數據包。將IP地址中的主機地址部分全部設置為1,就成了廣播地址。在以太網中如果將MAC地址的所有位都改為1,則形成FF:FF:FF:FF:FF:FF的廣播地址。因此廣播的IP包以數據鏈路的幀的形式發送時,得通過MAC地址全為1比特的FF:FF:FF:FF:FF:FF轉發。例如把172.20.0.0/16用二進制表示:10101100.00010100.00000000.00000000,將這個地址的主機部分全部改為1,則形成廣播地址:10101100.00010100.11111111.11111111再將這個地址用十進制表示,則為172.20.255.255。
廣播分為本地廣播和直接廣播兩種。在本網絡內的廣播叫做本地廣播。例如網絡地址為192.168.0.0/24的情況下,廣播地址是192.168.0.255。因為這個廣播地址的IP包會被路由器屏蔽,所以不會到達192.168.0.0/24以外的其他鏈路上。在不同網絡之間的廣播叫做直接廣播。例如網絡地址為192.168.0.0/24的主機向192.168.1.255/24的目標地址發送IP包。收到這個包的路由器,將數據轉發給192.168.1.0/24,從而使得所有192.168.1.1~192.168.1.254的主機都能收到這個包,由於直接廣播有一定的安全問題,所以多數情況下載路由器上設置為不轉發。
2. IP數據報文格式

圖9:IPv4數據報格式
通過IP進行通信時,需要在數據的前面加入IP首部信息。IP首部中包含着用於IP協議進行發包控制時所有的必要信息。如圖9所示為IPv4數據報格式。
1)IPv4首部
- 版本(Version)
由4比特構成,表示標識IP首部的版本號。IPv4的版本號為4,因此在這個字段上值也是4。
- 首部長度(IHL:Internet Header Length)
由4比特構成,表明IP首部的大小,單位為4字節(32比特)。對於沒有可選項的IP包,首部長度則設為5.也就是說在沒有可選項時,IP首部的長度為20字節。
- 區分服務(TOS:Type Of Service)
由8比特構成,用來表明服務質量。每一位的具體含義如表所示。
| 比特 | 含義 |
| 0 1 2 | 優先度 |
| 3 | 最低延遲 |
| 4 | 最大吞吐 |
| 5 | 最大可靠性 |
| 6 | 最小代價 |
| (3~6) | 最大安全 |
| 7 | 未定義 |
這個值通常由應用指定。而且現在也鼓勵這種結合應用的特性設定TOS的方法。然而在目前,幾乎所有的網絡都無視這些字段。這不僅僅是因為在符合質量要求的情況下按其要求發送本身的功能實現起來十分困難,還因為若不符合質量要求就可能會產生不公平的現象。因此實現TOS控制變得極其復雜。這也導致TOS整個互聯網幾乎就沒有被投入使用。不過已有人提出將TOS字段本身再划分為DSCP(Differentiated Services Codepoint)和ECN(Explicit Congestion Notification)兩個字段的建議。在圖10中DSCP和ECN分別為6比特和2比特。DSCP(Differential Services Codepoint,差分服務代碼點)是TOS(Type Of Service)的一部分。現在統稱為DiffServ,用來進行質量控制。ECN(Explicit Congestion Notification,顯示擁塞通告)用來報告網絡擁堵情況。第6位的ECT用以通告上層TCP協議是否處理ECN。當路由器在轉發ECN為1的包的過程中,如果出現網絡擁堵的情況,就將CE位設置為1。

圖10:DSCP和ECN
| 比特 | 簡稱 | 含義 |
| 6 | ECT | ECN-Capable Transport |
| 7 | CE | Congestion Experienced |
- 總長度(Total Length)
表示IP首部與數據部分合起來的總字節數。該字段長16比特。因此IP包的最大長度65535(=2^16)字節。目前還不存在能夠傳輸最大長度為65535字節的IP包的數據鏈路。不過由於有IP分片處理,從IP的上一層的角度看,不論底層采用哪種數據鏈路,都可以認為能夠以IP的最大包長傳輸數據。
- 標識(ID:Identification)
由16比特構成,用於分片重組。同一個分片的標識值相同,不同分片的標識值不同。通常每發送一個IP包,它的值也逐漸遞增。此外,即使ID相同,如果目的地址、源地址或協議不同的話,也會被認為是不同的分片。
- 標志(Flags)
由3比特構成,表示包被分片的相關信息。每一位的具體含義參考下表:
| 比特 | 含義 |
| 0 | 未使用。現在必須是0 |
| 1 | 指示是否進行分片(don't fragment) 0-可以分片 1-不能分片 |
| 2 | 包被分片的情況下,表示是否為最后一個包(more fragment)。 0-最后一個分片的包 1-分片中段的包 |
- 片偏移(FO:Fragment Offset)
由13比特構成,用來標識被分片的每一個分段相對於原始數據的位置。第一個分片對應的值為0.由於FO字段占13位,因此最多可以表示8192(=2^13)個相對位置。單位為8字節,因此最大可表示原始數據8*8192=65535字節的位置。
- 生存時間(TTL:Time To Live)
由8比特構成,它最初的意思是以秒為單位記錄當前包在網絡上應該生存的期限。然而在實際中它是指可以中轉多少個路由器的意思。沒經過一個路由器,TTL會減少1,直到變成0則丟棄該包。
- 協議(Protocol)
由8比特構成,表示的是IP包傳輸層的上層協議編號。目前常使用的協議如下表所示
| 分配編號 | 簡稱 | 協議 |
| 0 | HOPOPT | IPv6 Hop-by-Hop Option |
| 1 | ICMP | Internet Control Message |
| 2 | IGMP | Internet Group Management |
| 4 | IP | IP in IP(encapsulation) |
| 6 | TCP | Transmission Control |
| 8 | EGP | Exterior Gateway Protocol |
| 9 | IGP | any private interior gateway(Cisco IGRP) |
| 17 | UDP | User Datagram |
| 33 | DCCP | Datagram Congestion Control Protocol |
| 41 | IPv6 | IPv6 |
| 43 | IPv6-Route | Routing Header for IPv6 |
| 44 | IPv6-Frag | Fragment Header for IPv6 |
| 46 | RSVP | Reservation Protocol |
| 50 | ESP | Encap Security Payload |
| 51 | AH | Authentication Header |
| 58 | IPv6-ICMP | ICMP for IPv6 |
| 59 | IPv6-NoNxt | No Next Header for IPv6 |
| 60 | IPv6-Opts | Destination Options for IPv6 |
| 88 | EIGRP | EIGRP |
| 89 | OSPFIGP | OSPF |
| 97 | ETHERIP | Ethernet-within-IP Encapsulation |
| 103 | PIM | Protocol Independent Multicast |
| 108 | IPComp | IP Payload Compression Protocol |
| 112 | VRRP | Virul Router Redundancy Protocol |
| 115 | L2TP | Layer Two Tunneling Protocol |
| 124 | ISIS over IPv4 | ISIS over IPv4 |
| 132 | SCTP | Stream Control Transmission Protocol |
| 133 | FC | Fibre Channel |
| 134 | RSVP-E2E-IGNORE | RSVP-E2E-IGNORE |
| 135 | Mobility Header(IPv6) | Mobility Header(IPv6) |
| 136 | UDPLite | UDP-Lite |
| 137 | MPLS-in-IP | MPLS-in-IP |
- 首部校驗和(Header Checksum)
由16比特(2字節)構成,也叫IP首部校驗和。該字段只校驗數據報的首部,不校驗數據部分。它主要用來確保IP數據報不被破壞。校驗和的計算過程,首先要將該校驗和的所有位置設置為0,然后以16比特為單位划分IP首部,並用1補數計算所有16位字的和。最后將所 得到這個和的1補數賦給首部校驗和字段。
- 源地址(Source Address)
由32比特(4字節)構成,表示發送端IP地址
- 目的地址(Destination Address)
由32比特(4字節)構成,表示接收端IP地址
- 可選項(Options)
長度可變,通常只在進行實現或診斷時使用。該字段包含如下幾點信息:
-
- 安全級別
- 源路徑
- 路徑記錄
- 時間戳
- 填充(Padding)
也稱為填充物。在有可選項的情況下,首部長度可能不是32比特的整數倍。為此,通過向字段填充0,調整為32比特的整數倍。
- 數據(Data)
存入數據。將IP上層協議的首部也作為數據進行處理。
