1. 程式人生 > >IPv4協議及VLSM可變長子網劃分和CIDR無類域間路由

IPv4協議及VLSM可變長子網劃分和CIDR無類域間路由

網際網路世界一切通訊都將IP化。IT行業無論你用哪種語音(C++,Java,PHP等),無論你偏軟體或偏硬體,最大公約數之一可能就有IP。國家在搞三網融合,即Internet,電話網,有線電視網將全用IP資料包傳輸資料。可以說IP是網路的基石。本篇是我對IP協議包括VLSM和CIDR的理解。

IP的責任簡單地說就是將資料從源傳送到目的地。IP協議被封裝在TCPIP 5層協議中的網路層上,具體格式如下:(以下是我個人對IP包頭的理解,權威的請查閱wikipedia或RFC791,另文中出現的IP均指IPv4)

1.版本(4位):

4或6,表示IPv4還是IPv6

2.首部長度(4位):

指明IP包頭部長度(不包含資料)。如沒有可選項長度是20 byte。可選項最大40 byte,因此IP包頭部最大長度是60 byte

3.優先順序與服務型別(8位)(直接RFC791上截圖了):


4.總長度(16位):

IP包的長度,總長度 - 首部長度 = 資料長度

5.識別符號(16位),標誌(3位),段偏移量(13位):

三個結合在一起使用,用於資料分包。比如A->B->C,A的MTU是1500,B的MTU是1000,那B收到A的包轉發給C時就要分包:第一個包1000,第二個包500。

識別符號(16位):分包後,每個包上標記相同的值,以便區分哪些包原本是同一個包拆開來的。

標誌(3位):第一位固定是0。第二位DF(Don't Fragment)為1時不切片,這樣B收到MTU1500的包就不能分包,無法轉發給C只能直接丟棄。第三位MF(More Fragments)為1時表示後面還有切片。

段偏移量(13位)用於分包後合併時確定依次順序。

6.TTL(8位):

TTL本是想用做統計時間的,後來變為跳數,最大255,一般為64,每過一個路由器減1,到達目的IP前如果減到0,路由器就將該包丟棄,再通過ICMP回傳time exceeded資訊,這樣可以避免無限環路。

7.協議號(8位):

用於區分上層(傳輸層)資料。例如ICMP是1,TCP是6,UDP是17,EIGRP是88,OSPF是89

8.首部校驗和(16位):

校驗一下除資料部分外的包頭資訊以防被篡改。因為TTL值每經過一個路由器都會減1發生變化,因此每經過一個路由器都要重新校驗,這很討厭,所以IPv6裡就沒有校驗和了。

9.源地址(32位),目標地址(32位):


(顧名思義)

10.可選項:

有4個選項:鬆散源路由選擇,嚴格源路由選擇,記錄路由,時間戳

鬆散/嚴格源路由選擇:用於控制沿途路徑。比如A->B1->C也可以A->B2->C,具體走哪條你可以將B1或B2的地址寫到這裡。區別是:嚴格里必須規定沿途每個路由器,而鬆散可以只給出沿途必須經過的一些“要點”

記錄路由:記錄沿途的IP地址

時間戳:沒啥用,路由器轉發時可以打個時間,但除非所有路由器的時間精確同步,否則沒什麼用

11.資料:

(顧名思義,裡面包含了上一層傳輸層的TCP/UDP頭部)

上面IP協議裡,源地址和目標地址就是家喻戶曉的IP地址。

IP地址格式是由網路號和主機號(D類E類除外)合併而成,用點分10進製表示,共32位。分為ABCDE 5類IP地址:

A類地址:

前8位為網路號(首位固定0,後7位是網路地址),後24位是主機號。

A類地址範圍:1.0.0.0 ~127.255.255.255  掩碼:255.0.0.0(掩碼的作用是區分網路號和主機號)

網段中主機位全0的是該網段地址,主機位全1的是該網段的廣播地址。因此平時可用於單播的A類IP地址範圍:1.0.0.1 ~127.255.255.254

B類地址:

前16位為網路號(前2位固定10,後6位是網路地址),後16位是主機號。

B類地址範圍:128.0.0.0 ~191.255.255.255  掩碼:255.255.0.0

網段中主機位全0的是該網段地址,主機位全1的是該網段的廣播地址。因此平時可用於單播的B類IP地址範圍:128.0.0.1 ~191.255.255.254

C類地址:

前24位為網路號(前3位固定110,後5位是網路地址),後8位是主機號。

B類地址範圍:192.0.0.0 ~223.255.255.255  掩碼:255.255.255.0

網段中主機位全0的是該網段地址,主機位全1的是該網段的廣播地址。因此平時可用於單播的B類IP地址範圍:192.0.0.1 ~223.255.255.254

D類地址:
用於多播,已經沒有網路號和主機號了,前4位固定1110,後28位用於多播地址

D類地址範圍:224.0.0.0 ~ 239.255.255.255  

E類地址:

用於科研。。。太高階一般接觸不到。同樣已經沒有網路號和主機號了

D類地址範圍:240.0.0.0~ 255.255.255.255  

有一些用於特殊用途的IP地址:

0.0.0.0:未指定IP

127.0.0.1:本地loopback測試地址

255.255.255.255:本地廣播地址

還有一些私有IP地址:

A類地址中:10.0.0.0~ 10.255.255.255(即10網段)

B類地址中:172.16.0.0~172.31.255.255(即172的後半網段)

C類地址中:192.168.0.0~192.168.255.255(即192.168網段)

私有IP地址無法在公網上被使用,但可以在本地被使用。可以用NAT將本地使用的私有IP地址轉換成公有IP地址來訪問公網,以達到節約IP地址的目的。如企業內部不必每臺主機都配一個公網IP,大家儘可使用私有IP地址,並共用多個公網IP來上網。

平時常用ABC 3類IP地址,以A類IP地址為例,只有126個網路,但每個網路都有巨量的主機2^24=16777216。如果一個公司只需要100臺主機,那分配給該公司一個A類IP網段的話,將造成大量的IP地址浪費。因此通常只分配一個C類地址,C類地址的主機號是8位,可供2^8-2=254臺主機用(-2的原因上面說過了,主機號全0是該網段地址,全1是該網段廣播地址),雖然夠用,但該公司只需求100臺主機,仍舊造成IP地址浪費。所以需要VLSM(可變長子網掩碼)子網劃分來更合理地分配IP地址。

VLSM子網劃分的規則:

子網數= 2^子網位數(子網位數 = 掩碼 - 主類網路號,例如某B類IP的掩碼是27,則子網位數為27-16=11,因此子網數為2^11=2048)

主機數= 2^主機號-2(-2的原因上面說過了,主機位全0為網路地址,全1為廣播地址)

塊大小=2^八位組內主機號(例如192.168.10.0  掩碼:255.255.255.192。C類IP主機號是第四個8位組,現在掩碼是192=11000000,意思是問第四個8位組借了前2位作為網路號,因此第四個8位組內主機號是8-2=6位,塊大小為2^6=64)。得出塊大小後,用塊大小數字累加就能得到網路號。


一個C類IP地址子網劃分的例子:

例如192.168.10.0  掩碼:255.255.255.192 (這種寫法很麻煩,192=11000000,即第四個8位組前2位是網路號,總共網路號是26位,可簡寫為192.168.10.0/26)

子網數為2^2=4,主機數為2^6-2=62,塊大小為2^6=64(每個8位組來計算,發生在第三個8位組)。4個子網分別為:
192.168.10.0/26        (單播IP範圍:192.168.10.1 ~ 192.168.10.62)
192.168.10.64/26      (單播IP範圍:192.168.10.65 ~ 192.168.10.126)
192.168.10.128/26    (單播IP範圍:192.168.10.129 ~ 192.168.10.190)
192.168.10.192/26    (單播IP範圍:192.168.10.193 ~ 192.168.10.254)

一個B類IP地址子網劃分的例子:

172.16.0.0/18

子網數為2^2=4,主機數為2^14-2=16382,塊大小為2^6=64(每個8位組來計算,發生在第三個8位組)。4個子網分別為:
172.16.0.0/18        (單播IP範圍:172.16.0.1 ~ 172.16.63.254)
172.16.64.0/18      (單播IP範圍:172.16.64.1 ~ 172.16.127.254)
172.16.128.0/18    (單播IP範圍:172.16.128.1 ~ 172.16.191.254)
172.16.192.0/18    (單播IP範圍:172.16.192.1 ~ 172.16.255.254)

一個B類IP地址子網劃分的例子2:

172.16.0.0/27

子網數為2^11=2048,主機數為2^5-2=30,塊大小為2^5=32(每個8位組來計算,發生在第四個8位組)。2048個子網分別為:
172.16.X.0/27
172.16.X.32/27
172.16.X.64/27
172.16.X.96/27
172.16.X.128/27
172.16.X.160/27
172.16.X.192/27
172.16.X.224/27  (第三位可以從0變化到255)

上面這樣子網劃分,比ABC主類地址能更合理分配IP。下面再介紹一種更能節省IP地址的子網劃分方法:

例如172.16.0.0/16,要劃分成2個200臺主機,3個2臺主機,3個24臺主機,該怎麼劃分子網呢?遵從的原則是從大到小:

1.先算200臺主機:2^n-2 >= 200,n為8,即主機號為8,網路號為24

172.16.0.0/24變化發生在第3個8位組,因為第3個8位組全是網路位,因此塊大小為2^0=1,子網:

172.16.0.0/24    (可以任選2個供200臺主機用,例如選前2個。供200臺主機用)
172.16.1.0/24    (供200臺主機用)
172.16.2.0/24    (未分配)
......
172.16.255.0/24

2.算24個主機:2^n-2 >= 24,n為5,即主機位為5,網路位為27

在172.16.2.0/24基礎上劃分子網:172.16.2.0/27變化發生在第4個8位組,塊大小為2^5=32:

172.16.2.0/27    (可以任選3個供24臺主機用,例如選擇前3個。供24臺主機用)
172.16.2.32/27  (供24臺主機用)
172.16.2.64/27  (供24臺主機用)
172.16.2.128/27 (未分配)
.....

172.16.2.224/27

3.最後算2個主機:2^n-2 >= 2,n為2,即主機位為2,網路位為30

在172.16.2.128/27基礎上劃分子網:172.16.2.0/30變化發生在第4個8位組,塊大小為2^2=4:

172.16.2.128/30  (這3個供2臺主機用)
172.16.2.132/30
172.16.2.136/30

通過上面若干VLSM的例子可用看出,VLSM是從右向左問主機號借用網路號,那CIDR就是網路號向左偏移,相當於主機數擴大了。更官方點說:

CIDR,就是忽略ABC類網路,自定義字首相同的一條路由。

如192.168.12.0/24
192.168.13.0/24
192.168.14.0/24
192.168.15.0/24

都通過路由器E連線路由器F。如果設4條路由很麻煩,希望彙總一下。如果彙總成主類地址192.168.0.0/16太不精確了,可以彙總成192.168.12.0/22一條路由。