I P 位址


網際網路協定( IP )是整個 TCP/IP 協定的基礎﹐它的一些功能在前面的介紹 OSI 和 TCP/IP 模型的時候已經略略提過了﹐不過﹐由於它的重要性實在太值得了解﹐因此我們在這裡再深入的探討一下網際網路層的協定。而事實上,若 IP 這個環節若不過關的話,我會勸您別償試網路相關的工作了,否則會桶苦一輩子!

大體而言,網際網路協定的功能包括如下﹕

  • 定義資網際網路中傳輸的基本單位。
  • 定義網際網路的定址方式。
  • 負責網路存取層和傳送層之間的資料傳遞。
  • 決定資料傳送的路由路徑。
  • 執行資料的分解和重組。

這層協定主要要做的事情﹐是將從傳送層傳來的資料準確的送到遠端機器上。讓我們溫習一下剛學過的 ARP 協定﹐我們知道當主機獲得應該 IP 後﹐如果在 ARP 表格中找不到目的主機的實體位址的時候(因為底層的傳送是以實體位址為依據的)﹐那麼就理由 ARP 協定是以廣播的方式去尋問對方的實體位址。不過﹐這裡有一個限制﹕廣播封包是有限制的﹐只能在同一個網段( segment )上的節點才能收到廣播封包。假如當我們有一個封包﹐從教室傳到網際網路上地球另一邊的主機﹐那這時候要如何處理呢﹖

Okay﹐這就是 IP 協定要解決的問題了。讓我們先看看 IP 封包的格式吧。

IP 封包表頭格式

首先﹐讓我們看看IP封包的組成部份﹐以及各部件的長度﹕

Version (4) Internet Header Length (4) Type of Service (8) Total Length (16)
Identification (16) Flags (3) Fragment Offset (13)
Time To Live (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 (version 4)﹐所以這裡的數值通常為 0x4 (注意﹕封包使用的數字通常都是十六進位的)。

Internet Header Length
標頭長度 (IHL)。我們從 IP 封包規格中看到前面的 6 行為 header ﹐如果 Options 和 Padding沒有設定的話﹐也就只有5 行的長度﹔我們知道每行有 32bit ﹐也就是 4byt e﹔那麼, 5 列就是 20byte 了。20 這個數值換成 16 進位就成了 0x14﹐所以﹐當封包標頭長度為最短的時候﹐這裡數值會被換算為 0x14 。

Type of Service
服務類型 (TOS)。這裡指的是 IP 封包在傳送過程中要求的服務類型﹐其中一共由 8 個 bit 組成﹐每組 bit 組合分別代表不同的意思﹕

000..... Routine 設定 IP 順序﹐預設為 0 ﹐否則﹐數值越高越優先
...0.... Delay 延遲要求﹐ 0 是正常值﹐ 1 為低要求
....0... Throughput 通訊量要求﹐ 0 為正常值﹐ 1 為高要求
.....0.. Reliability 可靠性要求﹐0 為正常值﹐ 1 為高要求
......00 Not Used 未使用

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

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

Flag
旗標 (FL)。這是當封包在傳輸過程中進行最佳組合時使用的 3 個 bit 的識別記號。請參考下表﹕

000. 當此值為 0 的時候﹐表示目前未被使用。
.0.. 當此值為 0 的時候﹐表示封包可以被分割﹐若為 1 則不能被分割。
..0. 當上一個值為 0 時﹐此值為 0 就示該封包是最後一個封包﹐如果為 1 則表示其後還有被分割的封包。

Fragment Offset
分割定位 (FO)。當一個大封包在經過一些傳輸單位(MTU)較小的路徑時﹐會被被切割成碎片(fragment) 再進行傳送(這個切割和傳送層的打包有所不同﹐它是由網路層決定的)。由於網路情況或其它因素影響﹐其抵達順序並不會和當初切割順序一至的。所以當封包進行切割的時候﹐會為各片段做好定位記錄﹐所以在重組的時候﹐就能夠依號入座了。

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

Time To Live
存活時間 (TTL)。這個 TTL 的概念﹐在許多網路協定中都會碰到。當一個封包被賦予 TTL 值(以秒或跳站數目(hop)為單位)﹐之後就會進行倒數計時。在 IP 協定中,TTL 是以 hop 為單位,每經過一個 router 就減一)﹐如果封包 TTL 值被降為 0 的時候﹐就會被丟棄。這樣﹐當封包在傳遞過程中由於某些原因而未能抵達目的地的時候﹐就可以避免其一直充斥在網路上面。有隻叫做 traceroute 的程式﹐就是一個上佳的 TTL 利用實作﹐我們會在後面的章節裡面討論。

Protocol
協定(PROT)。這裡指的是該封包所使用的網路協定類型﹐例如﹕ICMP 或 TCP/UDP 等等。要注意的是﹕這裡使用的協定是網路層的協定﹐這和上層的程式協定(如﹕FTP、HTTP 等)是不同的。您可以從 Linux 的 /etc/protocol 這個檔案中找到這些協定和其代號﹔其內容如下﹕
------------------------------------------------------
ip      0       IP              # internet protocol, pseudo protocol number
icmp    1       ICMP            # internet control message protocol
igmp    2       IGMP            # Internet Group Management
ggp     3       GGP             # gateway-gateway protocol
ipencap 4       IP-ENCAP        # IP encapsulated in IP (officially ``IP'')
st      5       ST              # ST datagram mode
tcp     6       TCP             # transmission control protocol
egp     8       EGP             # exterior gateway protocol
pup     12      PUP             # PARC universal packet protocol
udp     17      UDP             # user datagram protocol
hmp     20      HMP             # host monitoring protocol
xns-idp 22      XNS-IDP         # Xerox NS IDP
rdp     27      RDP             # "reliable datagram" protocol
iso-tp4 29      ISO-TP4         # ISO Transport Protocol class 4
xtp     36      XTP             # Xpress Tranfer Protocol
ddp     37      DDP             # Datagram Delivery Protocol
idpr-cmtp       39      IDPR-CMTP       # IDPR Control Message Transport
rspf    73      RSPF            #Radio Shortest Path First.
vmtp    81      VMTP            # Versatile Message Transport
ospf    89      OSPFIGP         # Open Shortest Path First IGP
ipip    94      IPIP            # Yet Another IP encapsulation
encap   98      ENCAP           # Yet Another IP encapsulation
------------------------------------------------------

Header Checksum
標頭檢驗值(HC)。這個數值主要用來檢錯用的﹐用以確保封包被正確無誤的接收到。當封包開始進行傳送後﹐接收端主機會利用這個檢驗值會來檢驗餘下的封包﹐如果一切看來無誤﹐就會發出確認信息﹐表示接收正常。

Source IP Address
來源位址(SA)。相信這個不用多解釋了﹐就是發送端的 IP 位址是也﹐長度為 32 bit。

Destination IP Address
目的地位址(SA)。也就是接收端的 IP 位址﹐長度為 32 bit。

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

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

IP 位址

當我們知道 IP 封包結構之後﹐接著我們就要接觸一個在 TCP/IP 網路管理中最重要的一個概念﹕ 子網切割( subnetting ) 。子網路這個名詞我們前面不斷的碰到過﹐或許同學們心裡都很納悶它究竟是什麼東東?不過﹐在真正了解子網路的定義之前﹐我們必須要先了解的一個概念是 IP 位址。

IP 位址雖然只有 4 組用小點 (.) 分開的數字(IP v4)﹐然而它卻是整個 TCP/IP 協定的基石。如果我們在討論 TCP/IP 網路的時候﹐不知道 IP 位址的各個數字代表什麼意思﹐那就什麼都免談了。

那我們如何解讀出 IP 位址所隱含的深刻意思呢﹖首先,我們要具備一定的數學和邏輯基礎﹐下面兩個概念是一定要知道的﹕十進位和二進位的換算﹐以及基本邏輯運算。這裡不打算討論十進位和二進位的換算了﹐如果您忘記了﹐請回學校問問數學老師吧。然而﹐邏輯運算也不打算詳細討論了﹐下面只把在學習 IP 子網計算所需的幾個運算﹐作一簡單歸納而已﹕

AND 0 AND 0 = 0
1 AND 1 = 1
0 AND 1 = 0
凡是有 1參與的 AND 運算﹐其結果都會是對方(不管是 0 或 1)﹔而凡是有 0 參與的 AND 運算﹐其結果都會是 0 。

OR

0 OR 0 = 0
1 OR 1 = 1
0 OR 1 = 1
凡是有 0 參與的 OR 運算﹐其結果都是對方﹔而只要有 1 參與的 OR 運算﹐其結果都會是 1 。
NOT NOT 0 = 1
NOT 1 = 0
只有一方參與﹐凡是經過 NOT 運算﹐其結果都會相反:0 變 1 、1 變 0 。

如果不知道它們的工作原理﹐那麼以後我們在討論 IP 位址和子網的時候﹐您就只能靠死記一途了。不過,一旦你知道了其原理﹐那麼您在任何的 IP 網路中都不至於迷失﹐所謂“萬變不離其宗”是也。

我們在前面講述網路存取層的時候﹐層介紹過 ifconfig 命令來查找界面實體位址。事實上,在命令的輸出結果裡面﹐還包含了一個非常重要的資訊﹕inet addr 和 Mask﹕

eth0   Link encap:Ethernet  HWaddr 00:A0:0C:11:EA:11
       inet addr:203.30.35.134 Bcast:203.30.35.159 Mask:255.255.255.224
       UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
       RX packets:0 errors:0 dropped:0 overruns:0 frame:0
       TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
       collisions:0 txqueuelen:100
       Interrupt:3 Base address:0x300

eth1   Link encap:Ethernet  HWaddr 00:80:C7:47:8C:9A
       inet addr:192.168.0.17 Bcast:192.168.0.255 Mask:255.255.255.0
       UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
       RX packets:12303 errors:0 dropped:0 overruns:0 frame:0
       TX packets:12694 errors:0 dropped:0 overruns:0 carrier:0
       collisions:0 txqueuelen:100
       Interrupt:10 Base address:0x2e0

正如您所見到的 IP 位址﹐是四組用“.”分開的十進位數字﹐這樣的格式被稱作“Dotted quad”。其實每一組都是一個 8-bit 的二進位數字(使用十進完全是為了遷就人類的習慣)﹐我們稱每組數字為一個“octet”﹐合共起來就是一個 32-bit 的 IP 位址﹐亦即是 IP v4 (Version 4) 版本的位址(現在IPv6 也正如火如筡的開發中 ,則使用 128-bit 的 IP 位址)。好了,我們要如何解讀這 32bit 位址呢?其實﹐每一組 IP 號碼都包括兩個識別碼信息﹕Net_ID Host_ID。不過﹐我這裡還是建議大家先來認識一下 IP 的 Class 概念。

相信許多人都聽過什麼 C Class 和 B Class 這樣的 IP 了﹐但究竟什麼樣的 IP 屬於什麼樣 Class 呢﹖

如果我們將 IP 位址全部用二進位來表示的話﹐每個 octet 都是完整的 8 個 bit ﹐如果不夠 8-bit 的話﹐則往左邊填上 0 ﹐直到補滿為止。這時候﹐你再看看最左邊的數字是以什麼為開頭的﹕

  • 如果是以“0”開頭的﹐這是一個 A Class的 IP
  • 如果是以“10”開頭的﹐這是一個 B Class的 IP
  • 如果是以“110”為開頭的﹐則屬於 C Class的 IP

倘若您不懂得如何換算二進位﹐您也可以死記﹕

  • 由 1 到 126 開頭的 IP 是 A Class
  • 由 128 到 191開頭的 IP是 B Class 
  • 由 192 到 223 開頭的則為 C Class

顯然易見﹐用二進位來識別 IP Class 容易得多﹗Okay﹐當我們曉得區別 IP 的 Class 之後﹐我們就可以知道 IP 的 Net_IDHost_ID

  • A Class 的 IP 使用最前面一組數字來做 Net ID﹐其余三組做 Host ID
  • B Class 的 IP 使用前面兩組數字來做 Net ID﹐另兩組做 Host ID
  • C Class 的 IP 使用前面三組數字來做 Net ID﹐剩下的一組做 Host ID

從下圖中﹐您可以輕易的區分上面三個不同的 IP Class ﹕

您或許問:為什麼我們需要為 IP 劃分等級呢﹖這是當初在 IP 應用早期,為了管理需要而設計的﹕

如果您要組建一個單一的 IP 網路﹐那麼您得分配相同的 Net ID 給所有主機﹐而各主機的 Host ID 卻必須是唯一的﹐也就是說沒有任何兩個 Host ID 會是一樣的。您的網路還要連上 internet 或其它網路的話﹐那麼您使用的 Net ID 也必須是唯一的﹐也就是必需經過註冊才能獲得否則就會造成衝突了。若以比較接近現實生活的例子作比喻,就好比您家的電話號碼﹐如果是 1234567(Host ID) 的話﹐那麼在相同區號 (Net ID)裡﹐其他人將不會再使用這個號碼﹐然而﹐你不能保證在其它區號裡面沒有 1234567 這個號碼哦﹔然而,若台北使用了區號 02 的話﹐台南就不能使用 02 而必須改用其它(如 06 )。無論如何﹐整個區號加電話號碼必須是唯一的。同樣的道理﹕整個 IP 位址 (Net ID + Host ID) 在 Internet 上也必須是唯一的。這裡,有一個很特別的 Net ID﹕ 127 (即二進位的 01111111) 需要特別一提:它是保留給本機回路測試使用的﹐它不可以被運用於實際的網路中,其中的 127.0.0.1 則代表任何一台 IP 主機本身。

此外,還有一個規則我們還必須遵守的﹕在指定 Host ID 的時候﹐換成二進位的話﹐不可以是全部為 0 ﹐也不可以是全部為 1。當 Host ID 全部為 0 的時候﹐指的是網路本身識別碼﹔而全部為 1 的時候﹐則為該網路的廣播位址﹐代表的是該網路上的所有主機(注意﹕別將 IP 的廣播和 Ethernet 的廣播搞混亂了,兩種廣播是不同層級的)。

很明顯﹐A Class 網路可分配的 Host ID 要比 C Class 的要多好多倍。讓我們算算可以劃分的 Net ID 數目和各等級裡面的 Host ID 數目就知道了﹕

因為 A Class 第一個 bit 必須為 0 ﹐所以我們在頭一個 otect 的 8 個 bit 就只有 7 個 bit 是可變化的。那麼 27 = 128﹐再減去 127 這個 Net ID 不能使用﹐那麼我們實際上最多只能劃分127 A Class 的網路。而每個 A Class 的網路之下可以分配 2 的 24 次方(能夠使用的 Host ID 之 bit 數目)﹐亦即 16,777,216 個 Host ID﹐但因為二進位數字不可以全部為 0 或 1﹐所以再扣掉兩個,那麼實際能用來分配給主機使用的位址有 16,777,214 個。

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

好了﹐接下來請您自己試試看﹐計算出 B Class 可以劃分多少個 Net ID ﹐以及每個 Net ID 之下的可用 Host ID 數目。( 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.- 保留範圍

IP Class 劃分

 

Net Mask

到這裡﹐我必須要向大家交代清楚一件事情﹕在我們進行 IP 位址劃分的時候﹐IP 和 Net Mask 都必須一對使用的﹐兩者缺一不可﹗不過﹐當我們使用分等級的 IP 位址的時候﹐我們也可以使用預設的 mask ﹕

  • A Class的mask 是 255.0.0.0
  • B Class 的 mask 是 255.255.0.0
  • C Class 的則是 255.255.255.0

您或許又有問題了:這是什麼意思啊﹖嗯~~ 看 255 比較難理解﹐如果您將之換算為二進位就容易理解多了﹕255 = 11111111(8個1),剛好是一個全部為 1 的完整 octet 。然後﹐請您把這些 Net Mask 和各等級 IP 對應看看... 聰明的您就會發現一個現象﹕就是~~ 凡是被 1 所對應著的 IP 部份就是 Net ID﹔凡是被 0 所對應部份就是 Host ID ﹗

實際的情形是:當電腦獲得了一對 IP 和 Mask (都是二進位數字)之後﹐電腦會使用一個 AND 的二進位羅輯運算﹐來求出 Net ID。我們可以隨便拿一個 IP 來做例子﹕

139.175.152.254 換成二進位是﹕
10001011.10101111.10011000.11111110

因為它是以 10 開頭的﹐所以是一個 B Class IP。這個 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 ﹐這個就是 Net ID了。

那麼,怎麼求 Host ID 呢﹖也很簡單﹕

先將 Net Mask 做一個 NOT 運算﹐可以得出﹕
00000000.00000000.11111111.11111111

然後再和 IP 做一次 AND 運算﹐就可以得到 Host ID:
00000000.00000000.10011000.11111110 ﹐

換成十進位就成了﹕0.0.152.254。

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

當我們設定網路環境的時候﹐除了要輸入 IP 位址、netmask 、網路位址之外﹐還需要指定廣播位址( broadcast )。我已經知道如果 Host ID 全部為 0 是網路位址、而全部為 1 則是廣播位址。其實廣播位址也可以通過一個簡單運算來獲得﹕

先將 Net Mask 做一個 NOT 運算﹐可以得出﹕
00000000.00000000.11111111.11111111

然後再和IP做一次 OR 運算﹐就可以得到 Broadcast Address:
10001011.10101111.10011000.11111110
OR
00000000.00000000.11111111.11111111
得出﹕
10001011.10101111.11111111.11111111

換成十進位就成了﹕139.175.255.255。

 

劃分子網路

網路都有一定的節點極限的﹐比如 Ethernet 通常最多只能連接 1,200 台主機﹐如果您獲得一個 B Class 的 Net ID﹐豈不是浪費很多 Host ID了 嗎﹖要是使用 A Class 就更是駭人﹗

當您遇到這種“有錢人的困擾”的時候﹐Sub-net Mask 就派上用場了。如果您剛才還認為預設的 Net Mask 是多餘的話﹐那麼當您知道 Sub-net Mask 的功能之後﹐我敢保證您不會再忽略 Net Mask了。

Sub-net Mask 的使用手法就是靠“借”﹐或可以說靠“搶”﹕就是從左往右的按需要將本來屬於 Host ID 的一些連續的 bit 轉為 Sub-net ID 來使用。也就是將預設的 Net Mask 的“1”逐漸的往右增加﹐相對地﹐Net Mask的“0”則越來越少。這樣的結果當然是可以獲得更多的 Net ID﹐換一句話說﹐您可以將一個大的 IP 網路分割成更多的子網路﹐而每一個子網路的主機數目卻相應的減少。

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

因此,當您切割網路的時候﹐您得最少留下 2 個 bit 來做 Host ID﹐這時候﹐每個網路最多只能連接 2 台主機。咦﹖22 不是等於 4 嗎﹖但別忘了 Host_ID 不能是兩個 0 或兩個 1 哦。這樣的網路通常會用在 WAN 與 WAN 之間的路由器連接。而在 LAN 中的應用﹐通常最少要保留 3 個 bit 來做 Host_ID,比方說,台灣 Hinet 的固八 ADSL (現在您終於知道為甚麼是固八而不是固九了吧?)。

為了更好的理解 Sub-net Mask 的功用﹐我們還是以剛才的 IP (139.175.152.254) 為例子,再來一翻推算﹕

我們知道它在預設情形之下的 Net Mask 是﹕
11111111.11111111.00000000.00000000

如果我們借用了 Host ID 的其中三個 bit 來做 Sub-net ID 的話﹐將原來的 Net Mask 和 Sub-net Mask 做一個 OR 的運算﹕
11111111.11111111.00000000.00000000
OR
00000000.00000000.11100000.00000000
得出﹕
11111111.11111111.11100000.00000000

換成十進位後﹐實際的 Net Mask 將會變成這樣﹕255.255.224.0 。

因為借用的 ID 只有 3 個 bit﹐所以我們可以將原來的 B Class 網路切割為 8 個子網路﹐而它們的 Sub-net ID 則分別從 000 到 111 這 8 個組合﹐再加上原來的 Net ID (10001011.10101111.00000000.00000000)﹐各子網路的實際 Net ID 就成了﹕

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 的 Host ID 只剩下 13 個 bit 了﹐也就是說﹕在每個子網路裡面﹐最多只能有 2 13 = 8,192 - 2 = 8,190 台主機﹐而它們可分配的號碼分別由
00000.00000001 到
11111.11111110 之間。

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

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

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

明白了﹖還是請您自己再動手算算在 110 這個 Sub-net ID 之下的主機號碼範圍是多少﹖還有這個子網的 Net_ID 和廣播位址分別是什麼﹖

如果您得出來的主機 IP 不是 139.175.192.1 到 139.175.223.254 之間﹐那麼您需要重新溫習前面所學﹐確定每一個概念都清楚了才繼續。否則您只會更混亂(記住:我已經在這裡警告過您了)。

Okay﹐這裡讓我們歸納一下以上所學吧﹕

  • IP 等級以開頭的二進位數字來定﹕0﹐10﹐110 分別是 A、B、C 等級﹔
  • IP 分兩部份﹕Net ID 和 Host ID。預設情形下﹐A 以第一個 otect 來做 Net ID、B 則使用前面兩個otect、C 使用三個 oect﹐而剩下的則做 Host ID;
  • 在為機器指定 Host ID 的時候﹕換成二進位不可以全部為 0 ﹐也不可以全部為 1 ﹐而整個 IP 位址必須是唯一的﹔
  • Net Mask 是給電腦用來計算 Net ID 和 Host ID 的﹐將 IP 和 mask 用 AND 運算得出 Net ID﹐將 mask先經過 NOT 運算﹐再和 IP 做 AND 運算則可以得出 Host ID﹔
  • Sub-net Mask 是“借”Host ID 來當 Sub-net ID 使用﹐規則是從左往右遞增﹐作用是將一個較大的網路切割成多個較小的網路。而在顯示 IP 的時候﹐必須要和 Sub-net ID 加在一起來表示﹔

不分等級的IP

思考一下﹕如果我的 IP 是 139.175.152.254﹐而 Net Mask 則為 255.255.255.0。您認為是否用錯了 net mask呢﹖而 203.56.6.18 使用 255.255.0.0 做 mask 又如何呢﹖

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

然而﹐因為 3 個 C Class 網路它們的 Net ID 都各自獨立的﹐如果您要其下的電腦都能溝通的話﹐就要 router 的參與了(關於 routing 我們稍後討論)。但是 router 一點都不便宜哦﹗就算您老闆不在乎﹐要設定和維護好幾個網路的 routing 也不是一件輕鬆的事情。

好消息是﹕您可以將這三個 C Class 網路整合在一起來使用啦﹗使用的是 CIDR (Classless Inter-Domain Routing)技術﹐也就是所謂的 不分等級 IP 了。使用 CIDR 的時候﹐您大可不必理會 IP 的開首字元﹐你可以隨便設定您的 Net Mask 長度。也就是說﹐一個原本屬於 C Class 的網路也可以使用 255.255.0.0 這樣的 mask ﹐我們稱這樣的網路為“Supernet”﹐跟 subnet 正好相反就是了。

事實上,早期的 IP 開發並沒預期到 IP 消耗量的爆炸性成長,結果 Class 的設計在後來大大的箝制了 IP 網路的擃充與靈活性。例如上例中一個橫跨好幾個 C Class 的站點,因為不能取得 B Class 而造成網路數目的急劇成長,同時也導致路由維護的負擔與成本。因此在 1993 年 IEEE Network 的提案增加了 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 數目長度表示 Net Mask。這樣我們就可以將前面兩個 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 的時候﹐我們必須先註冊好 Net ID﹐如果該 ID 已經被使用了﹐您就必須選用另外的 ID 了。負責 Internet IP 註冊的機構叫做 InterNIC (Network Information Center)﹐他們的網路位址是 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( Private IP )。當我們架設 IP 網路的時候,私有 IP 給與我們很大的方便。比方說﹕您目前的公司還沒有連上Internet﹐且也沒有或得公共 IP 的註冊。倘若使用公共 IP 的話﹐等到以後真正要連上網路的時候﹐就很可能和別人衝突了。其壞處是:由於您的 IP 不是合法授權使用的,別人跟本連不進來,而且,與您衝突的 IP 您卻永遠沒法連上去(若對方是您的最大客戶可就慘了)。若是那時候再重新規劃 IP 的話﹐將是件非常頭痛的問題!

解決的辦法是:我們可以先利用私有位址來架設網路﹐等到真要連上 intetnet 的時候﹐我們可以使用代理伺服器( proxy )或 IP 轉換( NAT --- Network Addresss Translation) 等技術﹐配合新註冊的 IP 就可以了。

由於私有位址在 Internet 上是不能路由的﹐用來架設企業內部網路﹐在安全上面也是有所幫助的。當然了﹐如果在課堂上或在家裡架設 IP 網路﹐使用私有位址也是個不錯的主意哦。

說到這裡,不得不提醒一下大家:在平時的技術討論中,許多人愛用 "真實 IP"、"合法 IP"、或 "實體 IP" 來稱呼 Public IP ﹔以 "假 IP"、"非法 IP"、或 "虛擬 IP" 來稱呼 Private IP 。但我認為都不太貼切,雖然在初學階段還不算甚麼,但隨著深入的研究,以後在討論 nat, vpn, vip, ipvs 等進階技術的時侯, 卻很可能因為名詞的誤解而浪費大量的時間在彎路上打轉。為此,我建議您儘量使用 "公共 IP" 與 "私有 IP" 來稱呼 Public IP 與 Private IP ,若您有興趣了解詳細原因,不妨花點時間看看 <<請問什麼是虛擬ip?>> 這篇溫章。

參考資料﹕

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

 

習題﹕

  1. 請簡述網際網路層的主要功能。
  2. 請描述 IP 封包的格式﹐以及各部件的功能。
  3. 請講述如何判斷一個 IP 位址的 Class 屬性﹐以及如何判別各 Class 的 Net_ID 和 Host_ID。請用生活實例來模擬 Net_ID 和 Host_ID 的作用。
  4. 請運用 IP 位址實例來講述 Net Mask 的作用﹐然後以課堂的實際需求以分組原則來切割教學子網。
  5. 請問什麼是 CIDR﹖請用實例來探討 CIDR 的作用。
  6. 請講述私有 IP 的作用﹐以及它們的範圍。

 

 


www.study-area.org © 2002 Netman 網中人
Last Updated: March 31, 2003