1.5 IP
IP是網絡之間互聯協議的縮寫,是TCP/IP協議族中最為核心的協議,是為計算機網絡相互連接進行通信而設計的協議。IP協議可以說是學習網絡技術的基礎,目前的IP可分為IPv4和IPv6兩個版本,本節將介紹IPv4,IPv6將在后續章節介紹。具體內容包括以下3項。
(1)IP編址。
(2)IP子網劃分。
(3)IP網絡層的常用排錯方法。
1.5.1 IP編址
IP 地址用于唯一標識一臺網絡設備,由32個二進制位組成,這些二進制數字被分為4個八位數組(octets),又稱為4個字節。IP地址表示方式如下。
點分十進制形式:10.110.128.111;
二進制形式:00001010.01101110.10000000.01101111;
十六進制形式:0a.6e.80.6f。
通常IP地址用點分十進制形式表示,很少表示成十六進制形式。IP地址采用分層設計,可以分為兩部分:網絡地址部分和主機地址部分,如圖1-63所示。

圖1-63 IP地址結構
IP 地址的分層方案類似于常用的電話號碼。電話號碼也是全球唯一的。例如對于電話號碼010-12345678,前面的字段010代表北京的區號,后面的字段12345678代表北京地區的一部電話。IP地址也是一樣,前面的網絡地址部分代表一個網段,后面的主機地址部分代表這個網段的一臺設備。
IP地址采用分層設計,方便了3層網絡設備網絡信息的維護,譬如路由器設備,在標識網絡的時候,可以以網段的方式來進行標識(網絡地址代表了該網段內所有主機組成的網絡),而不必儲存每一臺主機的IP地址,大大減少了路由表條目,增加了路由的靈活性。
IP 地址的網絡地址部分用于唯一地標識一個網段,或者若干網段的聚合。同一網段中的網絡設備有同樣的網絡地址。IP 地址的主機地址部分用于唯一地標識同一網段內的網絡設備,在網絡設備擁有多個接口的情況下,則擁有標識某一特定的三層接口。如A類IP地址10.110.192.111,網絡地址為10,主機地址為110.192.111。
如何區分IP地址的網絡地址和主機地址呢?最初互聯網絡設計者根據網絡規模大小規定了地址類,把IP地址分為A、B、C、D、E這5類,如圖1-64所示。

圖1-64 IP地址分類
A類IP地址的網絡地址為第一個8位數組(Octet),第一個字節以“0”開始。因此,A類網絡地址的有效位數為8-1=7位,A類地址的第一個字節在1~126之間(0和127留作他用)。例如,10.1.1.1、126.2.4.78等為A類地址。A類地址的主機地址位數為后面的3個字節24位。A類地址的范圍為1.0.0.0~126.255.255.255,每一個A類網絡共有224個A類IP地址。
B類IP地址的網絡地址為前兩個8位數組(Octet),第一個字節以“10”開始。因此,B類網絡地址的有效位數為16-2=14位,B類地址的第一個字節在128~191之間。例如,128.1.1.1、168.2.4.78等為 B 類地址。B 類地址的主機地址位數為后面的兩個字節16位。B 類地址的范圍為128.0.0.0~191.255.255.255,每一個B類網絡共有216個B類IP地址。
C類IP地址的網絡地址為前3個八位數組(Octet),第一個字節以“110”開始。因此,C類網絡地址的有效位數為24-3=21位,C類地址的第一個字節在192~223之間。例如,192.1.1.1、220.2.4.78等為 C 類地址。C 類地址的主機地址部分為后面的一個字節8位。C 類地址的范圍為192.0.0.0~223.255.255.255,每一個C類網絡共有28=256個C類IP地址。
D類地址的第一個8位數組以“1110”開頭,因此,D類地址的第一個字節在224~239之間。D類地址通常作為多播地址。關于多播地址,在HCDP路由課程中會有討論。
E類地址的第一個字節在240~255之間,保留,用于科學研究。
現網中經常用到的是A、B、C這3類地址。IP地址由國際網絡信息中心組織(International Network Information Center,InterNIC)根據公司大小進行分配。過去通常把A類地址保留給政府機構,或者分配給谷歌之類的大公司,B 類地址分配給中等規模的公司,C 類地址分配給小單位。然而,隨著互聯網絡的飛速發展,再加上IP地址的狼費,IP地址已經非常緊張,目前國際上的IP地址段已經分配完畢,運營商使用的IP地址都是之前申請的存量IP地址。鑒于此,IETF組織設計推出了IPv6協議。其中,對IPv6地址的定義,很重要的一個意義在于擴充了地址空間,由現在的32位擴充到了128位,能夠用于替代現行越來越短缺的IPv4地址。
IP地址用于唯一地標識一臺網絡設備,但并不是每一個IP地址都是可用的。一些特殊的IP地址有特殊的用途,不能用于標識網絡設備,如表1-12所示。
表1-12 特殊IP地址

對于主機部分全為“0”的IP地址,稱為網絡地址。網絡地址用來標識一個網段。例如,A類地址1.0.0.0,私有地址10.0.0.0、192.168.1.0等。
對于主機部分全為“1”的 IP 地址,稱為網段廣播地址。廣播地址用于標識一個網絡的所有主機。例如10.255.255.255、192.168.1.255等。廣播地址用于向本網段的所有節點發送數據包,這樣的廣播不能被路由器轉發。
對于網絡部分為127的IP地址,代表的是環回地址,往往用于環回測試。例如127.0.0.1。
全“0”的IP地址0.0.0.0代表所有的主機,華為實現中用0.0.0.0地址指定默認路由,同時,在終端配置自動獲取IP地址的時候,以0.0.0.0作為臨時填充地址。
全“1”的IP地址255.255.255.255也是廣播地址,但255.255.255.255代表本地鏈路上的所有主機,用于向本地鏈路上的所有節點發送數據包。這樣的廣播不能被路由器轉發。
如上所述,每一個網段會有一些IP地址不能用作主機IP地址。下面計算一下可用的IP地址。
如B類網段172.16.0.0,有16個主機位,因此有216個IP地址,除了一個網絡地址172.16.0.0和一個廣播地址172.16.255.255不能用作標識主機,那么共有216-2個可用地址。C類網段192.168.1.0,有8個主機位,共有28=256個IP地址,去掉一個網絡地址192.168.1.0和一個廣播地址192.168.1.255,共有254個可用主機地址。
每一個網段的可用主機地址可以用這樣一個公式表示:假定這個網段的主機部分位數為n,則可用的主機地址個數為2n-2個。
IP地址除了可以分為A類、B類等,同樣還區分定義了私網地址和公網地址,通常情況下會在公司內部網絡使用私有IP地址。
私有IP地址是由InterNIC預留的由各個企業內部網自由支配的IP地址。使用私有IP地址不能直接訪問 Internet。因為公網上沒有針對私有地址的路由。當訪問 Internet 時,需要利用NAT 或者代理等技術把私有 IP 地址對公網的訪問轉換為對非私有地址的訪問。InterNIC預留了以下網段作為私有IP地址。
● A類地址10.0.0.0~10.255.255.255。
● B類地址172.16.0.0~172.31.255.255。
● C類地址192.168.0.0~192.168.255.255等。
使用私有IP地址,不僅減少了用于購買公有IP地址的投資,而且節省了IP地址資源。
IP編址與路由——IP地址介紹
1.5.2 子網劃分
上文中提到了IP地址的分層結構,IP地址可以分為網絡地址部分和主機地址部分,網絡地址部分用于表示網段,主機地址部分用于唯一標識同一網段內的網絡設備。網絡地址和主機地址的區分則通過掩碼實現。
掩碼與IP地址的表示法相同。掩碼中用1表示該位為網絡位,用0表示主機部分。一個255則表示有8個1。
默認狀態下,A 類地址的網絡掩碼為255.0.0.0,B 類地址的網絡掩碼為255.255.0.0,C 類地址的網絡掩碼為255.255.255.0。
圖1-65所示的192.168.1.100是一個標準C類地址,子網掩碼為255.255.255.0,該地址的網絡地址為192.168.1.0。

圖1-65 網絡地址和掩碼
如果一個 IP 地址在表示的時候沒有帶上掩碼,則被稱為無子網編址。無掩碼編址使用自然掩碼,不對網段進行細分。比如B類網段172.16.0.0,使用自然掩碼255.255.0.0。
對于沒有子網的IP地址組織,外部將該組織看作單一網絡,不需要知道內部結構。例如,所有到地址172.16.X.X的路由被認為同一方向,不考慮地址的第三和第四個8位分組,這種方案的好處是減少路由表的項目。
但這種方案沒法區分一個大的網絡內不同的子網網段,這使網絡內的所有主機都能收到該大的網絡內的廣播,從而降低網絡的性能,另外也不利于管理。
比如,一個B類網可容納65 534個主機。假設申請B類地址的用戶只需要100個IP地址,那么剩余的地址無法被別的用戶使用,這就造成了極大的狼費。于是需要一種方法將這種網絡分為不同的網段,按照各個子網段進行管理。
從地址分配的角度來看,子網是網段地址的擴充。網絡管理員根據組織增長的需要決定子網的大小。網絡設備使用子網掩碼(Subnet Masking)決定IP地址中哪部分為網絡部分,哪部分為主機部分。
子網掩碼也是掩碼,其表示方式與掩碼是一樣的。如圖1-66所示,IP地址192.168.1.7對應的子網掩碼是255.255.255.240,將十進制轉化為二進制,子網掩碼的二進制表示為11111111.11111111.11111111.11110000。根據掩碼的定義,掩碼位為1的代表網絡地址,那么代表IP地址192.168.1.7的網絡地址位共有8+8+8+4=28位。因此IP地址也可以表示為192.168.1.7/28。

圖1-66 子網掩碼的表示方法
在默認狀態下,如果沒有進行子網劃分,A 類網絡的子網掩碼為255.0.0.0,B 類網絡的子網掩碼為255.255.0.0,C 類網絡子網掩碼為255.255.255.0。利用子網,網絡地址的使用會更有效。對外仍為一個網絡,對內部而言,則分為不同的子網。例如,某公司的財務部使用172.16.4.0子網段,工程部使用172.16.8.0子網段。這樣可使路由器根據目的子網地址進行路由,從而限制一個子網的廣播報文發送到其他網段,不對網絡的效率產生影響。
通過子網掩碼,可以進行IP地址的網絡地址位和主機地址位的區分,那么如何計算網絡地址呢?如圖1-67所示,IP地址為192.168.1.167/28,將IP地址和掩碼分別表示為二進制,按位進行“與”的計算,得到結果11000000.10101000.00000001.10100000,轉換為十進制,即為網絡地址192.168.1.160。

圖1-67 網絡地址的計算
那么網段192.168.1.160/28中能容納多少臺主機呢?主機數同樣是通過子網掩碼來計算的。在掩碼的規定中,值為0的比特位即為主機位,所以要看的就是子網掩碼中最后有多少位是0。如圖1-68所示,假設子網掩碼中最后有n位為0,那么總的主機數為2n個,可用主機的個數要減去全0的網絡地址和全1的廣播地址,所以可用的主機數為2n-2個。按照該計算方式,192.168.1.160/28網段中可用的主機IP地址為14個。

圖1-68 主機數的計算
在了解了子網掩碼的基本概念后,可以嘗試著進行以下網絡的子網劃分。
某公司分配到了一個 C 類的地址網段201.222.5.0/24。出于業務需要,需要將公司的網絡劃分成20個子網,每個子網有5臺主機,該如何劃分?
在這個例子中,因為是C類地址,所以子網部分和主機部分總共是8位。假設取其中的n位作為子網網絡地址,那么剩下的主機位為8-n位。根據前面的主機數目的計算公式可以得出每個子網中的可用IP地址數為2(8-n)-2。由于還需要分配一個IP地址作為網關使用,所以可以得出不等式:2(8-n)-2-1≥5。而由于作為子網網絡地址的比特位為n位,因此能夠劃分的子網網段為2n個,如此可以得到另一個不等式:2n≥20。
從不等式2n≥20中可以得出n的取值為5、6、7、8。從不等式2(8-n)-2-1≥5中,可以得出n的取值為0、1、2、3、4、5。綜合考慮兩個條件,n的取值為5。也就是說,可以將C類地址網段201.222.5.0/24劃分為32個29位掩碼的子網網段。每個網段分別如下。
201.222.5.0~201.222.5.7
201.222.5.8~201.222.5.15
…
201.222.5.240~201.222.5.247
201.222.5.248~201.222.5.255
劃分子網的時候,每個子網網段的掩碼位數不一定要相同,可以根據實際情況調整子網掩碼的長度。如圖1-69所示,某公司準備用C類網絡地址192.168.1.0進行IP地址的子網規劃。公司共購置了5臺路由器,一臺路由器作為企業網的網關路由器接入當地ISP,其他4臺路由器連接4個辦公點,每個辦公點20臺PC。從圖中可以看出,需要劃分8個子網,4個辦公點各網段需要21個IP地址(包括一個路由器接口,作為網關),與網關路由器相連的4個網段各需要兩個IP地址。最終子網掩碼的規劃是,4個辦公點網段采用子網掩碼255.255.255.224,預留5位作為主機位,可以容納最多25-2=30臺主機。對于4個辦公點路由器和網關路由器相連的網段,預留2位作為主機位,可用主機地址為22-2=2個,鏈路兩端各一個。
對于圖1-69中的子網劃分,每一個子網使用不同的網絡標識ID,不同子網的主機數不一定相同,所以在劃分子網的時候,沒有采用固定長度的子網掩碼。這種子網掩碼的劃分方式稱為可變長子網掩碼(Variable Length Subnet Mask,VLSM)技術。對主機數目比較多的子網采用較短的子網掩碼,對主機數目比較少的子網采用較長的子網掩碼,這種方案能節省大量的地址,節省的這些地址可以用于其他子網上。
VLSM 技術將一個網段劃分成了多個網段,那么網絡在通告路由的時候會導致路由條目的大量增加。為了減少網絡中的路由條目,對應于VLSM技術,還有無類域間路由技術(Classless Inter Domain Routing, CIDR)。

圖1-69 可變長子網掩碼
CIDR由RFC1817定義。CIDR突破了傳統IP地址分類邊界,可以將路由表中的若干條路由匯聚為一條路由,極大地減少了路由表的規模,提高了路由器的可擴展性。
如圖1-70所示,一個ISP被分配了一些C類網絡,198.168.0.0~198.168.255.0。該ISP準備把這些C類網絡分配給各個用戶群,目前已經分配了3個C類網段給用戶。如果沒有實施CIDR技術,ISP的路由器的路由表中會有3條下連網段的路由條目,并且會把它通告給Internet上的路由器。通過實施CIDR技術,可以在ISP的路由器上把這3條網段198.168.1.0、198.168.2.0、198.168.3.0匯聚成一條路由198.168.0.0/16,這樣 ISP 路由器只向Internet通告198.168.0.0/16這一條路由,大大減少了路由表的數目。
IP編址與路由——子網掩碼介紹
IP編址與路由——IP地址規劃與使用

圖1-70 無類域間路由(CIDR)
值得注意的是,使用 CIDR 技術匯聚的網絡地址的比特位必須是一致的,如上例所示。如果上圖所示的ISP連接了一個172.178.1.0網段,那么這個網段路由將無法被匯聚。
1.5.3 IP網絡排錯
網絡搭建完畢后,如何對網絡進行驗證,確保能夠正常工作?或者網絡出了故障后,如何進行故障的判斷和定位?下面對幾種常見的應用進行了介紹。
1.ping
ping是用來檢查IP網絡連接及主機是否可達的常用方法。如路由器之間、主機與路由器之間的連通性問題都可以使用ping來判斷。ping使用一系列ICMP的消息來確定目的地址是否可達,以及通信是否延時和丟包情況。ping 實際上是一個發出請求并等待響應的過程。發起 ping 命令的源端首先向目的地址發送“Echo”消息并等待回應。如果“Echo”包到達目的地址,并且在確定時間周期內從目的地成功返回“Echo Reply”包給源端,則ping成功。一旦超過時間周期則會顯現“Request timed out”請求超時的消息。
如圖1-71所示,在RTA上使用ping命令測試與RTB互聯的IP地址的連通性,收到了RTB接口1.1.1.2發回的應答報文。

圖1-71 ping檢測
ping命令除了基本命令外,還提供許多可選參數供使用,這里列舉-a和-i兩個參數。
-a source-ip-address:設置發送ICMP ECHO-REQUEST報文的源IP地址。
-i interface-type interface-number:設置發送ICMP ECHO-REQUEST報文的接口。
圖1-71中的測試,也可以執行命令ping a 1.1.1.1 1.1.1.2來代表報文從1.1.1.1發送到1.1.1.2。
2.ICMP
ICMP 是網絡層的一個重要組成部分。IP 協議并不提供連接的可靠性保證,所以無法獲取到網絡故障的信息,利用ICMP可以獲取網絡中問題的反饋。前面提到的ping測試,以及稍后提到的Tracert,實際上都用到了ICMP的協議報文封裝。
ICMP的作用為傳遞差錯、控制、查詢報文等信息,其報文被封裝在基本的IP報頭(即20字節)中,協議字段值為1,如圖1-72所示。ICMP的報文結構則如圖1-73所示。

圖1-72 ICMP報文封裝

圖1-73 ICMP報文結構
ICMP報文由Type、Code、Checksum和unused字段組成。不同的消息報文其格式略有些不同,這里對幾個常用的參數做介紹。
(1)類型(Type)。
Type表示ICMP消息類型,以下為常用的幾種消息類型,如表1-13所示。
表1-13 ICMP消息類型

(2)代碼(Code)。
同一個 ICMP 消息類型中通過不同的代碼表示不同的信息。例如 Type 為3的目的不可達消息(Destination Unreachable),其Code代碼就細分了幾類,以下列舉了4個代碼的含義,如表1-14所示。
表1-14 ICMP代碼類型

(3)校驗和(Checksum)。
該字段占16位,目前沒有使用,值為0。
3.Tracert
Tracert可探測源節點到目的節點之間數據報文所經過的路徑。IP報文的TTL值在每經過一個路由器轉發后減1,當TTL=0時則向源節點報告TTL超時。
如圖1-74所示,Tracert首先發送一個TTL為1的UDP報文,因此第一跳發送回一個ICMP錯誤消息以指明此數據報不能被發送(因為TTL超時)。之后Tracert再發送一個TTL為2的UDP報文,同樣第二跳返回 TTL 超時。這個過程不斷進行,直到到達目的地,由于數據報中使用了無效的端口號(默認從33 434開始使用,后續UDP報文目的端口號自動加1),此時目的主機會返回一個ICMP的目的不可達消息,表明該Tracert操作結束。Tracert記錄下每一個ICMP TTL超時消息的源地址,從而給用戶報文提供到達目的地所經過的網關IP地址。
常見應用簡介——ICMP、Telnet、FTP

圖1-74 Tracert路由跟蹤
Tracert同樣可以提供測試連通性的功能,當Tracert某一目的地址時,從顯示的路徑信息可以判斷出故障點在什么地方。圖1-75所示是Tracert的簡單應用示例。

圖1-75 Tracert應用示例