Free Web Space | BlueHost Review  

UDP
โดย
นายอิสระ บุญรักษ์ 501-00-2345
นายอุเทน เพราะดี 501-00-0541               

 

User Datagram Protocol (UDP) เป็นวิธีการสื่อสารหรือโปรโตคอลที่จำกัดจำนวนการบริการ เมื่อข่าวสารมีการแลกเปลี่ยน ระหว่างคอมพิวเตอร์ในเครือข่ายที่ใช้ Internet Protocol (IP) โดย UDP เป็นตัวเลือกหนึ่งของ Transmission Control Protocol (TCP) และใช้ร่วมกับ IP บางครั้งเรียกว่า UDP/IP ซึ่ง UDP เหมือนกับ TCP ในการใช้ IP ในการดึงหน่วยข้อมูล (เรียกว่า datagram) จากคอมพิวเตอร์หนึ่งไปยังอีกเครื่องหนึ่ง

แต่ต่างจาก TCP โดย UDP ไม่ให้การบริการสำหรับการแบ่งข่าวสารเป็นแพ็คเกต (datagram) และประกอบขึ้นใหม่เมื่อถึงปลายหนึ่ง UDP ไม่ให้ชุดของแพ็คเกตที่ข้อมูลมาถึง หมายความว่า โปรแกรมประยุกต์ที่ใช้ UDP ต้องมีความสามารถในการสร้างมั่นใจว่าข่าวสารที่มาถึงอยู่ในลำดับที่ถูกต้อง การประยุกต์เครือข่ายที่ต้องการประหยัดเวลาในการประมวลผล เพราะมีหน่วยข้อมูลในการแลกเปลี่ยน (ดังนั้น จึงมีข่าวสารน้อยมากในการประกอบขึ้นใหม่) จะชอบ UDP มากกว่า TCP ซึ่ง Trivial File Transfer Protocol (TFTP) ใช้ UDP แทนที่ TCP

UDP ให้ 2 บริการที่ไม่มีใน TCP โดยเลเยอร์ของ IP คือ Port number เพื่อช่วยแยกแยะการขอของผู้ใช้ และความสามารถ checksum เพื่อตรวจสอบการมาถึงข้อมูล ในแบบจำลองการสื่อสาร Open System Interconnection (OSI) UDP เหมือนกับ TCP คือ อยู่ที่เลเยอร์ 4 Transport Layer

          แอปพลิเคชันที่ใช้ UDP เป็นฐานในการส่งข้อมูลคือ Domain Name System (DNS), Streaming media, Voice over IP และ
เกมออนไลน์

ตัวอย่างโปรแกรมที่ใช้ UDP
UDP เป็นการส่งข้อมูลที่ไม่มีการยืนยันการรับส่งข้อมูล คือผู้ส่งไม่สามารถรู้ได้ว่าข้อมูลได้ถึงผู้รับแล้วหรือไม่ มาถึงตรงนี้ คงเกิดคำถามขึ้นมากันบ้างแล้วนะครับ UDP มันมีข้อเสียอย่างนี้ แล้วจะใช้ได้เร้อ.... ผมต้องบอกเลย ว่าได้ฮะ ใช้ได้แน่ๆ แต่เราจะต้องเขียนการตรวจสอบข้อมูลเอาเอง เช่น ถ้าผมส่งข้อมูลไป ถ้าฝั่งที่รับข้อมูลได้รับข้อมูลแล้ว ก็ให้ตอบกลับมาให้ผม ผมก็ทราบแล้วว่าข้อมูลไปถึง แต่ถ้าไม่มีการตอบกลับภายในระยะเวลาที่ผมกำหนด ก็ให้แจ้งว่าผู้รับไม่ได้รับข้อความ
ข้อดีของ UDP ที่เห็นกันได้ชัดเจนคือ มันจะส่งข้อมูลได้เร็วกว่า แบบ TCP และจะไม่มีการสร้าง Connection เกิดขึ้น ทำให้ข้อมูลที่วิ่งในเครือข่ายมีน้อยลงด้วย
อ๊ะ เกริ่นมาพอสมควรกันแล้วนะครับ งานนี้มาเริ่มสร้างโปรแกรม Client / Server เพื่อแสดงการรับส่งข้อมูลโดยใช้ UDP กันเลยครับ
1. เปิดโปรแกรม Microsoft Visual Basic ทำการเลือกสร้างโปรเจ็คแบบ Standard EXE
2. ทำการเพิ่ม คอนโทรล MS Winsock เข้ามาในโปรเจ็ค โดยเลือกที่ Project->Components แล้วทำการคลิกเลือก Microsoft Winsock 6.0 ดังรูป


 

 3.ทำการเลือกคอลโทรลต่างๆ แล้ววางตำแหน่งดังรูป


4.ทำการหนด Property ต่างๆ ดังนี้


Name

Property

Value

Text1

Text

[ว่าง]

Text1

Multiline

True

Text2

Text

[ว่าง]

Text2

Multiline

True

Text3

Text

[ว่าง]

Command1

Caption

Send

Winsock1

Protocol

1-sckUDPProtocol

Winsock2

Protocol

1-sckUDPProtocol

 

 

5. ทำการคัดลอกโค้ดนำไปใส่ในส่วน View Code


Private Sub Command1_Click()
 If Text3.Text <> "" Then
  Winsock2.RemoteHost = Winsock2.LocalIP
  Winsock2.RemotePort = 6543
  Winsock2.SendData Text3.Text
  Text3.Text = ""
 End If
End Sub

Private Sub Form_Load()
 Winsock1.Bind 6543, Winsock1.LocalIP
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim str As String
 Winsock1.GetData str
 Text1.Text = Text1.Text & str & Chr(13) & Chr(10)
 
 'send message to Client
 Winsock1.SendData "[received]" & Time
 
End Sub

Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim str As String
 Winsock2.GetData str
 Text2.Text = Text2.Text & str & Chr(13) & Chr(10)

End Sub

 

6. เมื่อเสร็จแล้ว ก็ทดลอง Run โปรแกรมกันเลยครับ ทดลองพิมพ์ข้อความแล้วกด Send ดูนะครับ



อธิบายโปรแกรม
โปรแกรมนี้จะทำงานเป็น Server และ Client ในโปรแกรมดียวกัน แต่จะติดต่อส่งข้อมูลระหว่างกันผ่านทาง MS Winsock Control
การทำงานของโปรแกรมจะเริ่มจากส่วนของ Winsock1 ที่ทำหน้าที่เป็น Server ทำการ Bind เพื่อรอคอยรับข้อมูลจากผู้ส่ง ตรงหมายเลขพอร์ท 6543 และ หมายเลข IP ของเครื่อง Server (Winsock1.LocalIP) และ เมื่อ Server ได้รับข้อมูลที่ส่งมา คือจะเกิด Event Winsock1_DataArrival ขึ้น ผมก็จะรับข้อมูลที่ส่งมาโดยใช้ Methode GetData ของ Winsock เพื่อนำข้อมูลขึ้นมาแสดงที่คอนโทรล Text1
ส่วนการทำงานของฝั่ง Client จะทำการกำหนดชื่อ Host และ หมายเลขพอร์ท ที่เป็นปลายทาง แล้วทำการส่งข้อมูลที่อยู่ในคอนโทรล Text3 ออกไป ตอนนี้ผมอยากให้สังเกตุที่คำสั่งในการกำหนด Host ปลายทาง คือ
Winsock2.RemoteHost = Winsock2.LocalIP
จะเห็นได้ว่าผมกำหนดให้ Winsock2 ทำการส่งข้อมูลที่ LocalIP (ก็คือ ip ของเครื่องตัวเอง) เพื่อเป็นการแสดงบนเครื่องๆนี้ เท่านั้น ***หากต้องการส่งไปยังเครื่องอื่น ที่ Run โปรแกรมนี้เช่นกัน แค่เพียงเปลี่ยนจาก Winsock2LocalIP ไปเป็น หมายเลข IP ของเครื่องที่ต้องการติดต่อ ก็ส่งข้อมูลได้แล้วครับ

ปิดท้าย

จะเห็นได้ว่าโปรแกรมตัวอย่างผมจะแสดงไว้ในหน้าต่างเดียวกันเลย ก็เพื่อลดขั้นตอนในการอธิบายลงครับ เอาเฉพาะแนวทาง ที่คุณจำเป็นจะต้องต่อยอด ด้วยตัวเองครับ หวังว่าตัวอย่างโปรแกรมที่ผมได้นำมาเสนอครั้งนี้ อาจจุดประกาย การสร้างสรรค์โปรแกรม ในตัวคุณขึ้นมาบ้างนะครับ แล้วพบกันใหม่ กับ 9'M :-P

 

ข้อแตกต่างระหว่าง UDP กับ TCP

 

          UDP : (User Datagram Protocol) - อยู่ใน Transport Layer ทำหน้าที่จัดการและควบคุมการรับส่งข้อมูล แต่ไม่มีกลไกความคุมการรับ ส่งข้อมูลให้มีเสถียรภาพและเชื่อถือได้ (unreliable, connectionless) โดยปล่อยให้เป็นหน้าที่ของแอพพลิเคชั่นเลเยอร์ แต่ UDP มีข้อได้เปรียบในการส่งข้อมูลได้ทั้งแบบ unicast, multicast และ broadcast อีกทั้งยังทำการติดต่อสื่อสารได้เร็วกว่า TCP เนื่องจาก TCP ต้องเสีย overhead ให้กับขั้นตอนการสื่อสารที่ทำให้ TCP มีความน่าเชื่อถือในการรับส่งข้อมูลนั่นเอง

 จุดเด่นของ     UDP

          User Datagram Protocol (UDP) ซึ่งมีจุดเด่นที่ความเร็ว ขนาดเล็ก และไม่มีการทำงานเกี่ยวการส่งข้อมูลซ้ำหรือคำนวณอัตราการส่งข้อมูล ซึ่งจะเหมาะกับการส่งข้อมูลแบบ realtime ซึ่งข้อมูลที่สูญหายบางส่วนหรือข้อมูลที่เกิด delay จะถูกละความสนใจไป

มันจะส่งข้อมูลได้เร็วกว่า แบบ TCP และจะไม่มีการสร้าง Connection เกิดขึ้น ทำให้ข้อมูลที่วิ่งในเครือข่ายมีน้อยลงด้วย

          เป็นการสื่อสารแบบ Connectionless คือข้อมูลจะถูกแบ่งเป็นชิ้นๆ ตามที่อยู่ปลายทาง แล้วผ่านตัวกลางไปยังปลายทาง อาจจะใช้เส้นทางคนละเส้นทางกันก็ได้ รวมทั้งข้อมูลแต่ละชิ้นอาจจะถึงก่อนหลังแตกต่างกันไปได้ด้วย ทำให้การเริ่มต้นส่งทำได้รวดเร็ว ไม่ต้องเสียเวลาสร้าง Connection

 จุดด้อยของ     UDP
         
ไม่สามารถรับประกันได้ว่า ข้อมูลถึงปลายทางอย่างถูกต้อง ตัวอย่างงานที่ใช้การสื่อสารแบบ UDP คือ การส่งสัญญาณเสียงดิจิทัล , Video

 

UDP
โปรโตคอล UDP

ใน Host-to-Host layer นอกจากจะมีโปรโตคอล TCP ทำงานแล้ว ก็ยังมีโปรโตคอล UDP (User Datagram Protocol) ที่มีคุณสมบัติแตกต่างกันอยู่ด้วย ในการรับส่งข้อมูลผ่านโปรโตคอล UDP จะเป็นแบบที่ทั้งสองด้านไม่จำเป็นต้องอาศัยการสร้างช่องทางเชื่อมต่อกัน (connectionless) ระหว่างเครื่องเซิรฟ์เวอร์ให้บริการกับเครื่องที่ขอใช้บริการ โดยไม่ต้องแจ้งให้ฝ่ายรับข้อมูลเตรียมรับข้อมูลเหมือนโปรโตคอล TCP และไม่มีการตรวจสอบความถูกต้องครบถ้วนในการรับส่งข้อมูลนั้น ๆ ด้วย เนื่องจากโปรโตคอล UDP ไม่มีสัญญาณสอบทานข้อมูล (avknowledgement) ในการส่งข้อมูลแต่ละครั้งและไม่มีการส่งข้อมูลใหม่อีกในกรณีที่เกิดความผิดพลาดของการส่งข้อมูล เมื่อเป็นเช่นนี้แอพพลิเคชันหรือโปรเซสใดที่ต้องอาศัยโปรโตคอล UDP ในการส่งผ่านข้อมูลก็อาจจะต้องสร้างขบวนการตรวจสอบข้อมูลขึ้นมาเอง



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

  1. ในขั้นตอนของ Process layer เมื่อ"ปรแกรมควบคุมอุปกรณ์เครือข่ายเช่น โปรแกรม Network management ต้องส่งข้อมูลไปยังอุปกรณ์ที่ต้องการ แอพพลิเคชันนั้นจะติดต่อผ่านโปรโตคอล SNMP ในชั้น Process layer
  2. โปรโตคอล SNMP จะติดต่อกับโปรโตคอล UDP ในชั้นถัดไป เพื่อขอติดต่อผ่าน Port ที่กำหนด
  3. โปรโตคอล SNMP เตรียมข้อมูลที่จะส่ง รวมทั้งที่อยู่ปลายทาง
  4. โปรโตคอล SNMP ส่งผ่านข้อมูลให้โปรโตคอล UDP ที่อยู่ในชั้น Transport
  5. โปรโตคอล UDP ทำหน้าที่ผนึกข้อมูลหรือ datagram นั้น ไปกับโปรโตคอล IP ในชั้นถัดไป เพื่อส่งข้อมูลออกจากเครื่อง

ซึ่งจะเห็นได้ว่ามีกลไกลที่ต่างจากการส่งข้อมูลด้วยโปรโตคอล TCP ซึ่งจะต้องมีการติดต่อกันก่อน และทั้งสองฝ่ายรับทราบการรับส่งข้อมูลนั้น

การทดลองดักจับโปรโตคอลที่มีชื่อว่า UDP หรือชื่อเต็มๆ ก็คือ User Datagram Protocol ซึ่งเป็นโปรโตคอลที่อยู่ในชั้น Transport layer และคอยให้บริการกับชั้น Application layer โดย UDP นี้จะให้บริการแบบ Unreliable คือจะไม่มีการรับประกันการสูญหายของข้อมูล ไม่มีกลไกรับประกันความน่าเชื่อถือ และเป็นแบบ Connectionless คือลักษณะที่ไม่ต้องทำ handshake ระหว่างผู้ส่งและผู้รับกันก่อนมีการส่งข้อมูล ส่วน Application ที่ใช้ UDP ได้แก่ Internet phone, realtime video conferencing, streaming audio และ video เป็นต้น

พอร์ตของ UDP

ในการทำเกตเวย์หรือไฟร์วอลนั้น  มีสิ่งจำเป็นอย่างหนึ่งที่ผู้ดูแลระบบจะต้องทราบคือพอร์ตของบริการหรือของแอพลิเคชันต่าง ๆ  เนื่องจากตัวเกตเวย์และ/หรือไฟร์วอลนั้นจะไม่รู้เลยว่าแพคเก็ตข้อมูลที่กำลังรับส่งอยู่บนเครือข่ายนั้นเป็นบริการประเภทไหน  แต่มันจะรู้เพียงว่าข้อมูลที่รับส่งกันนั้นมีพอร์ตเป็นค่าอะไร ซึ่งเมื่อรู้ค่าของพอร์ตแล้วก็สามารถจะรู้ถึงชนิดของบริการได้  การรู้ค่าพอร์ตของบริการต่าง ๆ จะทำให้ผู้ดูแลเกตเวย์หรือไฟร์วอลสามารถกำหนดแอคเซสรูล (กฎที่กำหนดว่าจะยอมให้แพ็กเก็ตประเภทใดบ้างผ่านไฟล์วอลไปได้)

Wireshark Lab3: UDP

เริ่มเลยแล้วกันครับกับ Lab ที่ 3 เรื่อง UDP หรือชือเต็มๆ ว่า User Datagram Protocol ซึ่งก็คือ Protocol ที่ทำงานในชั้น Transport Layer ซึ่งทำหน้าที่เป็นตัวกลางระหว่าง Application และเครือข่าย โดย UDP จะไม่รับประกันความถูกต้องของข้อมูลที่ส่ง และข้อมูลที่ส่งถึงปลายทางอาจไม่เป็นลำดับก็ได้ แต่ข้อดีของ UDP ก็คือ สามารถทำงานได้เร็ว เนื่องจากไม่มีระบบในการทำ Congestion control ซึ่งระบบนี้จะลดความเร็วในการส่งข้อมูลลงเมื่อ network มีความคับคั่ง และยังทำงานแบบ Connectionless คือไม่มีการเริ่ม Connection ระหว่าง Host ต้นทางและปลาย หรือที่เรียกว่า 3 Way handshake
จากคุณสมบัติเหล่านี้ จึงเหมาะที่จะนำมาใช้กับ Application ที่มีลักษณะเป็น Real-time ที่ต้องการอัตรา delay ของข้อมูลต่ำ แต่ยอมรับข้อมูลที่ผิดพลาดได้ระดับหนึ่ง เช่น Streaming media และ Internet phone เป็นต้น
การทดลองใน Lab นี้ ก็จะศึกษาถึงโครงสร้างของ UDP ว่าประกอบด้วยอะไรบ้าง โดยการดักจับ UDP packet อะไรก็ได้ และที่ผมเลือกก็คือ DNS query และ response ซึ่งทำงานอยู่บน UDP เช่นกัน ได้ผลการทดสอบอย่างไร ติดตามอ่านได้เลยครับ
1. จำนวน field ใน UDP header มีจำนวนเท่าไร อะไรบ้าง (ห้ามเปิดดูหนังสือ) มีทั้งหมด 4 field ดังนี้

2. ระบุขนาดของ header field แต่ละตัว

3. ขนาดที่ระบุใน Length field เป็นขนาดของอะไร พิสูจน์คำตอบของคุณจาก UDP packet ที่เลือก
เป็นขนาดของ UDP header รวมกับข้อมูล แสดงว่าค่าใน Length อย่างน้อยๆ จะต้องมีขนาด 8 Byte จากตัวอย่าง ส่วนของข้อมูล นั่นก็คือ DNS response มีขนาด 223 Byte เมื่อรวมกับขนาดของ UDP header อีก 8 Byte จะได้เท่ากับ 231 Byte ตามบรรทัดที่ 39 พอดี
4. จำนวน byte สูงสุดที่ UDP สามารถบรรจุได้เป็นเท่าไร
Length ของ UDP มีขนาด 16 bit ดังนั้นจึงเก็บจำนวน byte ได้สูง 65535 byte ลบกับขนาด UDP header 8 byte ได้เท่ากับ 65527 byte แต่ IP packet ที่จะบรรจุ UDP packet อีกครั้งหนึ่ง ก็รองรับได้สูงสุด 65535 byte เช่นกัน จึงต้องลบกับ IP header อีก 20 byte ดังนั้น ขนาดสูงสูดที่ UDP รับได้ คือ 65507 byte
5. จำนวนสูงสุดที่เป็นไปได้ของ Port number ต้นทาง เป็นเท่าไร
Header Source port: มีขนาด 2 Byte จึงมีค่าได้สูง 65535 หมายเลข ดังนั้น port ที่เป็นไปได้ทั้งหมดคือ 0-65535 และ port สูงสุดก็คือ port ที่ 65535 นั่นเอง
6. Protocol number สำหรับ UDP คืออะไร บอกเป็นเลขฐาน 16 และฐาน 10 (สามารถดูได้จาก IP header)
Protocol number ก็คือตัวเลขที่ใช้ระบุถึง Protocol ที่ IP packet จะส่งข้อมูลถึง ซึ่งสามารถดูได้จาก header ของ Internet Protocol (IP) ในบรรทัดที่ 32 จาก UDP packet ที่เลือก จะมี Protocol number ในเลขฐาน 16 คือ 0×11 และในเลขฐานสิบ คือ 17
7. ค้น UDP จาก google และดูว่า field ใดที่ถูกนำไปคำนวณเป็น UDP checksum
องค์ประกอบที่นำมาใช้ในการคำนวณ Checksum ประกอบด้วย 3 องค์ประกอบ ดังนี้

8. พิจารณาคู่ของ UDP packet ที่ถูกส่งและรับ แล้วอธิบายความสัมพันธ์ระหว่าง port number ใน 2 packet
หมายเลข Port ปลายทางเป็นค่าที่ระบุถึงชนิดของ process ที่ต้นทางต้องการติดต่อ ส่วนหมายเลข port ต้นทางระบุเพื่อให้ฝั่งปลายทางสามารถตอบกลับไปยัง process ของต้นทางได้ถูกต้อง ซึ่งการเลือกหมายเลข port ต้นทางจะไม่สัมพันธ์กับชนิดของโปรแกรม จากตัวอย่าง packet จะเห็นว่า DNS query มี port ต้นทางเป็น 49839 ตามบรรทัดที่ 10 และมี port ปลายทาง คือ 53 ตามบรรทัดที่ 11 ซึ่งเป็น well-know port ที่ใช้กับบริการ DNS และเมื่อดูที่ DNS response จะมี port ต้นทางเป็น 53 ตามบรรทัดที่ 37 และจะต้องมี port ปลายทางเป็น 49839 ตามบรรทัดที่ 38 ซึ่งเป็น port ต้นทางที่อยู่ใน DNS query นั่นเอง
9. จับภาพหน้าจอ UDP packet ขนาดเล็กๆ และแสดงวิธีการคำนวน checksum เป็นขั้นตอน และอธิบาย
วิธีการคำนวณ โดยนำข้อมูลที่เกี่ยวข้องทั้งหมดตามข้อที่ 7 มาบวกกันทีละ 16 bit ถ้าครั้งสุดท้ายมีข้อมูลไม่ครบ 16 bit ให้เติม 0 ต่อท้ายจนครบ เมื่อได้ผลบวก ก็จะนำมาทำ one’s complements หรือสลับ bit 0 เป็น 1 และสลับ 1 เป็น 0 แล้วนำค่าที่ได้นี้ไปเก็บใน field Checksum เมื่อฝั่งรับได้รับ UDP packet ก็จะนำข้อมูลชุดเดียวกันมาบวกกับข้อมูลใน Checksum ที่ละ 16 bit เช่นกัน ถ้าผลบวกเป็น 1 ทั้งหมด แสดงว่าไม่มีข้อผิดพลาดเกิดขึ้น ดังตัวอย่างที่ผมจะแสดงต่อไปนี้ครับ
ผมจะยกข้อมูลมาบางส่วนเท่านั้นนะครับ (ถ้าเอาทั้งหมดตั้ง สองร้อยกว่า Byte คิดไม่ไหวครับ) โดยผมจะเอาเฉพาะข้อมูลในส่วน UDP header ดังนี้

นำข้อมูลทีละ 16 bit มาบวกกัน

ดังนั้น Checksum ที่ได้ คือ 00111100 00110100 นั่นเอง และเมื่อถึงฝั่งรับก็จะนำข้อมูลชุดเดียวกันมาบวกกับ Checksum ถ้าค่าที่ได้เป็น 1 ทั้งหมด แสดงว่าข้อมูลถูกต้อง ดังตัวอย่าง

ได้ผลลัพธ์เป็น 1 ทั้งหมด แสดงว่าข้อมูลที่ส่งมีความถูกต้อง
ใน Lab นี้ก็คงจะจบเพียงเท่านี้ ส่วนในเรื่องการคำนวณ Checksum นั้น ผมยังไม่แน่ใจว่าข้อมูลที่ผมนำมาคำนวณนั้น ถูกต้องหรือไม่ ถ้าเพื่อนๆ คนไหนรู้วิธีการที่แตกต่างไปจากผม ก็มา Comment แลกเปลี่ยนความรู้กันได้ครับ

 Download

 

CAST

Mr.CHAIMARD KAMA