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 的語法也都大同小異,我們不再另述。

 

<GOTOP>