TCP/IP 協定與 Internet 網路:第十六章 SNMP 網路管理協定 上一頁 下一頁
16-10 ASN-1資料型態
SNMP 主要的訴求是希望在異質電腦環境下,建構一個共通的管理協定,但不同電腦之間對於資料格式的表示可能不會完全相同,會導致資料的認定發生錯誤。因此,在 SNMP 協定上 Manager 和 Agent 之間所傳遞的訊息,不論是物件識別值(Object Identifier)或數值(Value)都使用 ASN-1 編碼,以解決不同電腦之間資料格式宣告不同的問題,本節將針對 ASN-1 的原理與編碼技術加以介紹。
當兩端使用者之間傳遞訊息,如果只使用到檔案資料傳送時,無論傳送中的訊息是文字檔案(text file)、二進位檔案(binary file)或其他多媒體檔案。接收端只將收到的訊息重新再表現出來,並未將訊息內的每一資料拿出來處理。這種運作方式,兩端使用者只要協議使用何種格式傳送即可,不需要表現層特殊的處理(請參考圖 16-2)。
但對於較高階的網路應用上,也許並非如此單純。譬如,提款機和銀行主機電腦連線,目前各個銀行之間都有跨行連線,客戶在任何一家銀行的提款機都可以領到錢。例如客戶在郵局提款機前提領華南銀行內的存款,由提款機送出(華南、帳戶A、-10000),表示要由帳戶A 上扣除 10000 元。其運作方式是由提款機呼叫銀行主機電腦內提款處理程式,提款處理程式會驗證帳戶A內存款是否超過 10000 元,並扣除該款項。這表示由提款機送一個處理程式的參數(parameter)給主機電腦。倘若提款機和主機的電腦不同品牌,作業系統也不相同,由於提款機所傳送的參數資料格式表示不相同,雙方可能產生嚴重的誤解。譬如,有可能提款機要求扣除 10000 元,因資料格式表示不同,主機電腦只扣除 100 元,但他回應確認訊號給提款機,提款機竟給客戶 10000 元。在兩端傳遞各種訊息當中,沒有發生任何錯誤,但由於雙方資料格式不同,而產生嚴重的錯誤,並且這種錯誤又不容易被發現。
在電腦資料處理中,我們將一些變數宣告成某一資料格式,例如整數、實數、字元、字串等等。任何一種資料格式的變數都有預留適當記憶體空間讓它存放資料,例如一般整數(Integer)預留 2 Byte 的空間,我們稱之為『抽象資料格式』(Abstract Data Type)。當我們在程序呼叫(Procedure Call)時,會傳遞某些參數(Parameter)給程序(Procedure)執行,或由被呼叫程序傳回參數時,都是以某一種資料型態的變數來作為參數的傳遞或回應。如果僅就本地程序呼叫,因為變數的宣告格式相同,大致上不會發生什麼問題。但如果跨越遠端電腦,執行『遠端程序呼叫』(Remote Procedure Call)時,雙方電腦上對於抽象資料宣告的格式就不一定會相同。如圖 16-8 所示,被呼叫程序可能在不同類型的電腦(或作業系統)上執行程式,由於各類電腦對抽象資料格式的宣告可能不同,因此程序呼叫所攜帶的參數認定也不會相同,因此會產生上述資料格式的誤解。
為了克服抽象資料格式在各個電腦上宣告不同而產生的錯誤,我們必須定義一種標準的資料格式。讓電腦在呼叫遠端程式時,所傳送的參數(Parameter)都用該標準格式來宣告,才不會發生資料判別的誤解。早期 ISO 制定一個標準格式,稱之為『抽象語意表示法』(Abstract Syntax Notation - One, ASN-1),期望各個電腦之間傳送資料都用 ASN-1 格式宣告。如圖 16-9 所示,遠端程序呼叫所傳的參數用 ASN-1 宣告,遠端電腦上的對應程式也使用 ASN-1 宣告,才不會發生資料格式的誤解。
圖 16-8 遠端程序呼叫之參數資料格式
圖 16-9 遠端程序呼叫使用 ASN-1 資料格式
我們瞭解 ASN-1 是針對『資料格式』(Data Type)宣告的標準化,並非檔案格式(File Type)。ASN-1 是應用在電腦之間資料存取的標準化,傳送端的資料經過編碼器轉換成標準之 ASN-1 格式再發送;對方接收到後,再將其解碼還原成原始資料,如圖 16-10 所示。在 ISO 8824 中,定義 ASN-1 的語法,ISO 8825 則說明編碼規則。
圖 16-10 ASN-1 資料編碼與解碼
如欲將傳送中的資料以 ASN-1 格式編碼,我們必須考慮下列兩點:(1) 定義一套語言來描述各種資料型態;(2) 另定義一套編碼規則,將資料型態轉換為數字碼,以作為傳送。ASN-1 將資料型態歸類為通用(universal)、應用(application)、指定文字(context-specific)、以及專用(private)等四類。對於每一種類型又可區分為基礎型態(primitive type)和結構型態(construct type)。其中通用(universal)型態是由 ASN-1 標準所定義,應用(application)型態是由其他標準所定義的,專用(private)型態是由各企業組織所指定,指定文字(context-specific)型態係自由指定。在這裡我們只針對通用型態介紹,因為其它型態目前甚少使用。
16-10-1 ASN-1 基本資料型態
如同一般程式語言一樣,ASN-1 的資料型態也可區分為基本型態(Primitive type)和複合資料型態(Construct type)兩大類。基本資料型態如表 16-20 所示,其中包含:整數、浮點數、字串等等,以下分別介紹各種基本資料型態的宣告方式:
表 16-20 ASN-1 基本資料型態
基本型態 |
意義 |
INTEGER |
隨意長度的整數。 |
BOOLEAN |
True (1) 或 False (1)。 |
BIT STRING |
零或多個位元組成的串列。 |
OCTET STRING |
零或多個無號位元組組成的串列。 |
NULL |
位置保留元。 |
OBJECT IDENTIFIER |
定義物件名字的型態。 |
(A) BOOLEAN 語法
用來描述真值表之中的真(True)或非真值(False)。
BooleanType ::= BOOLEAN
BooleanValue ::= TRUE | FALSE
(B) 整數(INTEGER)語法
用來描述整數值,其產生規則(production rules)如下:
IntegerType ::= INTEGER | INTEGER{NamedNumberList}
NamedNumberList ::= NamedNumber | NamedNumberList, NamedNumber
NamedNumber ::= identifier(SignedNumber) | identifier(DefinedValue)
SignedNumber ::= number | -number
IntegerValue ::= SignedNumber | identifier
例如:下列合乎ASN-1 的語法定義:
Version ::= INTEGER{windows(1), unix(2)}
MyVersion ::= unix
我們在定義 Version 的整數資料型態時,包含 windows 和 unis,其相對值為 1 和 2。而將 MyVersion 的起始值設定為 unix,其相對值即是 2。
(C) 字串(OCTET STRING)語法
用來描述任意長度的字串,可描述二進位或十六進位字串。產生規則如下:
OctetStringType ::= OCTET STRING
OctetStringValue ::= binary-string | hexadecimal-string
(D) 空值(NULL)語法
用來描述保留位置。產生規則如下:
NullType ::= NULL
NullValue ::= NULL
(E) 位元字串(BIT STRING)
用來描述二進位元字串。產生規則如下:
BitStringType ::= BIT STRING
BitStringValue ::= {0 | 1}
(F) 物件識別碼(OBJECT IDENTIFIER)語法
一般我們描述某一個物件,是描述該物件位於『物件描述樹』(Object Identified Tree)的節點位置。物件描述樹是整個環境(或系統)裡所有物件的組織結構,物件識別碼是標示出該物件在物件描述樹的相關位置。由這個相關位置,我們也可以了解這個物件和其他物件的關聯關係。如圖 16-5 為簡單網路管理協定(Simple Network Management Protocol, SNMP)的協定標準架構。在 internet (1) 以下,又可分為 directory (1)、mgmt (2)、experimental (3)、private (4)、security (5) 及 snmpv2 (6)。
我們用 ASN-1 描述 tcp 物件可以有下列三種方式表示:
(1) tcp OBJECT IDENTIFIER ::= {.1.3.6.1.2.1.5}
(2) tcp OBJECT IDENTIFIER ::= {.iso.org.dod.internet.mgmt.mib-2.tcp}
(3) tcp OBJECT IDENTIFIER ::= {iso(1).org(3).dod(6).internet(1).mgmt(2). mib-2(1).tcp(5)}
16-10-2 ASN-1 複合資料型態
在 ANS-1 上所定義的複合資料型態(construct type)其實和 C 的結構(structure)、Pascal 的記錄(record)非常類似。基本資料型態可組合產生不同的複合資料型態,如表 16-21 所示,ASN-1 有五種型態。
表 16-21 ASN-1 複合資料型態
複合資料型態 |
意義 |
SEQUENCE |
有序(order)串列型態,含不同基本資料型態。 |
SEQUENCE OF |
有序串列型態,單一基本資料型態(如 array)。 |
SET |
無序串列型態,含不同基本資料型態。 |
SET OF |
無序串列型態,單一基本資料型態。 |
CHOICE |
由型態串列中產生聯集的型態。 |
我們以序列(SEQUENCE)的語法宣告作為例子說明,它的宣告方式和程式語言中的 structure 很類似,譬如,假設只有四個欄位,可以定義如下:
Address ::= SEQUENCE
{
street PrintableString,
number Integer,
city PrintableString,
zip Integer
}
當然,在複合型態中的元素也是 ASN-1 的基本型態或複合型態。如上例之中,PrintableString 及 Integer 都必須按照基本型態宣告。其他 SEQUENCE OF 和 SET 的語法也都大同小異,我們不再另述。