網際網路世界一切通信都将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就是網絡号向左偏移,相當于主機數擴大了。更官方點說: