เนื้อหาวันที่ : 2011-08-11 18:01:29 จำนวนผู้เข้าชมแล้ว : 8057 views

มารู้จักโปรโตคอล SNMP (ตอนจบ)

เป้าหมายหลักของการใช้เมสเซจ SNMP คือการต้องการควบคุม หรือ ต้องการดูค่าดึงค่า จากตัวเอเยนต์

การสื่อสารข้อมูลในงานอุตสาหกรรม
ตอนที่ 12 มารู้จักโปรโตคอล SNMP (ตอนจบ)

พิชิต จินตโกศลวิทย์ 
 pichitor@yahoo

ตัวอย่างการสร้างเมสเซจ SNMP
          จากที่กล่าวมาแล้ว SNMP คือโปรโตคอลที่อนุญาตให้ SNMP Manager หรือ NMS (ซึ่งเป็นตัวควบคุมจัดการ) สามารถควบคุมตัว SNMP เอเยนต์ (ตัวถูกจัดการ) โดยวิธีการส่งแลกเปลี่ยนเมสเซจ และเมสเซจ SNMP จะถูกส่งบนโปรโตคอลระดับทรานสปอร์ตนั้นคือโปรโตคอล UDP/IP โดยใช้พอร์ตหมายเลข 161 เป็นพอร์ตหลัก ดังนั้นถ้าต้องการศึกษาว่าส่งเมสเซจ บน UDP/IP ทำอย่างไร นั้นสามารถหาตัวอย่างการเขียนโปรแกรมได้ทั่วไป เนื่องจาก UDP/IP ฟังก์ชันนั้นถูกสร้างและสนับสนุนติดมากับตัวคอมไพเลอร์อยู่แล้ว

          เป้าหมายหลักของการใช้เมสเซจ SNMP คือการต้องการควบคุม (คำสั่ง Set) หรือ ต้องการดูค่าดึงค่า (คำสั่ง Get) จากตัวเอเยนต์นั้นเอง ภายในซอฟต์แวร์ที่สนับสนุน SNMP จะมีค่าพารามิเตอร์ที่เป็นตัวแทน (Instance) ของออบเจ็กต์ ยกตัวอย่างสำหรับอุปกรณ์เครื่องเสียงยี่ห้อ RANE ที่สนับสนุน SNMP จะมีอินสแตนซ์ของออบเจ็กต์ที่ใช้ควบคุมไมโครโฟนคือ ออบเจ็กต์ Microphone Mute ซึ่งจะใช้หนึ่งอินสแตนซ์ต่อหนึ่งช่องอินพุตของไมโครโฟน

โดยทั่วไปตัว SMNP Manager สามารถตั้งค่าหรือดึงค่าจากแต่ละอินสแตนซ์หรืออุปกรณ์ในที่นี่คือแต่ละตัวไมโครโฟนนั้นเอง ในตัวเอเยนต์ค่าพารามิเตอร์จะถูกจัดเรียงตามโครงสร้างต้นไม้ SNMP และจะใช้หมายเลข OID (Object Identifier) เพื่อเจาะจงไปยังพารามิเตอร์ที่ต้องการไม่ว่าจะเพื่อตั้งค่า หรือตรวจสอบข้อมูล ตัวหมายเลข OID จากที่กล่าวมาแล้วก็คือชุดของตัวเลขที่คั่นด้วยเครื่องหมายจุดเพื่อแยกแยะหาตำแหน่ง

สำหรับในตัวอย่างนี้ OID ที่อ้างอิงที่อยู่ของพารามิเตอร์ในการควบคุมปิดเปิดเสียงของไมโครโฟนหรือ Microphone Mute คือ NM1 โดยมีหมายเลข OID ดังต่อไปนี้ 1.3.6.1.4.1.2680.1.2.7.3.2.0 อันที่จริงแล้วหมายเลข OID จะประกอบด้วยสองค่า ค่าที่หนึ่งคือค่า อ้างอิงชนิดออบเจ็กต์นั้นคือ 1.3.6.1.4.1.2680.1.2.7.3.2 และส่วนค่าที่สองคืออ้างอิงถึงอินสแตนซ์ซึ่งมีไว้เจาะจงอินสแตนซ์หรืออินพุตของไมโครโฟนว่าตัวไหน (Microphone Mute) ในตัวอย่างนี้ค่าอินสแตนซ์มีค่าเท่ากับศูนย์ก็เพราะในตัวอย่างนี้ ตัวอุปกรณ์ควบคุมเครื่องเสียง NM1 ตัวนี้มีไมโครโฟนเดียว

รูปที่ 11 การตำแหน่งออบเจ็กต์โดยใช้ MIB Browser

          ในแต่ละตัวเอเยนต์จะมีฐานข้อมูลที่เป็นเสมือนกับสมุดบันทึกตำแหน่งของออบเจ็กต์ทั้งหมดรวมทั้งหมายเลขและชื่ออ้างอิงที่เรียกว่า MIB (Management Information Base) โดยที่ MIB จะจัดเรียงชื่อ, หมายเลข OID, ชนิดข้อมูล, สิทธิการอ่านและเขียนรวมทั้งคำอธิบายสั้น ๆ สำหรับแต่ละออบเจ็กต์ที่อยู่ในตัวเอเยนต์ ตัวอย่าง เช่น MIB ของเครื่องเสียง RANE ตัว NMS จำเป็นต้องทราบข้อมูลเกี่ยวกับออบเจ็กต์จาก MIB รวมทั้งค่าอินสแตนซ์ ซึ่งทำให้ตัว NMS สามารถส่งเมสเซจเพื่อตั้งค่า หรือดึงค่าในตัวเอเยนต์ได้ถูกต้อง อย่างไรก็ตามก็ยังมีสิ่งที่ต้องศึกษาหรือต้องรับรู้อีกนั้นคือพฤติกรรม หรือคุณสมบัติเฉพาะของตัวอุปกรณ์ที่สนับสนุน SNMP นั้น ๆ

          อุปกรณ์ที่สนับสนุน SNMP จะต้องเข้าใจในความหมายของแต่ละแมสเสจถึงจะทำงานได้อย่างถูกต้องซึ่งอันที่จริงก็เป็นปัญหาที่พบบ่อยในการสื่อสารระหว่างตัวอุปกรณ์ถึงแม้จะมีการกำหนดมาตรฐาน ปัญหานี้ที่ยังคงอยู่ก็เพราะมีความแตกต่างของภาษาในการสร้างซอฟต์แวร์ซึ่งอาจมีความแตกต่างในเรื่องประเภทชนิดของข้อมูล (เช่น ขนาดของอินทิเจอร์) ตัวอย่างเช่น ตัว NMS ที่ส่งเมสเซจที่สร้างมาจากภาษา Java อาจจะสื่อสารกับเอเยนต์ที่รับเมสเซจที่สร้างด้วยภาษา C (ปัญหาจะเกิดถ้าโปรแกรมเมอร์ไม่ระมัดระวังหรือไม่มีประสบการณ์เพียงพอ)

และเพื่อแก้ไขปัญหานี้ SNMP จึงกำหนดใช้มาตรฐานการเข้ารหัส ASN.1 (Abstract Syntax Notation One) เพื่อใช้อ้างอิงชนิดข้อมูลมาตรฐานในการสร้างเมสเซจ SNMP เพราะว่า ASN.1 เป็นมาตรฐานอิสระจากภาษาในการโปรแกรมมิ่ง ซึ่งตัวซอฟต์แวร์ ของ NMS หรือ เอเยนต์อาจถูกเขียนด้วยภาษาใดก็ได้ อย่างไรก็ตามถึงจะใช้มาตรฐาน ASN.1 อ้างอิงก็ยังมีปัญหาอื่น ๆ อยู่ เพราะเมื่อข้อมูลถูกส่งบนสายสัญญาณแล้วควรจะถูกเข้ารหัสด้วยมาตรฐานอะไร

ตัวอย่างเช่น ถ้าเป็นข้อความแบบสตริงจะถูกปิดท้ายด้วยอักขระนัล (Null) เหมือนกับการโปรแกรมภาษา C หรือไม่ หรือค่าบูลีนจะมีขนาด 8 บิต เหมือนในภาษา C++ หรือมีขนาด 16 บิตอย่างในภาษาวิชวลเบสิกหรือไม่ เพื่อแก้ไขปัญหาดังกล่าว ไม่ว่าจะใช้ภาษาอะไรในการโปรแกรมมิ่ง ข้อมูลจะแปลงขนาดข้อมูลและถูกเข้ารหัสด้วยวิธีการเดียวกันก่อนที่ส่งลงไปในสื่อสัญญาณด้วยมาตรฐาน BER สรุปแล้วทุกข้อมูลในฟิลด์ของเมสเซจต้องเป็นไปตามมาตรฐาน ASN.1 ในเรื่องชนิดของข้อมูลและต้องถูกเข้ารหัสตามมาตรฐาน BER ก่อนที่จะส่งข้อมูลออกไปยังระบบสื่อสาร

*  ASN.1 
          การที่จะสร้างเมสเซจ SNMP ต้องมีความรู้ในเรื่องชนิดข้อมูลและขนาดข้อมูลที่ระบุในมาตรฐาน ASN.1 ซึ่งได้จัดเป็นสองกลุ่มคือ ไพรมิทีฟ (Primitive) และคอมเพล็กซ์ (Complex) สำหรับชนิดข้อมูลพื้นฐานหรือไพรมิทีฟของมาตรฐาน ASN.1 ได้แก่ อินทิเจอร์ (Integer), ออกเทต (Octet) หรือ ไบต์ หรือ อักขระ (Character), สตริง (String), นัล (Null), บูลีน (Boolean) รวมทั้ง ออบเจ็กต์ไอเดนติฟายเออร์ (Object Identifier) หรือ OID ซึ่งชนิดข้อมูล OID เป็นสิ่งที่สำคัญมากสำหรับเมสเซจ SNMP ก็เพราะว่าชนิดข้อมูล OID จะบรรจุค่าที่ใช้อ้างอิงถึงพารามิเตอร์ในตัวเอเยนต์ อย่างไรก็ตามเพื่อเพิ่มความสามารถให้กับโปรแกรมเมอร์ในการจัดการข้อมูลมาตรฐาน ดังนั้น ASN.1 ยังอนุญาตให้จัดกลุ่มข้อมูลจากหลายชนิดข้อมูลประเภทไพรมิทีฟให้เป็นชนิดข้อมูลใหม่นั้นคือชนิดข้อมูลประเภทคอมเพล็กซ์

รูปที่ 12 ชนิดข้อมูลไพรมิทีฟ

          มาตรฐาน ASN.1 ยังกำหนดชนิดข้อมูลประเภทคอมเพล็กซ์ที่จำเป็นในการสร้างเมสเซจ SNMP นั้นคือชนิดข้อมูลซีเควนซ์ (Sequence) ซึ่งซีเควนซ์มองง่าย ๆ เสมือนเป็นรายการฟิลด์ข้อมูล (List of Data Fields) แต่ละฟิลด์ในซีเควนซ์สามารถประกอบด้วยหลาย ๆ ชนิดข้อมูลที่แตกต่างกัน อีกชนิดข้อมูลประเภทคอมเพล็กซ์ที่ มาตรฐาน ASN.1 กำหนดคือชนิดข้อมูล PDU (Protocol Data Unit) ซึ่งเป็นชนิดข้อมูลประเภทคอมเพล็กซ์ที่ใช้เฉพาะกับโปรโตคอล SNMP ฟิลด์ของ PDU จะใช้บรรจุค่าข้อมูลของเมสเซจ SNMP โดยคำสั่งที่ใช้ชนิดข้อมูล PDU ที่ใช้เป็นหลักคือ คำสั่ง Get Request และ Set Request ที่ใช้สำหรับการดึงค่าและตั้งค่าพารามิเตอร์ตามลำดับ

สรุปได้เลยว่าเมสเซจของ SNMP จะถูกสร้างจากฟิลด์ที่เป็นชนิดข้อมูลตามมาตรฐาน ASN.1 ทั้งหมด อย่างไรก็ตามก็ยังไม่รับประกันว่าชนิดข้อมูลนั้นถูกต้องตามที่ต้องการทั้งฝั่งส่งและฝั่งรับ ก็เพราะว่าเมสเซจของ SNMP เป็นซีเควนซ์ของฟิลด์ที่ประกอบด้วยชนิดข้อมูลที่แตกต่างกันไป แล้วฝั่งผู้รับจะรับทราบได้อย่างไร จุดเริ่มและจุดจบของแต่ละฟิลด์อยู่ตรงไหน หรือแม้กระทั่งชนิดข้อมูลของแต่ละฟิลด์เป็นอย่างไร การแก้ปัญหาเหล่านี้จึงใช้มาตรฐาน BER เป็นตัวแก้ไขปัญหา

รูปที่ 13 ชนิดข้อมูลคอมเพล็กซ์

* BER (Basic Encoding Rules)
          การสร้างเมสเซจ SNMP ต้องปฏิบัติตามกฎของมาตรฐาน BER เมื่อต้องการวางแต่ละไบต์ข้อมูลลงบนเมสเซจ SNMP กฎพื้นฐานคือ แต่ละฟิลด์จะถูกเข้ารหัสโดยแบ่งเป็นสามส่วนคือ ชนิด (Type), ความยาว (Length) และ ข้อมูล (Data)

          ชนิด (Type) จะระบุชนิดของข้อมูลของฟิลด์โดยมีขนาด 1 ไบต์ สำหรับตัวอย่างให้ดูที่ตารางด้านล่าง ที่จะบอกถึงชนิดข้อมูลและรหัสไอเดนติฟายเออร์ (Identifier) เพื่อใช้อ้างอิง

          ความยาว (Length) จะใช้ระบุความยาวของส่วนดาต้า ในหน่วยไบต์ และสุดท้ายคือ ดาต้าคือ ค่าหรือข้อมูลจริงที่ต้องการสื่อสาร (เช่น ตัวเลข, สตริงข้อความ, OID เป็นต้น)

ตาราง แสดงชนิดข้อมูลและไอเดนติฟายเออร์

          สำหรับบางชนิดข้อมูลจะมีลักษณะเหมือนซีเควนซ์ หรือ PDU ซึ่งจะถูกสร้างจากฟิลด์เล็ก ๆ หลาย ๆ ฟิลด์ ดังนั้นจึงเป็น ชนิดข้อมูลแบบคอมเพล็กซ์ โดยจะถูกเข้ารหัสเสมือนมีฟิลด์ซ้อนภายในฟิลด์ดังแสดงในรูปที่ 13
 ยังมีอีกสองกฎพื้นฐานที่จำเป็นต้องทราบในการเข้ารหัสเมสเซจของ SNMP กฎทั้งคู่ถูกใช้ในการเข้ารหัส OID กฎแรกจะถูกใช้เพื่อการเข้ารหัส สองหมายเลขแรกของ OID ตามมาตรฐาน BER สองหมายเลขเลขของ OID (x.y) จะถูกเข้ารหัสรวมให้เป็นค่าเดียวตามสูตร (40*x) + y โดยสองหมายเลขแรกของ OID โดยทั่วไปเริ่มที่ 1.3 เสมอ

ดังนั้น สองหมายเลขแรกของ OID จะถูกเข้ารหัสเป็น 43 หรือ 0x2B เสมอจาก (40*1) + 3 = 43 หลังจากที่สองหมายเลขแรกได้ถูกเข้ารหัส หมายเลขต่อไป ๆ ของ OID จะถูกเข้ารหัสในหน่วยไบต์ อย่างไรก็ตามยังมีกฎพิเศษที่ใช้กับค่าประเภทตัวเลขที่มีค่ามากกว่าหนึ่งไบต์ เนื่องจากหนึ่งไบต์ (8 บิต) สามารถใช้แทนตัวเลขที่ค่าระหว่าง 0-255 เท่านั้น

สำหรับตัวอย่างถ้าตัวเลขมีค่าเท่ากับ 2680 ใน Microphone Mute OID 1.3.6.1.4.1.2680.1.2.7.3.2.0 ไม่สามารถเข้ารหัสโดยใช้แค่เพียงหนึ่งไบต์ ตามกฎสำหรับเลขที่มีค่ามากคือ 1 ไบต์จะใช้เพียง 7 บิตสำหรับบรรจุค่าตัวเลข (0-127) และบิตลำดับสูงสุด หรือ MSB จะถูกใช้เป็นแฟลก (Flag) เพื่อให้ผู้รับรู้ว่าตัวเลขที่รับดังกล่าวนี้ถูกขยายขนาดมากกว่าหนึ่งไบต์ ดังนั้นค่าตัวเลขใด ๆ ที่มีค่ามากกว่า 127 จะต้องถูกเข้ารหัสโดยใช้จำนวนไบต์มากกว่าหนึ่ง จากกฎดังกล่าว ค่า 2680 ต้องถูกเข้ารหัสโดยใช้ 2 ไบต์คือ 0 x 94 และ 0 x 78 เนื่องจากบิต MSB ของไบต์แรก (0 x 94) มีค่าเท่ากับหนึ่ง ฝั่งรับจะรู้และถอดค่าจาก 7 บิตที่เหลือของแต่ละไบต์ (0 x 14, 0 x 78) และถอดรหัสตามเลขฐานสิบหกจนได้ค่า (0 x 14*128) + 0 x 78 = 2,680

* ฟอร์แมตเมสเซจของ SNMP 
          ฟอร์แมตของเมสเซจ SNMP จะระบุว่าฟิลด์ใน SNMP อยู่ตำแหน่งใด และเรียงลำดับอย่างไร ยิ่งกว่านั้นเมสเซจอาจจะมีหลายชั้นหลายเลเยอร์ของฟิลด์ที่ซ้อนกัน ณ ที่ชั้นนอกสุดเมสเซจของ SNMP เป็นฟิลด์เดี่ยวประเภทซีเควนซ์ ภาพรวมของเมสเซจทั้งหมดจะเป็นแถวของฟิลด์ 3 ฟิลด์นั้นคือ ฟิลด์เวอร์ชันของ SNMP (อินทิเจอร์), ฟิลด์คอมมิวนิตี้สตริง (ออกเทตสตริง) และ PDU (Get Request, Set Request)

รูปที่ 14 ฟอร์แมตพื้นฐานของ SNMP

          ฟิลด์เวอร์ชันและฟิลด์คอมมิวนิตี้สตริงจะเป็นชนิดข้อมูลแบบไพรมิทีฟที่ไม่ได้สร้างจากฟิลด์เล็ก ๆ หลายฟิลด์ หรือมีหลายชั้น แต่สำหรับฟิลด์ PDU จะเป็นชนิดข้อมูลแบบคอมเพล็กซ์ที่ประกอบด้วยหลายฟิลด์ขนาดเล็ก (หลายเลเยอร์) ภายใน PDU จะประกอบด้วยฟิลด์รีเควสไอดี (Request ID: อินทิเจอร์), ฟิลด์เออร์เรอร์ (Error: อินทิเจอร์), ฟิลด์เออร์เรอร์อินเดกซ์ (Error Index: อินทิเจอร์) และฟิลด์วาร์ไบด์ลิสต์ (Varbind List)

          วาร์ไบด์จะประกอบด้วยสองฟิลด์ที่ต่อกันป็นคู่ ๆ กันไป ฟิลด์แรกคือ OID ที่ระบุที่อยู่ของพารามิเตอร์ที่ต้องการ ฟิลด์ที่สองคือฟิลด์แวลู (Value) คือค่าของพารามิเตอร์ที่ต้องการ สำหรับคำสั่ง Set Request ค่าที่ตั้งค่าหรือเซตต้องเป็นชนิดข้อมูลเดียวกันกับชนิดข้อมูลที่ระบุใน MIB ของอุปกรณ์นั้น ๆ สำหรับคำสั่ง Get Request ฟิลด์แวลูจะมีค่าเท่ากับนัล (Null) ด้วยค่าความยาวเท่ากับ 0 x 00 ค่านัลนี้ก็เป็นตัวบ่งบอกตัวเอเยนต์ให้ส่งค่ากลับด้วย Get Request PDU สำหรับวาร์ไบด์ลิสต์ คือแถวลำดับของวาร์ไบด์ ในกรณีเมสเซจตั้งค่าหรือดึงค่าเพียงหนึ่งพารามิเตอร์วาร์ไบด์ลิสต์จะมีแค่หนึ่งวาร์ไบด์

รูปที่ 15 ฟิลด์ในเมสเซจ SNMP

* ค่าไบต์จริงในเมสเซจ
          สำหรับการสร้างเมสเซจโดยใช้มาตรฐาน BER ต้องกำหนดการลงฟิลด์และลำดับไบต์ในเมสเซจให้ถูกตามมาตรฐาน ดังตัวอย่างในรูปที่ 16 ได้แสดงแพ็กเกจคำสั่ง Get Request สำหรับดึงค่าพารามิเตอร์ Microphone Mute บนอุปกรณ์เครื่องเสียง RANE NM1 (OID:1.3.6.1.4.1.2680.1.2.7.3.2.0) สิ่งหนึ่งที่สำคัญคือการรับรู้การเปลี่ยนแปลงจำนวนไบต์ในฟิลด์ใด ๆ ต้องมีการเปลี่ยนค่าจำนวนไบต์ในฟิลด์ความยาวในชั้นนอกสุดด้วย

สำหรับตัวอย่างในการดัดแปลงจากคำสั่ง Get Request ให้เป็นคำสั่ง Set Request เพื่อตั้งค่าพารามิเตอร์ Microphone Mute ให้เท่ากับหนึ่ง (0 x 01) ต้องมีการเปลี่ยนแปลงค่าชนิดข้อมูลของ PDU เป็นค่า Set Request (0 x A3) และค่าในฟิลด์แวลู จะต้องมีค่า 0 x 04 โดยมีค่าความยาวเท่ากับ 0 x 01 และ ข้อมูลเท่ากับ 0 x 01 อย่างไรก็ตามการเพิ่มความยาวของฟิลด์แวลู จะต้องเพิ่มความยาวฟิลด์วาร์ไบด์, วาร์ไบด์ลิสต์, PDU และเมสเซจ SNMP ซึ่งต้องตรวจสอบให้ดี

          จากบทความตอนสุดท้าย จะพบว่า SNMP สามารถพัฒนาได้ง่าย ซึ่งสามารถนำฟังก์ชันเพียงพื้นฐานมาสนับสนุนระบบงานให้ดียิ่งขึ้น รวมทั้งเพิ่มระบบความเชื่อถือได้ให้กับระบบอีกด้วย อีกทั้งมีค่าใช้จ่ายในดำเนินการต่ำเนื่องจาก SNMP มักจะมาพร้อมกับอุปกรณ์อยู่แล้วเพียงรอนำมาประยุกต์ใช้งาน

รูปที่ 16 ตัวอย่างเมสเซจ SNMP ในรูปไบต์ของข้อมูล

เอกสารอ้างอิง
          1. Subramanian, Mani. Network Management. Addison-Wesley, 2000
          2. Stallings, W. SNMP, SNMPv1, SNMPv3 and RMON 1 and 2. Addison-Wesley, 1999
          3. Douglas Mauro, Kevin Schmidt. Essential SNMP. O’Reilly, 2001
          4. IETF SNMPv3 working group (Web Sites). 
          5. Andrew Tanenbaum, Computer Networks (Fourth Edition), Prentice Hall, Upper Saddle River, NJ, 2003, ISBN 0-13-038488-7.
          6. RANE, SNMP: Simple? Network Management Protocol, www.rane.com


        

สงวนลิขสิทธิ์ ตามพระราชบัญญัติลิขสิทธิ์ พ.ศ. 2539 www.thailandindustry.com
Copyright (C) 2009 www.thailandindustry.com All rights reserved.

ขอสงวนสิทธิ์ ข้อมูล เนื้อหา บทความ และรูปภาพ (ในส่วนที่ทำขึ้นเอง) ทั้งหมดที่ปรากฎอยู่ในเว็บไซต์ www.thailandindustry.com ห้ามมิให้บุคคลใด คัดลอก หรือ ทำสำเนา หรือ ดัดแปลง ข้อความหรือบทความใดๆ ของเว็บไซต์ หากผู้ใดละเมิด ไม่ว่าการลอกเลียน หรือนำส่วนหนึ่งส่วนใดของบทความนี้ไปใช้ ดัดแปลง โดยไม่ได้รับอนุญาตเป็นลายลักษณ์อักษร จะถูกดำเนินคดี ตามที่กฏหมายบัญญัติไว้สูงสุด