โปรโตคอล UDP เป็นโปรโตคอลมาตรฐานหมายเลขที่ STD number 6 ตามมาตรฐาน RFC 768 ไม่ซับซ้อนและเข้าใจได้ง่าย
การสื่อสารข้อมูลในงานอุตสาหกรรม
ตอนที่ 11 รู้จักกับโปรโตคอล UDP (User Datagram Protocol)
พิชิต จินตโกศลวิทย์
pichitor@yahoo.com
ในบทความที่แล้วได้กล่าวถึงโปรโตคอล IEEE1588 ที่มีไว้จัดการการเข้าจังหวะเวลาระหว่างอุปกรณ์ในระบบเครือข่าย ซึ่งโปรโตคอล IEEE1588 ใช้โปรโตคอล UDP (User Datagram Protocol) เป็นโปรโตคอลในการนำพาแพ็กเก็ตของโปรโตคอล IEEE1588 ผ่านระบบเครือข่ายที่ใช้ TCP/IP (Transmission Control Protocol/Internet Protocol) อีกทีหนึ่ง
ก่อนที่จะกล่าวถึงรายละเอียดเกี่ยวกับโปรโตคอล UDP จะขอกล่าวถึงข้อมูลพื้นฐานซักเล็กน้อยเกี่ยวกับโปรโตคอล TCP/P อันที่จริงแล้วโปรโตคอล TCP/IP ทำงานแบบหลายชั้นเลเยอร์ โดยที่ชั้นเลเยอร์ที่ใช้หรืออ้างอิงหมายเลข IP คือชั้นเลเยอร์ที่ 3 หรือชั้นที่มีชื่อว่าอินเทอร์เน็ต (Internet Layer) เมื่อเทียบกับโมเดลของ OSI (Open System Interconnection) ก็คือชั้นเน็ตเวิร์ก (Network) นั่นเอง ชั้นที่ 3 นี้มีหน้าที่หลักในการนำพาแพ็กเก็ต (Packet) ของโปรโตคอลต่าง ๆ ระดับบนให้สามารถข้ามระบบเครือข่ายขนาดใหญ่ได้โดยใช้โปรโตคอลที่มีชื่อว่า อินเทอร์เน็ตโปรโตคอล (Internet Protocol: IP)
ซึ่งโปรโตคอลตัวนี้มีหน้าที่นำพาแพ็กแก็ตจากอุปกรณ์ตัวหนึ่งไปยังอีกอุปกรณ์อีกตัวหนึ่งโดยไม่รู้และไม่สนใจว่าแพ็กเก็ตภายในจะเป็นของโปรโตคอลหรือโปรแกรมประยุกต์ (Application) ตัวใดที่ทำงานบนตัวอุปกรณ์นั้น ๆ หรือคอมพิวเตอร์ตัวนั้น ๆ เช่น แพ็กเก็ตภายในนั้นอาจจะเป็นของโปรแกรมประเภทเกมแบบออนไลน์ หรือเป็นของเว็บบราวเซอร์ (Web Browser) เช่น IE (Internet Explorer) ก็ได้
ดังนั้นเมื่อโปรโตคอล IP ไม่รับทำหน้าที่ดังกล่าว หน้าที่ในการแยกแยะจุดหมายปลายทางในระดับบนจึงเป็นของชุดโปรโตคอลในชั้นเอนด์ทูเอนด์ (End-to-End/Host-to-Host ) หรือตั้งแต่ชั้นทรานสปอร์ต ( Transport ) ขึ้นไปถ้าอ้างอิงกับโมเดล OSI
ในชั้น Transport สำหรับโปรโตคอลชุด TCP/IP ได้เตรียมไว้สองโปรโตคอลหลัก นั่นคือโปรโตคอล TCP (Transmission Control Protocol) และ UDP (User Datagram Protocol) ซึ่งโปรโตคอล UDP เป็นโปรโตคอลมาตรฐานหมายเลขที่ STD number 6 ตามมาตรฐาน RFC 768
รูปที่ 1 UDP กับ TCP/IP
โปรโตคอล UDP นั้นไม่ซับซ้อนและเข้าใจได้ง่าย โดยคุณสมบัติของโปรโตคอล UDP มีดังต่อไปนี้
* เป็นการสื่อสารแบบ End-to-End โปรโตคอล UDP สามารถระบุถึงโปรเซส (Process) ที่ทำงานบนเครื่องปลายทางได้ โปรเซสหมายถึงโปรแกรมที่กำลังทำงานอยู่ เช่น การเปิด IE สามตัว ก็จะมีสามโปรเซส แต่จริงแล้ว ๆ เปิดแค่หนึ่งโปรแกรมอาจจะมีหลายโปรเซสเรียกว่าเทรด (Thread) ส่วนใหญ่มักจะเป็นโปรแกรมประเภทเซิร์ฟเวอร์ (Server) ที่รับการร้องขอจากไคลเอนต์ (Client) หลาย ๆ ตัวพร้อมกัน
* เป็นการเชื่อมต่อแบบคอนเน็กชันเลส (Connectionless) ซึ่งจะกล่าวรายละเอียดในส่วนถัดไป
* ใช้การส่งข้อมูลแบบเมสเซจโอเรียนเต็ด (Message-oriented) โปรเซสที่ใช้โปรโตคอล UDP โดยทั่วไปจะรับและส่งบนเมสเซจแบบเดี่ยวโดยศัพท์ทางเทคนิคเรียกว่า เซกเมนต์ (Segment) คำว่าเมจเซจแบบเดี่ยวคือไม่มีการต่อหรือแบ่งเมจเซจโดยโปรโตคอล UDP
รูปแบบการเชื่อมต่อแบบ Connectionless
โปรโตคอล UDP ใช้การเชื่อมต่อแบบ Connectionless โปรเซสที่ใช้โปรโตคอล UDP ไม่จำเป็นต้องสร้างการเชื่อมต่อ (Connection) กับปลายทางก่อนที่จะส่งข้อมูล ยกตัวอย่างง่าย ๆ คือไม่ต้องต่อสายโทรศัพท์ก่อน และเมื่อโปรเซสต้องการหยุดการสื่อสารก็สามารถจะหยุดได้ทันทีโดยไม่จำเป็นต้องทำการแฮนด์แชคกิ้ง (Handshacking) ใด ๆ การสื่อสารจะประกอบด้วยเซกเมนต์ส่วนของข้อมูลเท่านั้น ไม่มีส่วนควบคุมการสื่อสาร
อินเตอร์เฟซ Message-oriented
โปรโตคอล UDP ใช้อินเตอร์เฟสแบบเมสเซจ (Message-oriented Interface) แต่ละเมสเซจจะถูกส่งโดยใช้หนึ่งแพ็กเก็ต หรือหนึ่งดาต้าแกรม ของ UDP เท่านั้น นั้นหมายความว่าผู้ออกแบบโปรแกรมประยุกต์ต้องรู้ขอบเขตของข้อมูลที่จะส่ง
อย่างไรก็ตามขนาดสูงสุดของดาต้าแกรมของ UDP ที่ดีนั้นขึ้นอยู่กับขนาดสูงสุดของดาต้าแกรมของ IP การทำให้ดาต้าแกรมของ UDP มีขนาดใหญ่นั้นอาจจะทำให้เกิดปัญหาในการสื่อสาร อันเนื่องจากดาต้าแกรมขนาดใหญ่สามารถทำให้เกิดการแตกเป็นดาต้าแกรมย่อย ๆ ในชั้นเลเยอร์ของ IP (Fragmentation) โดยปกติมักจะเกิดกับเครื่องคอมพิวเตอร์ ส่วนระบบงานอุตสาหกรรม เช่น PLC มักไม่เกิดปัญหาดังกล่าวเนื่องจากมักส่งข้อมูลในจำนวนที่ไม่มากเน้นความเร็วเป็นหลัก
โปรโตคอล UDP ให้ระดับประสิทธิภาพเทียบเท่ากับโปรโตคอล IP นั้นหมายว่าดาต้าแกรมสามารถหายได้ สามารถซ้ำได้ และเสียหายได้ในการติดต่อสื่อสาร ฉะนั้นโปรโตคอล UDP จึงเหมาะสมมากกับระบบงานประยุกต์ทางด้าน เสียง หรือ วิดีโอ ที่สามารถทนต่อความผิดพลาดในการส่งข้อมูลได้สูง
การกำหนดจุดหมายปลายทาง
โปรแกรมประยุกต์ที่ส่งดาต้าแกรมไปยังเซิร์ฟเวอร์จำเป็นต้องระบุจุดหมายปลายทางที่มากกว่าหมายเลข IP ดำเนินการ ก็เพราะว่าดาต้าแกรมนั้นปกติจะส่งตรงไปยังโปรเซสปลายทางที่แน่นอน ดังนั้นโปรโตคอล UDP ต้องจัดการงานเหล่านี้โดยใช้หมายเลขพอร์ต (Port)
พอร์ตมีขนาด 16 บิตที่มีไว้สำหรับระบุว่าโปรเซสบนเครื่องเซิร์ฟเวอร์ที่เกี่ยวข้องกับดาต้าแกรมนั้น ๆ โดยทั่วไปแล้วจะมีพอร์ตอยู่ 2 ประเภท ดังต่อไปนี้
1. พอร์ตเวลล์โนว์ (Well-known Port)
พอร์ต Well-known จะเป็นพอร์ตมาตรฐานที่รู้จักกันดีอยู่แล้วบนตัวเซิร์ฟเวอร์ ตัวอย่าง โปรแกรม TELNET ใช้พอร์ตหมายเลข 23
พอร์ต Well-known จะมีค่าระหว่าง 1 ถึง 1023 (ก่อนหน้าปี 1992 มีช่วงอยู่ระหว่าง 256 ถึง 1023 ซึ่งถูกใช้ในระบบเซิร์ฟเวอร์ประเภท UNIX) โดยทั่วไปแล้วพอร์ต Well-known จะเป็นหมายเลขคี่ เหตุผลก็เพราะว่าในสมัยก่อนนั้นหลักการของพอร์ตจะใช้เป็นคู่ของพอร์ตหมายเลขคี่และหมายเลขคู่สำหรับการสื่อสารแบบดูเพล็กซ์ แต่โดยส่วนใหญ่แล้วโปรแกรมฝั่งเซิร์ฟเวอร์ต้องการแค่เพียงหนึ่งพอร์ตเท่านั้น ยกเว้นเพียงโปรแกรมเซิร์ฟเวอร์ BOOTP ที่ต้องใช้สองพอร์ตคือพอร์ตหมายเลข 67 และ 68
จุดประสงค์ของพอร์ต Well-known คือทำให้ไคลเอนต์สามารถหาโปรเซสประเภทเซิร์ฟเวอร์ที่ต้องการแบบปริยายโดยไม่ต้องทำการคอนฟิกกูเรชันโดยผู้ใช้
อีกอย่างพอร์ต Well-known ที่จองไว้แบบถาวรจะต้องลงทะเบียนที่หน่วยงาน Internet Corporation for Assigned Names and Numbers (ICANN) โดยปัจจุบันมีการจองไว้จำนวน 1024 (0-1023) หมายเลข สำหรับโปรแกรมฝั่งเซิร์ฟเวอร์มาตรฐาน ดังตัวอย่างบางส่วนที่ใช้โปรโตคอล UDP ดังตารางที่ 1
ตารางที่ 1 UDP Server Port Numbers
2. พอร์ตอีเฟมเมรอล (Ephemeral Port)
ฝั่งไคลเอนต์ไม่ได้จำเป็นต้องใช้พอร์ต Well-known ก็เพราะว่าไคลเอนต์สามารถเข้าติดต่อสื่อสารกับเซิร์ฟเวอร์เมื่อใดก็ได้ และใช้หมายเลขพอร์ตใดก็ได้ที่ไม่ซ้ำกับโปรเซสแบบไคลเอนต์ตัวอื่นในการส่งดาต้าแกรมไปยังเซิร์ฟเวอร์ แต่ละโปรเซสฝั่งไคลเอนต์จะถูกจัดสรรหมายเลขพอร์ตจากระบบปฏิบัติการที่มันทำงานอยู่ โดยระบบพูลลิ่ง (Pooling) พอร์ต Ephemeral จะมีค่ามากกว่า 1023 โดยปกติจะอยู่ในช่วง 1024 ถึง 5000 หลักการมีอยู่ว่าไคลเอนต์สามารถใช้หมายเลขพอร์ตใดก็ได้ตราบที่องค์ประกอบดังต่อไปนี้เป็นเอกลักษณ์ <ประเภทโปรโตคอลระดับทรานสพอร์ต, หมายเลข IP, หมายเลขพอร์ต >
ดังนั้นการชี้ขาดว่าคู่โปรเซสไหนกำลังติดต่อสื่อสารกันต้องใช้หมายเลขพอร์ตทั้งสองฝั่งเป็นตัวตัดสิน ในทางเทคนิคหมายเลขพอร์ตจะระบุถึงโปรเซสของโปรแกรมประยุกต์ในเครื่องนั้น ๆ แต่ซ็อกเก็ต (Socket) ซึ่งประกอบด้วยหมายเลข IP และหมายเลขพอร์ต ตัวอย่างเช่น 193.61.29.127:53 (ซ็อกเก็ต สำหรับ DNS Server) จะเป็นตัวบ่งชี้การเชื่อมต่อแบบ End Point เสมือนเป็นวงจรสื่อสารแบบเสมือน (Virtual Circuit) ของการติดต่อสื่อสารของคู่โปรเซส ณ ขณะนั้น
โดยพื้นฐานแล้วโปรโตคอล UDP ทำงานระดับแบบเดียวกับโปรโตคอล IP ยกเว้นการเราติ้ง แต่ที่เป็นพิเศษแตกต่างกับโปรโตคอล IP คือสามารถทำตัวเป็น Multiplexer/Demultiplexer สำหรับการส่งและรับดาต้าแกรมโดยใช้หมายเลขพอร์ตเสมือนเป็นสล๊อตข้อมูล (Data Slot) ดังแสดงในรูปที่ 2
รูปที่ 2 UDP Multiplexer/Demultiplexer
รูปแบบดาต้าแกรมของ UDP (Datagram Format)
แต่ละดาต้าแกรมของ UDP จะถูกส่งโดยหนึ่งดาต้าแกรมของ IP ถึงแม้ดาต้าแกรมของ IP อาจจะถูกแบ่งย่อยเป็นหลายดาต้าแกรมย่อยระหว่างการส่งซึ่งขึ้นอยู่กับอุปกรณ์เครือข่ายที่มันวิ่งผ่าน แต่อย่างไรก็ตามที่ฝั่งรับจะประกอบรวมดาต้าแกรมย่อยของ IP กลับตามสภาพเดิมก่อนที่จะส่งให้โปรโตคอล UDP สำหรับโปรโตคอล IP ทุกระบบจะยอมรับขนาดดาต้าแกรมที่ 576 ไบต์ นั้นหมายความว่าถ้าใช้ขนาดส่วนหัวของ IP ใหญ่สุดที่ 60 ไบต์ จะมีพื้นที่ให้ดาต้าแกรมของ UDP จำนวน 516 ไบต์ซึ่งเป็นขนาดที่ผู้ออกแบบไม่ควรใช้เกิน แต่ตามหลักการขนาดดาต้าแกรมของ UDP สามารถใหญ่กว่า 516 ไบต์ได้ แต่ก็ไม่รับประกันประสิทธิภาพการสื่อสาร
โปรโตคอล UDP เป็นทางเลือกหนึ่งสำหรับโปรแกรมประยุกต์ที่จะส่งข้อมูลโดยใช้เครือข่าย TCP/IP ข้อดีคือไม่จำเป็นต้องต้องสร้างการเชื่อมต่อก่อน โปรโตคอล UDP จะส่งข้อมูลเป็นเซกเมนต์หรือดาต้าแกรมที่ประกอบด้วยส่วนหัว (Header) ขนาด 8 ไบต์ตามด้วยข้อมูลจริง (Data) ที่ต้องการส่ง หรือในทางเทคนิคเรียกว่าเปย์โหลด (Payload) รูปแบบฟอร์แมตของดาต้าแกรมแสดงดังรูปที่ 3
รูปที่ 3 UDP Format
* ฟิลด์พอร์ตต้นทาง (Source Port) เป็นฟิลด์ (Field) ที่ใช้ระบุถึงโปรเซสที่ส่งดาต้าแกรมนั้น ๆ
* ฟิลด์พอร์ตปลายทาง (Destination Port) เป็นฟิลด์ ที่ใช้ระบุถึงโปรเซสที่ต้องนำข้อมูลในดาต้าแกรมนั้น ๆ ไปประมวลผลต่อ
* ฟิลด์ความยาวเมสเซจ (Message Length) เป็นฟิลด์ที่ใช้บอกความยาวของดาต้าแกรมนั้นโดยคิดจากส่วนหัวรวมทั้งข้อมูลโดยมีหน่วยเป็นไบต์ หรือออกเต็ต (Octet)
* ฟิลด์เช็คซัม (Checksum) เป็นฟิลด์ตรวจสอบความผิดพลาดแบบทางเลือก (Optional) ถ้าไม่ใช้ให้ใส่ค่าทุกบิตเท่ากับหนึ่ง
จดจำไว้ว่า โปรโตคอล UDP ไม่ให้สนับสนุนการควบคุมการไหลของข้อมูล (Flow Control), การควบคุมความผิดพลาด (Error Control) หรือ แม้แต่การส่งซ้ำ ถ้าการได้รับดาต้าแกรมที่มีความเสียหาย สิ่งที่โปรโตคอล UDP จัดการแค่ส่งข้อมูลไปยังโปรเซสปลายทางให้ถูกต้องโดยใช้หมายเลขพอร์ตเท่านั้น
เช็คซัมของ UDP (Checksum)
เช็คซัมมีขนาด 16 บิต ฝั่งส่งสามารถเลือกว่าจะคำนวณค่าเช็คซัม หรือไม่คำนวณโดยการกำหนดให้ค่าเท่ากับศูนย์ ดังนั้นทางด้านฝั่งรับจะทำหน้าที่ตรวจสอบค่าเช็คซัมว่ามีค่าเท่ากับศูนย์หรือไม่ก่อน ถ้าไม่เท่ากับศูนย์ก็จะคำนวณว่าค่าเช็คซัมนั้นมีค่าถูกต้องหรือไม่ ถ้าไม่ถูกต้องแสดงว่าดาต้าแกรมนั้นมีปัญหา จดจำไว้ว่าโปรโตคอล UDP ใช้การคำนวณแบบ Ones-complement Arithmetic ดังนั้นค่าศูนย์จะคำนวณได้ผลทุกบิตในฟิลด์เช็คซัมเท่ากับหนึ่ง ยิ่งกว่านั้นการคำนวณหาค่าเช็คซัมไม่ใช่เฉพาะคิดจากผลรวมของฟิลด์ในดาต้าแกรมของ UDP เท่านั้น แต่จะนำค่าจากส่วนหัวจำลอง IP (Pseudo-IP Header) มาคิดด้วยดังรูปที่ 4
รูปที่ 4 Pseudo-IP Header
UDP Encapsulation
รูปที่ 5 แสดงตัวอย่าง การบรรจุดาต้าแกรมของ UDP ลงในดาต้าแกรมของ IP และสุดท้ายทั้งหมดถูกบรรจุลงโปรโตคอลระดับดาต้าลิงค์ (Data Link)
รูปที่ 5 UDP Encapsulation
การปฏิสัมพันธ์ระดับโปรเซส
โปรโตคอล UDP ไม่ได้ถูกจำกัดให้ปฏิสัมพันธ์แบบ 1-1 เท่านั้น การปฏิสัมพันธ์แบบ 1-many ก็สามารถทำได้โดยใช้หมายเลข IP แบบบรอดคาสต์ (Broadcast) หรือ มัลติคาสต์ (Multicast) ดังนั้นการปฏิสัมพันธ์แบบ many-1 ก็สามารถทำได้เช่นกันเสมือนกับการมีหลายไคลเอนต์ติดต่อสื่อสารกับหนึ่งเซิร์ฟเวอร์ สำหรับส่วนการปฏิสัมพันธ์แบบ many-to-many ก็สามารถทำได้เช่นกันตามการประยุกต์ใช้หลักการ
โปรโตคอลที่ใช้ UDP
โปรโตคอล UDP มีประโยชน์อย่างมากสำหรับการติดต่อสื่อสารแบบไคลเอนต์-เซิร์ฟเวอร์ โดยที่ไคลเอนต์ต้องการส่งการร้องขอแบบสั้น ๆ และต้องการการตอบกลับจากเซิร์ฟเวอร์แบบสั้น ๆ เช่นกัน ถ้าไม่มีการตอบกลับ หรือการร้องขอได้เสียหาย โปรโตคอลระดับบนต้องใช้ตัวจับเวลา (Timer) รอการตอบกลับ ถ้าหมดเวลา (Time Out) ก่อนรับการตอบกลับ ไคลเอนต์ต้องทำการร้องขอใหม่อีกครั้งด้วยตัวเอง สังเกตได้ว่าถ้าทุกอย่างเป็นไปอย่างถูกต้องจะใช้เพียงแค่สองแพ็กเก็ตเท่านั้น จึงถือได้ว่าเหมาะสมสำหรับการใช้เป็นโปรโตคอลสื่อสารบน MCU (Microcontroller Unit) เนื่องจากมีทรัพยากรจำกัด
ปัญหาของ UDP
เนื่องจากโปรโตคอล UDP สนับสนุนเพียงการจัดส่งข้อมูลแบบพื้นฐาน ปัญหาเกี่ยวกับโปรโตคอล UDP มักจะเกี่ยวข้องกับการจัดส่งข้อมูล โปรแกรมประยุกต์ที่ใช้โปรโตคอล UDP อาจจะต้องทำงานหนักในระบบเครือข่ายที่มีความคับคั่งของข้อมูลสูง การหายไปของดาต้าแกรมของ UDP จำเป็นต้องถูกจัดการที่ระดับโปรแกรมประยุกต์ ดังนั้นผู้พัฒนาโปรแกรมประยุกต์ต้องทราบว่าส่วนงานใดที่โปรโตคอล UDP ไม่ดำเนินการ โดยมีรายละเอียดที่ต้องทราบดังต่อไปนี้
* โปรโตคอล UDP ไม่สร้างการเชื่อมต่อก่อนส่งข้อมูล ส่งทันทีถ้าเตรียมข้อมูลเสร็จเรียบร้อย เปรียบเทียบได้กับการส่งจดหมาย ซึ่งไม่ทราบว่าผู้รับอยู่ที่ปลายทางหรือไม่
* โปรโตคอล UDP ไม่ต้องการการยืนยันว่าได้รับข้อมูลที่ส่งไปหรือไม่ เปรียบเสมือนการส่งจดหมายไม่ลงทะเบียน
* โปรโตคอล UDP ไม่รับประกันว่าข้อมูลไปถึงปลายทางทุกครั้ง
* โปรโตคอล UDP ไม่ตรวจสอบการสูญหายของดาต้าแกรม และไม่มีการส่งซ้ำ
* โปรโตคอล UDP ไม่รับประกันว่าดาต้าแกรมที่ส่งออกไปจะไปถึงปลายทางตามลำดับก่อนหลัง
* โปรโตคอล UDP ไม่มีกลไกเกี่ยวกับการควบคุมการไหลของข้อมูลในกรณีที่มีความคับคั่งของข้อมูลสูง
การใช้งานโปรโตคอล UDP
ผู้ออกแบบหรือผู้พัฒนาสามารถใช้โปรโตคอล UDP ส่งข้อมูลที่ไม่ต้องการความเชื่อถือได้สูงมาก เช่นการขอหมายเลข IP จาก ISP (Internet Service Provider) กระบวนการดังกล่าว ดาต้าแกรมของ UDP จะถูกบรรจุในดาต้าแกรมของ IP และหลังจากนั้น จะถูกบรรจุในแพ็กเก็ตหรือเฟรมของ PPP (Point to Point Protocol) ซึ่งเป็นโปรโตคอลที่ใช้ส่งข้อมูลประเภท IP ผ่านระบบโทรศัพท์
จะเห็นว่าทั้งโปรโตคอล UDP และโปรโตคอล IP มีส่วนเช็คซัมในการตรวจข้อผิดพลาด และส่วนของโปรโตคอล PPP ก็มี FCS (Frame Check Sequence) ตรวจสอบข้อผิดพลาด นั้นหมายความว่ามีส่วนที่สามารถหาข้อผิดพลาดตั้งสามส่วน ดังนั้นสามารถที่จะรับประกันได้ว่าข้อมูลไปถึงปลายทางได้อย่างถูกต้อง
อย่างไรก็ตามก็ยังมีโอกาสที่ข้อมูลที่ส่งไม่ไปถึงปลายทางตามลำดับ ถ้าต้องการความสามารถส่วนนี้ก็ต้องใช้โปรโตคอล TCP หรือต้องไปจัดการที่ระดับโปรแกรมประยุกต์ การใช้โปรโตคอล UDP ค่อนข้างจะพัฒนาง่ายเพราะว่าโปรโตคอล UDP ไม่ต้องติดตามผลลัพธ์ในการส่งและรับทุกทุกแพ็กเก็ต รวมทั้งไม่ต้องสร้างการเชื่อมต่อและจบการเชื่อมต่อ เสมือนการรอการรับสายโทรศัพท์ และการขอจบการสนทนา
ก็เพราะว่าโปรโตคอล UDP ถูกออกแบบอย่างง่าย ๆ เมสเซจที่ส่งด้วยโปรโตคอล UDP จะส่งได้เร็วกว่าโปรโตคอล TCP ดังนั้นโปรโตคอล UDP จึงถูกใช้ในโปรแกรมแชต หรือการคุยโทรศัพท์ผ่านอินเทอร์เน็ต รวมทั้งการขอหมายเลข IP ผ่านชื่อ URL (Uniform Resource Locator) เป็นต้น
* ตัวอย่างโปรโตคอล UDP สำหรับโปรแกรม DNS
04 89 00 35 00 2C AB B4 00 01 01 00 00 01 00 00 00 00 00 00 04 70 6F 70 64 02 69 78 06 6E 65 74 63 6F 6D 03 63 6F 6D 00 00 01 00 01
UDP Header: | 04 89 00 35 00 2C AB B4 |
Data | 00 01 01 00 00 01 00 00 00 00 00 00 04 70 6F 70 64 02 69 78 06 6E 65 74 63 6F 6D 03 63 6F 6D 00 00 01 00 01 |
Source Port | 04 89 |
Destination Port | 00 35 |
Length | 00 2C |
Checksum | AB B4 |
Data | DNS Message |
* การคำนวณเช็คซัมของโปรโตคอล UDP
ในการคำนวณเช็คซัมของโปรโตคอล UDP จะรวมส่วน Pseudo IP Header เข้าไปด้วยดังต่อไปนี้
IP Source Address 4 bytes
IP Destination Address 4 bytes
Protocol 2 bytes
UDP Length 2 bytes
การคำนวณจะคำนวณผลรวมของ Pseudo IP Header, UDP Header และ ข้อมูล Payload ถ้าจำนวนไบต์ของข้อมูลเป็นเลขคี่จะต้องเพิ่มไบต์ที่เป็นซีโร่แพดเข้าไปให้เป็นเลขคู่เพื่อการการคำนวณให้เป็น 16 บิต โดยที่ Pseudo IP header และ ซีโร่แพด จะไม่ถูกส่งออกไปในระบบเครือข่าย ส่วนค่า Protocol ใน Pseudo IP header ของโปรโตคอล UDP มีค่าเท่ากับ 17
* ตัวอย่างซอร์สโค้ดภาษา C
u16 buff[] คืออาร์เรย์ที่บรรจุค่าของ UDP Header และ Data
u16 len_udp คือ ความยาวเป็นจำนวนไบต์ของ UDP Header และ Data
BOOL Padding จะเป็น 1 ถ้าจำนวน Data เป็นเลขคู่ และเป็น 0 ถ้าเป็นเลขคี่
u16 src_addr[4] และ u16 dest_addr[4] คือ หมายเลข IP ต้นทางและปลายทาง
/*
**************************************************************************
Function: udp_sum_calc()
Description: Calculate UDP checksum
***************************************************************************
*/
typedef unsigned short u16;
typedef unsigned long u32;
u16 udp_sum_calc(u16 len_udp, u16 src_addr[],u16 dest_addr[], BOOL padding, u16 buff[])
{
u16 prot_udp=17;
u16 padd=0;
u16 word16;
u32 sum;
// Find out if the length of data is even or odd number. If odd,
// add a padding byte = 0 at the end of packet
if (padding&1==1){
padd=1;
buff[len_udp]=0;
}
//initialize sum to zero
sum=0;
// make 16 bit words out of every two adjacent 8 bit words and
// calculate the sum of all 16 vit words
for (i=0;i<len_udp+padd;i=i+2){
word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
sum = sum + (unsigned long)word16;
}
// add the UDP pseudo header which contains the IP source and destinationn addresses
for (i=0;i<4;i=i+2){
word16 =((src_addr[i]<<8)&0xFF00)+(src_addr[i+1]&0xFF);
sum=sum+word16;
}
for (i=0;i<4;i=i+2){
word16 =((dest_addr[i]<<8)&0xFF00)+(dest_addr[i+1]&0xFF);
sum=sum+word16;
}
// the protocol number and the length of the UDP packet
sum = sum + prot_udp + len_udp;
// keep only the last 16 bits of the 32 bit calculated sum and add the carries
while (sum>>16)
sum = (sum & 0xFFFF)+(sum >> 16);
// Take the one's complement of sum
sum = ~sum;
return ((u16) sum);
}
สรุป
โปรโตคอล UDP ถูกพัฒนาให้เป็นโปรโตคอลสำหรับระบบงานที่ไม่ต้องการความเชื่อถือได้ระดับสูง อาจจะกล่าวได้ว่าโปรโตคอล UDP เป็นโปรโตคอลที่ง่ายที่สุดในชุดโปรโตคอล TCP/IP ทำให้ระบบงานที่ใช้โปรโตคอล UDP มีความเร็วในการรับส่งข้อมูลสูงเหมาะสมกับระบบงานเรียลไทม์ ในบทความต่อไปจะกล่าวถึงโปรโตคอลอีกตัวหนึ่งของ TCP/IP ที่วิ่งบนโปรโตคอล UDP นั้นคือโปรโตคอล SNMP (Simple Network Management Protocol) อันจะดูเหมือนไกลตัวผู้ดูแลระบบงานอุตสาหกรรม แต่จริง ๆ แล้วมีความสำคัญมากกับระบบงานที่มีระดับความวิกฤติสูง โปรดติดตามนะครับ
เอกสารอ้างอิง
1. J.E Goldman and P.T Rawles, Applied Data Communications. Addison-Wesley, New York, 2001
2.Douglas Comer, Computer Networks and Internets with Internet Applications (Fourth Edition), Prentice Hall, Upper Saddle River, NJ, 2004, ISBN 0-13-143351-2. http://netbook.cs.purdue.edu
3.RFC 768, User Datagram Protocol, August 1980.
4 Andrew Tanenbaum, Computer Networks (fourth edition), Prentice Hall, Upper Saddle River, NJ, 2003, ISBN 0-13-038488-7. http://www.phptr.com/tanenbaumcn4/
สงวนลิขสิทธิ์ ตามพระราชบัญญัติลิขสิทธิ์ พ.ศ. 2539 www.thailandindustry.com
Copyright (C) 2009 www.thailandindustry.com All rights reserved.
ขอสงวนสิทธิ์ ข้อมูล เนื้อหา บทความ และรูปภาพ (ในส่วนที่ทำขึ้นเอง) ทั้งหมดที่ปรากฎอยู่ในเว็บไซต์ www.thailandindustry.com ห้ามมิให้บุคคลใด คัดลอก หรือ ทำสำเนา หรือ ดัดแปลง ข้อความหรือบทความใดๆ ของเว็บไซต์ หากผู้ใดละเมิด ไม่ว่าการลอกเลียน หรือนำส่วนหนึ่งส่วนใดของบทความนี้ไปใช้ ดัดแปลง โดยไม่ได้รับอนุญาตเป็นลายลักษณ์อักษร จะถูกดำเนินคดี ตามที่กฏหมายบัญญัติไว้สูงสุด