網路教學-IP 位址 - :::PCNET網路研究所:::
文章推薦指數: 80 %
每一個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
延伸文章資訊
- 1網路教學-IP 位址 - :::PCNET網路研究所:::
每一個IP封包都有一個16bit 的唯一識別碼。我們從OSI 和TCP/IP 的網路層級知識裡面知道﹕當程式產生的數據要通過網路傳送時﹐都會在傳送 ...
- 2實驗3 IP協定分析
IP表頭:記錄有關IP位址、路由、封包識別等資訊。 長度為4 Bytes的倍數,最短為20 Bytes,最長可達60. Bytes。 ○ IP ...
- 3教你如何快速看懂TCP/IP五層網路封包| Leo 程式筆記 - - 點部落
當來源/目的的MAC地址、IP位置、Port號都被定義後,就能將封包正確的送往目的地。 封包解析. 當我們用像是WireShark等其他軟體側錄封包內容時,大概會看到 ...
- 4IPv4 - iT 邦幫忙
IP封包的組成部份,以及各部件的長度(事實上,真正的封包是由連續的位元依序排列在一起的,之所以分行,完全是因為排版的關係):
- 5TCP/IP
IP 封包表頭格式