網路教學-IP 位址 - :::PCNET網路研究所:::

文章推薦指數: 80 %
投票人數:10人

每一個IP封包都有一個16bit 的唯一識別碼。

我們從OSI 和TCP/IP 的網路層級知識裡面知道﹕當程式產生的數據要通過網路傳送時﹐都會在傳送 ...   I P位址 網際網路協定(IP)是整個TCP/IP協定的基礎﹐它的一些功能在前面的介紹OSI和TCP/IP模型的時候已經略略提過了﹐不過﹐由於它的重要性實在太值得了解﹐因此我們在這裡再深入的探討一下網際網路層的協定。

而事實上,若IP這個環節若不過關的話,我會勸您別償試網路相關的工作了,否則會桶苦一輩子! 大體而言,網際網路協定的功能包括如下﹕ 定義資網際網路中傳輸的基本單位。

定義網際網路的定址方式。

負責網路存取層和傳送層之間的資料傳遞。

決定資料傳送的路由路徑。

執行資料的分解和重組。

這層協定主要要做的事情﹐是將從傳送層傳來的資料準確的送到遠端機器上。

讓我們溫習一下剛學過的ARP協定﹐我們知道當主機獲得應該IP後﹐如果在ARP表格中找不到目的主機的實體位址的時候(因為底層的傳送是以實體位址為依據的)﹐那麼就理由ARP協定是以廣播的方式去尋問對方的實體位址。

不過﹐這裡有一個限制﹕廣播封包是有限制的﹐只能在同一個網段(segment)上的節點才能收到廣播封包。

假如當我們有一個封包﹐從教室傳到網際網路上地球另一邊的主機﹐那這時候要如何處理呢﹖ Okay﹐這就是IP協定要解決的問題了。

讓我們先看看IP封包的格式吧。

IP封包表頭格式 首先﹐讓我們看看IP封包的組成部份﹐以及各部件的長度﹕ Version (4) Internet HeaderLength(4) Type ofService(8) Total Length(16) Identification (16) Flags (3) Fragment Offset(13) Time ToLive(8) Protocol (8) Header checksum(16) Source Address(32) Destination Address(32) Options (Variable) Padding (0-24)   Data .... IP封包格式 在上圖中﹐括號之內的數字就是各部件的長度(bit)﹐如果您夠細心﹐就會計算得出每一行的總長度都是32bit。

事實上,真正的封包是有連續的位元依序排列在一起的,之所以分行,完全是因為排版的關係。

下面,我們分別對各部件名稱解釋一下﹕ Version 版本(VER)。

表示的是IP規格版本﹐目前的IP規格多為版本4(version4)﹐所以這裡的數值通常為0x4(注意﹕封包使用的數字通常都是十六進位的)。

InternetHeaderLength 標頭長度(IHL)。

我們從IP封包規格中看到前面的6行為header﹐如果Options和Padding沒有設定的話﹐也就只有5行的長度﹔我們知道每行有32bit﹐也就是4byte﹔那麼,5列就是20byte了。

20這個數值換成16進位就成了0x14﹐所以﹐當封包標頭長度為最短的時候﹐這裡數值會被換算為0x14。

TypeofService 服務類型(TOS)。

這裡指的是IP封包在傳送過程中要求的服務類型﹐其中一共由8個bit組成﹐每組bit組合分別代表不同的意思﹕ 000..... Routine 設定IP順序﹐預設為0﹐否則﹐數值越高越優先 ...0.... Delay 延遲要求﹐0是正常值﹐1為低要求 ....0... Throughput 通訊量要求﹐0為正常值﹐1為高要求 .....0.. Reliability 可靠性要求﹐0為正常值﹐1為高要求 ......00 NotUsed 未使用 TotalLength 封包總長(TL)。

通常以byte做單位來表示該封包的總長度﹐此數值包括標頭和數據的總和。

Identification 識別碼(ID)。

每一個IP封包都有一個16bit的唯一識別碼。

我們從OSI和TCP/IP的網路層級知識裡面知道﹕當程式產生的數據要通過網路傳送時﹐都會在傳送層被拆散成封包形式發送﹐當封包要進行重組的時候﹐這個ID就是依據了。

Flag 旗標(FL)。

這是當封包在傳輸過程中進行最佳組合時使用的3個bit的識別記號。

請參考下表﹕ 000. 當此值為0的時候﹐表示目前未被使用。

.0.. 當此值為0的時候﹐表示封包可以被分割﹐若為1則不能被分割。

..0. 當上一個值為0時﹐此值為0就示該封包是最後一個封包﹐如果為1則表示其後還有被分割的封包。

FragmentOffset 分割定位(FO)。

當一個大封包在經過一些傳輸單位(MTU)較小的路徑時﹐會被被切割成碎片(fragment)再進行傳送(這個切割和傳送層的打包有所不同﹐它是由網路層決定的)。

由於網路情況或其它因素影響﹐其抵達順序並不會和當初切割順序一至的。

所以當封包進行切割的時候﹐會為各片段做好定位記錄﹐所以在重組的時候﹐就能夠依號入座了。

如果封包沒有被切割﹐那麼FO的值為“0”。

TimeToLive 存活時間(TTL)。

這個TTL的概念﹐在許多網路協定中都會碰到。

當一個封包被賦予TTL值(以秒或跳站數目(hop)為單位)﹐之後就會進行倒數計時。

在IP協定中,TTL是以hop為單位,每經過一個router就減一)﹐如果封包TTL值被降為0的時候﹐就會被丟棄。

這樣﹐當封包在傳遞過程中由於某些原因而未能抵達目的地的時候﹐就可以避免其一直充斥在網路上面。

有隻叫做traceroute的程式﹐就是一個上佳的TTL利用實作﹐我們會在後面的章節裡面討論。

Protocol 協定(PROT)。

這裡指的是該封包所使用的網路協定類型﹐例如﹕ICMP或TCP/UDP等等。

要注意的是﹕這裡使用的協定是網路層的協定﹐這和上層的程式協定(如﹕FTP﹑HTTP等)是不同的。

您可以從Linux的/etc/protocol這個檔案中找到這些協定和其代號﹔其內容如下﹕ ------------------------------------------------------ ip0IP#internetprotocol,pseudoprotocolnumber icmp1ICMP#internetcontrolmessageprotocol igmp2IGMP#InternetGroupManagement ggp3GGP#gateway-gatewayprotocol ipencap4IP-ENCAP#IPencapsulatedinIP(officially``IP'') st5ST#STdatagrammode tcp6TCP#transmissioncontrolprotocol egp8EGP#exteriorgatewayprotocol pup12PUP#PARCuniversalpacketprotocol udp17UDP#userdatagramprotocol hmp20HMP#hostmonitoringprotocol xns-idp22XNS-IDP#XeroxNSIDP rdp27RDP#"reliabledatagram"protocol iso-tp429ISO-TP4#ISOTransportProtocolclass4 xtp36XTP#XpressTranferProtocol ddp37DDP#DatagramDeliveryProtocol idpr-cmtp39IDPR-CMTP#IDPRControlMessageTransport rspf73RSPF#RadioShortestPathFirst. vmtp81VMTP#VersatileMessageTransport ospf89OSPFIGP#OpenShortestPathFirstIGP ipip94IPIP#YetAnotherIPencapsulation encap98ENCAP#YetAnotherIPencapsulation ------------------------------------------------------ HeaderChecksum 標頭檢驗值(HC)。

這個數值主要用來檢錯用的﹐用以確保封包被正確無誤的接收到。

當封包開始進行傳送後﹐接收端主機會利用這個檢驗值會來檢驗餘下的封包﹐如果一切看來無誤﹐就會發出確認信息﹐表示接收正常。

SourceIPAddress 來源位址(SA)。

相信這個不用多解釋了﹐就是發送端的IP位址是也﹐長度為32bit。

DestinationIPAddress 目的地位址(SA)。

也就是接收端的IP位址﹐長度為32bit。

Options&Padding 這兩個選項甚少使用﹐只有某些特殊的封包需要特定的控制﹐才會利用到。

這裡也不作細表啦。

前面所介紹的IP封包格式﹐請花點時間研究一下﹐因為在日後的網路生涯中﹐許多概念都要求設計者非常了解IP和TCP封包(標頭)的結構﹐例如﹕防火牆設定和socket程式設計。

IP位址 當我們知道IP封包結構之後﹐接著我們就要接觸一個在TCP/IP網路管理中最重要的一個概念﹕子網切割(subnetting)。

子網路這個名詞我們前面不斷的碰到過﹐或許同學們心裡都很納悶它究竟是什麼東東?不過﹐在真正了解子網路的定義之前﹐我們必須要先了解的一個概念是IP位址。

IP位址雖然只有4組用小點(.)分開的數字(IPv4)﹐然而它卻是整個TCP/IP協定的基石。

如果我們在討論TCP/IP網路的時候﹐不知道IP位址的各個數字代表什麼意思﹐那就什麼都免談了。

那我們如何解讀出IP位址所隱含的深刻意思呢﹖首先,我們要具備一定的數學和邏輯基礎﹐下面兩個概念是一定要知道的﹕十進位和二進位的換算﹐以及基本邏輯運算。

這裡不打算討論十進位和二進位的換算了﹐如果您忘記了﹐請回學校問問數學老師吧。

然而﹐邏輯運算也不打算詳細討論了﹐下面只把在學習 IP子網計算所需的幾個運算﹐作一簡單歸納而已﹕ AND 0AND0=0 1AND1=1 0AND1=0 凡是有1參與的AND運算﹐其結果都會是對方(不管是0或1)﹔而凡是有0參與的AND運算﹐其結果都會是0。

OR 0OR0=0 1OR1=1 0OR1=1 凡是有0參與的OR運算﹐其結果都是對方﹔而只要有1參與的OR運算﹐其結果都會是1。

NOT NOT0=1 NOT1=0 只有一方參與﹐凡是經過NOT運算﹐其結果都會相反:0變1、1變0。

如果不知道它們的工作原理﹐那麼以後我們在討論IP位址和子網的時候﹐您就只能靠死記一途了。

不過,一旦你知道了其原理﹐那麼您在任何的 IP網路中都不至於迷失﹐所謂“萬變不離其宗”是也。

我們在前面講述網路存取層的時候﹐層介紹過ifconfig命令來查找界面實體位址。

事實上,在命令的輸出結果裡面﹐還包含了一個非常重要的資訊﹕inetaddr和Mask﹕ eth0Linkencap:EthernetHWaddr00:A0:0C:11:EA:11 inetaddr:203.30.35.134Bcast:203.30.35.159Mask:255.255.255.224 UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:0errors:0dropped:0overruns:0frame:0 TXpackets:0errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:100 Interrupt:3Baseaddress:0x300 eth1Linkencap:EthernetHWaddr00:80:C7:47:8C:9A inetaddr:192.168.0.17Bcast:192.168.0.255Mask:255.255.255.0 UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:12303errors:0dropped:0overruns:0frame:0 TXpackets:12694errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:100 Interrupt:10Baseaddress:0x2e0 正如您所見到的IP位址﹐是四組用“.”分開的十進位數字﹐這樣的格式被稱作“Dotted quad”。

其實每一組都是一個8-bit的二進位數字(使用十進完全是為了遷就人類的習慣)﹐我們稱每組數字為一個“octet”﹐合共起來就是一個32-bit的IP位址﹐亦即是IPv4(Version4)版本的位址(現在IPv6也正如火如筡的開發中,則使用128-bit的IP位址)。

好了,我們要如何解讀這32bit位址呢?其實﹐每一組IP號碼都包括兩個識別碼信息﹕Net_ID跟Host_ID。

不過﹐我這裡還是建議大家先來認識一下IP的Class概念。

相信許多人都聽過什麼CClass和BClass這樣的IP了﹐但究竟什麼樣的IP屬於什麼樣Class呢﹖ 如果我們將IP位址全部用二進位來表示的話﹐每個octet都是完整的8個bit﹐如果不夠8-bit的話﹐則往左邊填上0﹐直到補滿為止。

這時候﹐你再看看最左邊的數字是以什麼為開頭的﹕ 如果是以“0”開頭的﹐這是一個AClass的IP 如果是以“10”開頭的﹐這是一個BClass的IP 如果是以“110”為開頭的﹐則屬於CClass的IP 倘若您不懂得如何換算二進位﹐您也可以死記﹕ 由1到126開頭的IP是AClass 由128到191開頭的IP是BClass  由192到223開頭的則為CClass 顯然易見﹐用二進位來識別IPClass容易得多﹗Okay﹐當我們曉得區別IP的Class之後﹐我們就可以知道IP的Net_ID和Host_ID﹕ AClass的IP使用最前面一組數字來做NetID﹐其余三組做HostID BClass的IP使用前面兩組數字來做NetID﹐另兩組做HostID CClass的IP使用前面三組數字來做NetID﹐剩下的一組做HostID 從下圖中﹐您可以輕易的區分上面三個不同的IPClass﹕ 您或許問:為什麼我們需要為IP劃分等級呢﹖這是當初在IP應用早期,為了管理需要而設計的﹕ 如果您要組建一個單一的IP網路﹐那麼您得分配相同的NetID給所有主機﹐而各主機的HostID卻必須是唯一的﹐也就是說沒有任何兩個HostID會是一樣的。

您的網路還要連上internet或其它網路的話﹐那麼您使用的NetID也必須是唯一的﹐也就是必需經過註冊才能獲得否則就會造成衝突了。

若以比較接近現實生活的例子作比喻,就好比您家的電話號碼﹐如果是1234567(HostID)的話﹐那麼在相同區號(NetID)裡﹐其他人將不會再使用這個號碼﹐然而﹐你不能保證在其它區號裡面沒有1234567這個號碼哦﹔然而,若台北使用了區號02的話﹐台南就不能使用02而必須改用其它(如06)。

無論如何﹐整個區號加電話號碼必須是唯一的。

同樣的道理﹕整個IP位址(NetID+HostID)在Internet上也必須是唯一的。

這裡,有一個很特別的NetID﹕127(即二進位的01111111)需要特別一提:它是保留給本機回路測試使用的﹐它不可以被運用於實際的網路中,其中的127.0.0.1則代表任何一台IP主機本身。

此外,還有一個規則我們還必須遵守的﹕在指定HostID的時候﹐換成二進位的話﹐不可以是全部為0﹐也不可以是全部為1。

當HostID全部為0的時候﹐指的是網路本身識別碼﹔而全部為1的時候﹐則為該網路的廣播位址﹐代表的是該網路上的所有主機(注意﹕別將IP的廣播和Ethernet的廣播搞混亂了,兩種廣播是不同層級的)。

很明顯﹐AClass網路可分配的HostID要比CClass的要多好多倍。

讓我們算算可以劃分的NetID數目和各等級裡面的HostID數目就知道了﹕ 因為AClass第一個bit必須為0﹐所以我們在頭一個otect的8個bit就只有7個bit是可變化的。

那麼27=128﹐再減去127這個NetID不能使用﹐那麼我們實際上最多只能劃分127AClass的網路。

而每個AClass的網路之下可以分配2的24次方(能夠使用的HostID之bit數目)﹐亦即16,777,216個HostID﹐但因為二進位數字不可以全部為0或1﹐所以再扣掉兩個,那麼實際能用來分配給主機使用的位址有16,777,214個。

Okay,用同樣的公式去算算CClass好了:因為CClass以110開頭﹐所以從24bit的Net_ID中減去3個bit﹐因此可劃分的CClass網路則為2的21次方(24-3)﹐也就是2,097,152個NetID﹐然後每個ClassC之下則可以劃分28=256-2=254個HostID。

好了﹐接下來請您自己試試看﹐計算出BClass可以劃分多少個NetID﹐以及每個NetID之下的可用HostID數目。

(Tips﹕別忘了Host_ID不能全部為0或1)。

等您計算完畢後再來對照下面的列表﹕ 等級 開首 網路數目 主機數目 使用範圍 申請領域 A 0 127 16,777,214 1.x.x.x到126.x.x.x 國家級 B 10 16,384 16,382 128.x.x.x到 191.x.x.x 跨國組織 C 110 2,097,152 256 192.x.x.x到 223.x.x.x 企業組織 D 1110 - - 224.-到239.- 特殊用途 E 1111 - - 240.-到255.- 保留範圍 IPClass劃分  NetMask 到這裡﹐我必須要向大家交代清楚一件事情﹕在我們進行IP位址劃分的時候﹐IP和NetMask都必須一對使用的﹐兩者缺一不可﹗不過﹐當我們使用分等級的IP位址的時候﹐我們也可以使用預設的mask﹕ AClass的mask是255.0.0.0 BClass的mask是255.255.0.0 CClass的則是255.255.255.0 您或許又有問題了:這是什麼意思啊﹖嗯~~看255比較難理解﹐如果您將之換算為二進位就容易理解多了﹕255=11111111(8個1),剛好是一個全部為1的完整octet。

然後﹐請您把這些NetMask和各等級IP對應看看...聰明的您就會發現一個現象﹕就是~~凡是被1所對應著的IP部份就是NetID﹔凡是被0所對應部份就是HostID﹗ 實際的情形是:當電腦獲得了一對IP和Mask(都是二進位數字)之後﹐電腦會使用一個AND的二進位羅輯運算﹐來求出NetID。

我們可以隨便拿一個IP來做例子﹕ 139.175.152.254換成二進位是﹕ 10001011.10101111.10011000.11111110 因為它是以10開頭的﹐所以是一個BClassIP。

這個Class的預設mask是255.255.0.0﹐換成二進位﹕ 11111111.11111111.00000000.00000000 然後將IP和mask加以AND運算﹕ 10001011.10101111.10011000.11111110 AND 11111111.11111111.00000000.00000000 得出﹕ 10001011.10101111.00000000.00000000 換成十進位就是139.175.0.0﹐這個就是NetID了。

那麼,怎麼求HostID呢﹖也很簡單﹕ 先將NetMask做一個NOT運算﹐可以得出﹕ 00000000.00000000.11111111.11111111 然後再和IP做一次AND運算﹐就可以得到HostID: 00000000.00000000.10011000.11111110﹐ 換成十進位就成了﹕0.0.152.254。

就是這麼簡單﹐多拿些實際IP例子來運算運算您就得心應手了。

當我們設定網路環境的時候﹐除了要輸入IP位址﹑netmask﹑網路位址之外﹐還需要指定廣播位址(broadcast)。

我已經知道如果HostID全部為0是網路位址﹑而全部為1則是廣播位址。

其實廣播位址也可以通過一個簡單運算來獲得﹕ 先將NetMask做一個NOT運算﹐可以得出﹕ 00000000.00000000.11111111.11111111 然後再和IP做一次OR運算﹐就可以得到BroadcastAddress: 10001011.10101111.10011000.11111110 OR 00000000.00000000.11111111.11111111 得出﹕ 10001011.10101111.11111111.11111111 換成十進位就成了﹕139.175.255.255。

  劃分子網路 網路都有一定的節點極限的﹐比如Ethernet通常最多只能連接1,200台主機﹐如果您獲得一個BClass的NetID﹐豈不是浪費很多HostID了嗎﹖要是使用AClass 就更是駭人﹗ 當您遇到這種“有錢人的困擾”的時候﹐Sub-netMask就派上用場了。

如果您剛才還認為預設的NetMask是多餘的話﹐那麼當您知道Sub-netMask的功能之後﹐我敢保證您不會再忽略NetMask了。

Sub-netMask的使用手法就是靠“借”﹐或可以說靠“搶”﹕就是從左往右的按需要將本來屬於HostID的一些連續的bit轉為Sub-netID來使用。

也就是將預設的NetMask的“1”逐漸的往右增加﹐相對地﹐NetMask的“0”則越來越少。

這樣的結果當然是可以獲得更多的NetID﹐換一句話說﹐您可以將一個大的IP網路分割成更多的子網路﹐而每一個子網路的主機數目卻相應的減少。

其情形會是﹕當您借用1個bit的HostID來做Sub-netID的時候﹐會將網路切割開兩個子網路(21=2)﹔如果借2個bit則有4個子網路﹔3個bit則8 個﹔4個bit則16個.....當所有的HostID都借出去之後﹐您可以得到最多數量的子網路﹐但這是毫無意義的﹐因為沒有HostID了﹐您怎麼分配IP給主機呢﹖要是您的HostID只剩下一個bit沒有借出去的話﹐那麼您在每個網路只能得到0和1來作為HostID﹐這也是不行的﹐因為這兩個ID也不可以用來分配給主機。

因此,當您切割網路的時候﹐您得最少留下2個bit來做HostID﹐這時候﹐每個網路最多只能連接2台主機。

咦﹖22不是等於4嗎﹖但別忘了Host_ID不能是兩個0或兩個1哦。

這樣的網路通常會用在WAN與WAN之間的路由器連接。

而在LAN中的應用﹐通常最少要保留3個bit來做Host_ID,比方說,台灣Hinet的固八ADSL(現在您終於知道為甚麼是固八而不是固九了吧?)。

為了更好的理解Sub-netMask的功用﹐我們還是以剛才的IP(139.175.152.254)為例子,再來一翻推算﹕ 我們知道它在預設情形之下的NetMask是﹕ 11111111.11111111.00000000.00000000 如果我們借用了HostID的其中三個bit來做Sub-netID的話﹐將原來的NetMask和Sub-netMask做一個OR的運算﹕ 11111111.11111111.00000000.00000000 OR 00000000.00000000.11100000.00000000 得出﹕ 11111111.11111111.11100000.00000000 換成十進位後﹐實際的NetMask將會變成這樣﹕255.255.224.0。

因為借用的ID只有3個bit﹐所以我們可以將原來的BClass網路切割為8個子網路﹐而它們的Sub-netID則分別從000到111這8個組合﹐再加上原來的NetID(10001011.10101111.00000000.00000000)﹐各子網路的實際NetID就成了﹕ 10001011.10101111.00000000.00000000(139.175.0.0) 10001011.10101111.00100000.00000000(139.175.32.0) 10001011.10101111.01000000.00000000(139.175.64.0) 10001011.10101111.01100000.00000000(139.175.96.0) 10001011.10101111.10000000.00000000(139.175.128.0) 10001011.10101111.10100000.00000000(139.175.160.0) 10001011.10101111.11000000.00000000(139.175.192.0) 10001011.10101111.11100000.00000000(139.175.224.0) 這時候﹐本來是16個bit的HostID只剩下13個bit了﹐也就是說﹕在每個子網路裡面﹐最多只能有213=8,192-2=8,190台主機﹐而它們可分配的號碼分別由 00000.00000001到 11111.11111110之間。

然而,我們並不能簡單的將它以十進位的0.1到31.254這樣表示﹐因為我們在表示一個完整的IP必需是4個完整的Octet,因此我們還得與各個不同的Sub-netID再相加一起才能得出最終的IP號碼。

例如﹕ 在Sub-netID001之下的主機號碼﹐將會是從 00100000.00000001到 00111111.11111110之間﹐ 亦即是﹕從32.1到63.254之間﹐ 整個IP位址則是﹕從139.175.32.1到139.175.63.254之間。

同樣的,在Sub-netID100之下的主機號碼﹐將會是從 10000000.00000001到 10011111.11111110之間﹐ 亦即是﹕從128.1到159.254之間﹐ 整個IP位址則是﹕從139.175.128.1到139.175.159.254之間。

明白了﹖還是請您自己再動手算算在110這個Sub-netID之下的主機號碼範圍是多少﹖還有這個子網的Net_ID和廣播位址分別是什麼﹖ 如果您得出來的主機IP不是139.175.192.1到139.175.223.254之間﹐那麼您需要重新溫習前面所學﹐確定每一個概念都清楚了才繼續。

否則您只會更混亂(記住:我已經在這裡警告過您了)。

Okay﹐這裡讓我們歸納一下以上所學吧﹕ IP等級以開頭的二進位數字來定﹕0﹐10﹐110分別是A﹑B﹑C等級﹔ IP分兩部份﹕NetID和HostID。

預設情形下﹐A以第一個otect來做NetID﹑B則使用前面兩個otect﹑C使用三個oect﹐而剩下的則做HostID; 在為機器指定HostID的時候﹕換成二進位不可以全部為0﹐也不可以全部為1﹐而整個IP位址必須是唯一的﹔ NetMask是給電腦用來計算NetID和HostID的﹐將IP和mask用AND運算得出NetID﹐將mask先經過NOT運算﹐再和IP做AND運算則可以得出HostID﹔ Sub-netMask是“借”HostID來當Sub-netID使用﹐規則是從左往右遞增﹐作用是將一個較大的網路切割成多個較小的網路。

而在顯示IP的時候﹐必須要和Sub-netID加在一起來表示﹔ 不分等級的IP 思考一下﹕如果我的IP是139.175.152.254﹐而NetMask則為255.255.255.0。

您認為是否用錯了netmask呢﹖而203.56.6.18使用255.255.0.0做mask又如何呢﹖ 這裡,我們將較大的IP等級切割成許多較小網路﹐可以說是“有錢人的煩惱”﹔但難道“窮人”就沒有煩惱嗎﹖當然是有啦﹗例如﹕您的公司有接近600台主機﹐想連一個IP網路﹐若申請一個BClass網路似乎太浪費﹐而且﹐說實在﹐也未必可以申請得到﹗那麼申請3個CClass的網路總可以吧﹖當然沒問題啦﹗(如果還沒用光的話)。

然而﹐因為3個CClass網路它們的NetID都各自獨立的﹐如果您要其下的電腦都能溝通的話﹐就要router的參與了(關於routing我們稍後討論)。

但是router一點都不便宜哦﹗就算您老闆不在乎﹐要設定和維護好幾個網路的routing也不是一件輕鬆的事情。

好消息是﹕您可以將這三個CClass網路整合在一起來使用啦﹗使用的是CIDR(ClasslessInter-DomainRouting)技術﹐也就是所謂的不分等級IP了。

使用CIDR的時候﹐您大可不必理會IP的開首字元﹐你可以隨便設定您的NetMask長度。

也就是說﹐一個原本屬於CClass的網路也可以使用255.255.0.0這樣的mask﹐我們稱這樣的網路為“Supernet”﹐跟subnet正好相反就是了。

事實上,早期的IP開發並沒預期到IP消耗量的爆炸性成長,結果Class的設計在後來大大的箝制了IP網路的擃充與靈活性。

例如上例中一個橫跨好幾個CClass的站點,因為不能取得BClass而造成網路數目的急劇成長,同時也導致路由維護的負擔與成本。

因此在1993年IEEENetwork的提案增加了CIDR的擴充,而打破了Class的局限。

如果您的系統支持CIDR協定﹐就可以拋開等級的界限,使用可變長度的netmask(VLSM)靈活的的設計IP網路的範圍與路由。

當然﹐如果要和其它網路溝通﹐您使用的router也必須支援CIDR才行啦﹐不過,現在的router鮮有不使用CIDR的了。

在CIDR引入之後,如果您覺得139.175.152.254/255.255.0.0和192.168.1.1/255.255.255.0這樣的IP表現方法實在太麻煩了﹐這裡有一個更好的表示法﹕使用mask的bit數目長度表示NetMask。

這樣我們就可以將前面兩個IP寫成這樣﹕139.175.152.254/16和203.56.6.18/24。

假如,這裡使用了三個bit的Sub-net﹐我們只要將16改成19、將24改成27就可以了﹔如果是使用了三個bit的Supernet﹐我們將之改成13和21就可以了。

這樣,在表示上和計算上都簡單得多﹐非常值得提倡。

"公共IP"與"私有IP" 當我們要將網路連上Intetnet的時候﹐我們必須先註冊好NetID﹐如果該ID已經被使用了﹐您就必須選用另外的ID了。

負責 InternetIP註冊的機構叫做InterNIC(NetworkInformationCenter)﹐他們的網路位址是http://www.internic.net。

不過,實際上的運作,一般機構或個人是不太可能直接從 InterNIC上注冊IP的,而是經您的ISP分配下來。

這些經過合法授權使用的IP,我們稱之為公共IP(Public IP) 然而,由於Internet的爆炸性成長﹐IP的位址買少見少﹐而且在很多機構裡﹐也不是所有機器都有必要使用註冊的IP位址。

於是﹐我們就在A﹑B﹑C這三個層級裡面﹐各劃出一些位址範圍保留給私有位址所用﹐它們分別是﹕ 10.0.0.0-10.255.255.255 172.16.0.0-172.31.255.255 192.168.0.0-192.168.255.255 當您使用這些位址的時候﹐當然是有所限制的﹕ 私有位址的路由資訊不能對外散播 使用私有位址作為來源或目的位址的封包﹐不能透過Internet來轉送 關於私有位址的參考紀錄﹐只能限於內部網路使用 正是由於這些限制﹐當我們使用這些私有位址來設定網路的時候﹐就無需擔心會和其它也使用相同位址的網路衝突。

而這些無需註冊就能自由使用的IP,我們稱之為私有IP(PrivateIP)。

當我們架設IP網路的時候,私有IP給與我們很大的方便。

比方說﹕您目前的公司還沒有連上Internet﹐且也沒有或得公共IP的註冊。

倘若使用公共IP的話﹐等到以後真正要連上網路的時候﹐就很可能和別人衝突了。

其壞處是:由於您的IP不是合法授權使用的,別人跟本連不進來,而且,與您衝突的IP您卻永遠沒法連上去(若對方是您的最大客戶可就慘了)。

若是那時候再重新規劃IP的話﹐將是件非常頭痛的問題! 解決的辦法是:我們可以先利用私有位址來架設網路﹐等到真要連上intetnet的時候﹐我們可以使用代理伺服器(proxy)或IP轉換(NAT---Network AddresssTranslation)等技術﹐配合新註冊的IP就可以了。

由於私有位址在Internet上是不能路由的﹐用來架設企業內部網路﹐在安全上面也是有所幫助的。

當然了﹐如果在課堂上或在家裡架設IP網路﹐使用私有位址也是個不錯的主意哦。

說到這裡,不得不提醒一下大家:在平時的技術討論中,許多人愛用"真實IP"、"合法IP"、或"實體IP"來稱呼PublicIP﹔以"假 IP"、"非法IP"、或"虛擬IP"來稱呼PrivateIP。

但我認為都不太貼切,雖然在初學階段還不算甚麼,但隨著深入的研究,以後在討論 nat,vpn,vip,ipvs等進階技術的時侯,卻很可能因為名詞的誤解而浪費大量的時間在彎路上打轉。

為此,我建議您儘量使用"公共 IP"與"私有IP"來稱呼PublicIP與PrivateIP,若您有興趣了解詳細原因,不妨花點時間看看<> 這篇溫章。

參考資料﹕ IP協定的RFC文件可以參考﹕RFC-791﹑RFC-1122﹑RFC-815﹑RFC-1700。

  習題﹕ 請簡述網際網路層的主要功能。

請描述IP封包的格式﹐以及各部件的功能。

請講述如何判斷一個IP位址的Class屬性﹐以及如何判別各Class的Net_ID和Host_ID。

請用生活實例來模擬Net_ID和Host_ID的作用。

請運用IP位址實例來講述NetMask的作用﹐然後以課堂的實際需求以分組原則來切割教學子網。

請問什麼是CIDR﹖請用實例來探討CIDR的作用。

請講述私有IP的作用﹐以及它們的範圍。

    www.study-area.org©2002 Netman網中人 LastUpdated:March31,2003



請為這篇文章評分?