天天看點

網絡協定學習(2)---IP位址

一、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.