TCP/IP 協定與 Internet 網路:第十六章 SNMP 網路管理協定 上一頁 下一頁
16-11 ANS-1 編碼規則
ASN-1 的編碼規則也是採用一般『基本編碼原則』(Basic Encoding Rule, BER)方式。其主要功能是定義 ASN-1 資料型態的值如何轉換為位元序列的排列方法,以作為傳輸使用,接收端也能依照此方法正確解碼。編碼規則是遞迴式,所以結構式物件(複合資料型態)的編碼為其擁有之基本物件(基本資料型態)編碼的連結。依照此種方法,所有物件編碼都可以歸類為基本物件編碼的串列。
BER 定義之中,不論基本物件或結構物件的值都是由四個欄位組成:(1) 識別碼,(2) 資料欄位的位元組(Byte)長度,(3) 資料欄位,(4) 結束欄位(若資料長度未知)。結束欄位是針對內容並未定義完全的複合資料型態,如果資料長度都已知道,就不需要該欄位了(如 SNMP 使用)。以下我們分別說明各個欄位的功能,如圖 16-11。
圖 16-11 ASN-1 編碼格式
16-11-1 識別碼欄位
如圖 16-12 所示,識別碼欄位中又區分為三個子欄位:(1) 標籤、(2) 資料型態、 (3) 數字。標籤顯示該編碼資料的類型(通用、應用、指定文字或專用類型)以兩個位元來區分。資料型態子欄位如為 1 表示資料為基本型態;0 為複合資料型態。數字子欄位表示該資料是屬於資料類別中的哪一種資料型態。
圖 16-12 ASN-1 BER 之識別碼
我們以通用類別(UNIVERSAL,00)來說明編碼的情況(因為在 SNMP 協定裡只用到通用類別),在通用類別之中有不同的資料型態(整數、字串等等)。表 16-22 為各種資料型態在數字子欄位的值。代碼中 11 ~ 15 及28 ~ 31保留。
表 16-22 通用類型的資料型態
代碼(數字) |
資料型態 |
1 |
BOOLEAN |
2 |
INTEGER |
3 |
BIT STRING |
4 |
OCTET STRING |
5 |
NULL |
6 |
OBJECT IDENTIFIER |
7 |
OBJECT DESCRIPTOR |
8 |
EXTERNAL |
9 |
REAL |
10 |
ENUMERATED |
16 |
SEQUENCE and SEQUENCE OF |
17 |
SET and SET OF |
18 |
NumericString |
19 |
PrintableString |
20 |
TeletexString |
21 |
VideotexString |
22 |
IA5String |
23 |
GeneralizedTime |
24 |
UTCTime |
25 |
GraphicString |
26 |
VisibleString |
27 |
GeneralString |
16-11-2 長度欄位
長度欄位是標示於緊跟後面資料內容的長度,有下列三種情況:
(1) 資料內容長度小於 128 Byte,只要一個位元組的長度欄位就足以表示。
(2) 資料長度大於或等於 128 Byte,長度欄位(1 Byte)不足於表示,必須以多位元組表示時。第一個位元組紀錄該長度總共需要幾個位元組(下圖中的 K),自第二位元組起,將長度之數值自高位元到低位元依序放置。
(3) 資料內容不定長度。資料內容不定長度時,我們就無法用長度欄位來描述內容的長度,而將長度欄位全部設定為 1,且在資料欄位的後面加入兩個結束記號,結束記號是用一個位元組,各位元全部設定為 0。
16-11-3 資料欄位
資料欄位編碼依照各個資料型態而定,以下說明幾種資料型態的編碼方式:
(A) 整數(INTEGER)
整數編碼以該整數之 2 的補數來編碼,小於 128 的正整數需要一個位元組長度,小於 32768 需 2 個位元組,以此類推。正負號位元組先傳送,自高位元至低位元,每八個位元為一組,依序置放。如:Integer 49 編碼結果如下:(標籤 = 00 表示通用類型)、(資料型態 = 0 表示基本型態)、(數字 = 2 表示整數)。(長度 = 1 表示資料 1 位元組)、(資料 = 49)
(B) 位元串列(BIT STRING)
位元串列的資料編碼和原來資料相同,但最主要問題在於長度的表示方式。長度欄位表示後面資料位元組的長度,而非位元的長度。但當位元資料依序放置在資料欄位中,資料欄位後面會剩下一些位元欄位空白,因此在長度後面必須緊接著一個位元組,主要用來說明最後資料位元組剩下幾個位元欄位未填放。如 Bit String ‘01001111’ 9 個位元串列,它的資料編碼為 07、4F、80(16 進位),其結果如下:
(C) 位元組字串(OCTET STRING)
位元組串列比較容易,串列字元以標準的方式由左至右傳送。如:Octet String “xy” 之編碼如下:(x, y 以 ASCII 碼表示)
(D) 物件識別碼(OBJECT IDENTIFIER)
物件識別碼編碼都是以整數串列表示。我們以簡單網路管理協定(SNMP)為例來說明其物件編碼情況,例如,internet 物件的識別碼是{1,3,6,1}(如圖 6-11 物件識別樹)。在 SNMP 的物件描述識別之中,第一個數字永遠是 0、1、或 2;第二個數字要小於 40(根據 SNMP 規格,將無法辨識第 41 類)。因此,我們可以將前面兩個數字組合成一個數字編碼,只佔一個位元組的編碼資料,第一個數字稱為 a,而第二個數字稱為 b,其編碼值為(40*a + b),依照組合編碼 internet 的第一個資料編碼為 43(40*1 + 3),其餘第三個數字以後,每一個數字填入一個資料欄位內。依照慣例,物件識別碼超過 127 的數字,會編碼成多個位元組,第一個位元組的高位元設定為 1,位元組總數存在另 7 個位元。Internet 物件編碼結果如下:
(E) 序列(SEQUENCE)
序列是屬於複合資料型態,它的編碼實際上就是將它所包含的基本型態,依序編碼組合而成。我們以地址結構來說明編碼的情況,其內部的子變數資料型態都假設已宣告:
SEQUENCE { Name “Tain-shou Nien”,
Street “Hwang Po 1st ”,
Number 1,
City “Feng-Shan”,
Zip 809
}
編碼方式如下:(編碼數字以十六進位表示)
1. SEQUENCE 的識別碼為 30,長度 30 是以下五筆變數資料的總長。(30,30)
2. Name 是 PrintableString 型態,識別碼 13,字串長度為 0E。(字元以 ASCII 碼表示)
3. Street 是 PrintableString 型態,識別碼 13,字串長度為 0C。
4. Number 是 INTEGER 型態,識別碼 02,內容長度為 1。
5. City 是 PrintableString 型態,識別碼 13,字串長度為 09。
6. Zip 是 INTEGER 型態,識別碼 02,內容長度為 2。
編碼結果:(編碼數字以十六進位表示)
(1) 30 30
(2) 13 0E 54 61 69 6E 2D 73 68 6F 75 20 4E 69 65 6E
(3) 13 0C 48 77 61 6E 67 20 50 6F 20 31 73 74
(4) 02 01 01
(5) 13 09 46 65 6E 67 2D 53 68 61 6E
(6) 02 02 03 29