1. 程式人生 > >網絡協議學習(2)---IP地址

網絡協議學習(2)---IP地址

進制 減少 發現 利用 網絡號 一個數 需要 nbsp 系列

一、IPv4地址

IPv4地址為32bit地址,分為5類(ABCDE,這裏不討論特殊用途的D和E類)。

通常我們八位一看,寫成4個部分,例如:00000000 00000000 00000000 00000000,用點分十進制法就寫成0.0.0.0;

11111111 11111111 11111111 11111111,可寫成255.255.255.255。

下面統一用紫色標註IP地址中的網絡部分,藍色表示主機部分。下面的說法中基本上“網絡段=網絡號=IP地址的網絡部分”,就不一個個修改了:)

A類地址

A類地址必須以一個‘0’開頭,緊接著的7位代表網絡段,剩余24位表示主機段。

先不看主機段,網絡段的7位全為0或全為1分別表示最小或最大的網絡段,即:

0 0000000 00000000 00000000 00000000

它代表的地址是0.0.0.0;

0 1111111 00000000 00000000 00000000

也即127.0.0.0。但實際上網絡位不能全為0或者全為1,全為0表示所有網絡,全位1用作網絡回路測試。

剩下24位是主機位,那麽一共可以有2^24-2個主機,它也要減2是因為主機位同樣不能全為0或1,全為0表示網絡地址,全為1表示本地廣播,在子網掩碼部分還會講到。

因此A類地址的範圍是0.0.0.0-127.255.255.255。可用網絡段1.X.X.X - 126.X.X.X共126(2^7-2)個,可用主機段X.0.0.1 - X.255.255.254共2^24 - 2個。

B類地址

B類地址必須以一個‘10’開頭,後面的14位表示網絡段,剩余16位表示主機段。

同樣的,先不看主機段:

10 000000 00000000 00000000 00000000

即128.0.0.0;128.0為最小網絡段

10 111111 11111111 00000000 00000000

即191.255.0.0;191.255為最大網絡段。因此一共是2^14個網絡段。

最大地址是191.255.255.255,當然主機號還是不能全為0或1,有2^16-2個主機段。

C類地址

C類地址必須以一個‘110’開頭,後面的21位表示網絡段,剩余8位表示主機段。

110 00000 00000000 00000000 00000000

即192.0.0.0;

110 11111 11111111 11111111 00000000

即223.255.255.0;共有2^21個網絡段;

最大地址是223.255.255.255,有2^8-2個主機段。

二、子網掩碼

利用IP地址的網絡段,我們可以唯一的標識一個物理網絡。現在考慮我們要將一些網絡(Network)連接到Internet上來,對於一個Network,無論它擁有的主機數多小,它至少都需要一個C類網絡地址,如果它擁有超過255個的主機(或者有拓展到超過255個主機數的可能),那就需要一個B類網絡,但對於我們的IPv4地址,它的地址數是有限的(大約40多億個),如果是有300個主機的小網絡,卻不得不使用B類網絡(一個B類網絡有65534個主機段),那就浪費了6萬多個地址,這使得地址的消耗變得非常快(事實上,早在2011年IPv4地址就分配完了……)

而網絡段同樣也是IPv4地址的一個掣肘,學習路由的相關概念我們知道,路由器通常要建立一個轉發表(Forwarding table)來告知自己怎樣到達不同的主機,因此主機數越多,轉發表也越龐大,大的轉發表給路由器又帶來了性能負擔……

為了給IPv4地址“續命”,或者說為了更高效地使用IP地址,人們想出了一種叫做子網(Subnet)的辦法。

子網的想法是將一個IP地址分配給一系列的物理網絡。當然,這些物理網絡是有要求的,它們在距離上應該比較接近,對於一個遠程端點來說,它往往會被視作一個獨立的網絡(有獨立的網絡號)。比較理想的子網情景是有某個大公司或者學校內部,它們有很多個物理網絡,並且最終作為某個網絡(主網絡)的子網,外界與它們內部的網絡打交道時只要知道主網絡與Internet的連接點就行了。

實現子網的方式是使用子網掩碼。子網掩碼與IP地址相同,也是32位,也分為網絡段和主機段,而且它的網絡段都是1,主機段都是0(為什麽是1和0下面解釋)。對於簡單的IP地址來說,所有同一個網絡下的主機IP都有相同的網絡段,而子網掩碼則說:所有同一物理網絡下的主機都屬於相同的子網,這些子網又可能屬於同一個主網絡,這就使得不同物理網絡下的主機可能擁有相同的網絡號。

以一個B類地址128.96.34.15為例,我們使用按位與運算,將子網掩碼的前幾位都設置為1,X & 1 = X,而X & 0 = 0,這樣我們將IP地址與子網掩碼按位與時,主機部分的信息都被“遮蔽”了。現在假設它的子網掩碼是11111111 11111111 11111111 100000000,即255.255.255.128,將它與128.96.34.15按位與,得到128.96.34.0,這就可以獲知自己所在的子網號。

考慮如下兩個主機:;

H1:所在子網128.96.34.0,子網掩碼255.255.255.128,IP是128.96.34.15

H2:所在子網128.96.34.128,子網掩碼255.255.255.128,IP是128.96.34.139

如果H1要發東西給H2,那麽H1要將H2的地址與自己的子網掩碼按位與,發現結果是128.96.32.128,而自己所在子網是129.96.32.0,這說明H1與H2不在同一子網中,因此H1將數據包發送給路由器,由路由器轉發給H2.

子網掩碼使得我們將一個IP地址“升格”了,例如128.96.34.0,使用子網掩碼255.255.255.128它可以表示從128.96.34.0-128.96.34.127的128個地址(0到127與128按位與都得0),而在外界的目光看來,這些網絡其實都是一個網絡,是128.96.34.0(主網號),這就大大減少了路由器的負擔。

子網掩碼的設計:

上面已經討論過使用按位與運算來保留網絡部分的信息而過濾掉主機部分的信息,對於A類網絡,它的網絡部分(這裏也算上開頭的‘0’)是前8位,因此A類網絡的子網掩碼一定是255.X.X.X,類似的B類是255.255.X.X,C類網絡是255.255.255.X。

假設我們申請到一個B類網絡段168.195,需要27個子網,要怎麽設計子網掩碼呢?

27 < 32 = 2^5,意味著我們至少需要5個二進制位來區分這些子網,即對於“原裝的”B類子網掩碼255.255.0.0,我們需要額外的5個二進制位來保存子網網絡號信息,而網絡段排在主機段前面,因此將255.255.0.0的主機段前5位置1就行了,得到255.255.248.0,11111111 11111111 11111 000 00000000。這樣我們可以保證一個主網IP旗下的IP與子網掩碼按位與之後能夠得到它。

類似的給定網絡段,要求依據每個子網內的主機數來設計子網掩碼,先將原裝的子網掩碼全部置1,然後從右往左置需要過濾的主機位數個0就行了。每個子網700個主機就置10個0(512 < 700 < 1024)。

使用子網掩碼,我們一定程度上解決了路由器轉發表的問題,但還沒有解決上述的IP浪費問題。此外,子網掩碼也帶來了新的問題,以某B類主網號128.96.0.0為例,如果使用子網掩碼255.255.0.0,那麽它所指代的網絡IP就是從128.96.0.0到128.96.255.255的所有IP,我們可以發現主網號與旗下的一個網絡地址128.96.0.0重疊。這時如果外界說要發送給129.96.0.0,主網就會感到疑惑,它不知道這是要發給自己的還是要發給旗下的128.96.0.0。


三、CIDR

CIDR的全稱是Classless Interdomain Routing,即無類別域間路由。

CIDR表示方法:IP地址/網絡ID的位數(網段的劃分更加靈活)

我們知道確定一個子網需要知道主機地址和子網掩碼,但用CIDR的形式,可以簡單得到兩個數值。舉例說吧,192.168.0.0/24”就表示,這個網段的IP地址從192.168.0.1開始,到192.168.0.254結束(192.168.0.0和192.168.0.255有特殊含義,不能用作IP地址);子網掩碼是255.255.255.0。
上面的子網掩碼怎麽來的呢?其實關鍵就在“24”上。我們知道IP地址是四個十進制數組成的,相當於32位二進制。用CIDR表示形式,後一個數字將這32位進行了間隔(以24為例):前24位用"1"表示,後面8位用0表示,得到一個二進制數:
11111111 11111111 11111111 00000000。將其轉化為十進制,就是:255.255.255.0了。
例如:192.168.1.0/24表示網段是192.168.1.0,子網掩碼是24位,子網掩碼為:255.255.255.0,用二進制表示為:11111111 11111111 11111111 00000000 ,這裏為什麽是24呢,就是因為子網掩碼裏面的前面連續的“1”的個數為24個,一定要連續的才行。
再給你舉個例子,192.168.1.0/28表示的意思是網段是192.168.1.0,子網掩碼為:255.255.255.240,用二進制表示為:11111111 11111111 11111111 11110000。
這時候你也許就疑惑了,就是24和28兩個字不一樣,為什麽網段是一樣的呢?
24位說明網絡位是24位,那麽主機位就是32-24=8位了,則子網的IP個數是254個,即是從00000001到11111110.
28位說明網絡位是28位,那麽主機位4位,則子網的IP個數是14個,即是從00000001到00001110.

網絡協議學習(2)---IP地址