วันพุธที่ 25 กรกฎาคม พ.ศ. 2555

SIP

บทนำ

SIP เป็นโปรโตคอลที่ใช้ Create, Modify และ Terminate Session ในการติดต่อสื่อสาร ซึ่งมีการนำไปใช้ใน Internet Telephone Call, Multimedia Distribution, และ Multimedia Conference โปรโตคอลนี้ออกแบบโดย Henning Schulzrinne จากมหาวิทยาลัยโคลัมเบียและ Mark Handley จากมหาวิทยาลัยลอนดอนในปี 1996 (พ.ศ.2539) ต่อมาในเดือนพฤศจิกายนปี 2000 (พ.ศ.2543) ก็ได้รับการยอมรับจาก 3GPP และกลายเป็นส่วนหนึ่งของสถาปัตยกรรม IMS (IP Multimedia Subsystem), Voice over IP รวมถึง H.323 และอื่น ๆ

IMS เป็นแนวคิดเกี่ยวกับสถาปัตยกรรมของการให้บริการ IP Multimedia แก่ผู้ใช้ ซึ่งเป็นส่วนหนึ่งในการพัฒนาเครือข่ายมือถือของ GSM โดยเริ่มมาจาก 3GPP R5 นำเสนอวิธีส่ง Internet Services ผ่าน GPRS ต่อมาได้มีการปรับปรุงโดย 3GPP, 3GPP2, และ TISPAN เพื่อให้ครอบคลุมถึง Wireless LAN, CDMA2000, และ Fix Line โดยนำโปรโตคอลของ IETF มาใช้ เช่น SIP

SIP จะมีลักษณะทั่วไปคือ
- ขนาดเล็ก เพราะกำหนดวิธีติดต่อไว้เพียง 6 วิธีเพื่อลดความซับซ้อน
- มีความเป็นอิสระ สามารถใช้งานกับ UDP, TCP, ATM และอื่น ๆ ได้
- เป็นข้อความที่มนุษย์สามารถอ่านได้

การออกแบบโปรโตคอล

SIP client จะใช้ TCP หรือ UDP พอร์ต 5060 เชื่อมต่อกับ SIP server และ SIP อื่น ๆ ซึ่ง SIP จะใช้สำหรับตั้งค่าและยกเลิก Voice หรือ Video call แต่ก็สามารถนำไปใช้กับงานกับระบบอื่นที่ต้องการเปิด Session รวมถึง Event Subscription และ Notification ได้ การสื่อสารโดยใช้ภาพและเสียงสามารถทำได้โดยแบ่งโปรโตคอล Session ออกจากกัน เช่น RTP (Real-time Transport Protocol)

RTP ใช้กำหนดรูปแบบ packet ในการส่งภาพและเสียงผ่านอินเตอร์เน็ต ถูกพัฒนาโดย Audio-Video Transport Working Group ของ IETF และได้ตีพิมพ์ครั้งแรกในปี 1996 (พ.ศ.2539) โดย RTP จะไม่มีพอร์ต TCP หรือ UDP มาตรฐานในการสื่อสาร แต่จะใช้พอร์ต UDP ที่เป็นเลขคู่ในการสื่อสารและพอร์ต UDP เลขคี่ถัดไปเป็น RTP Control Protocol (RTCP) เลขพอร์ตมักจะอยู่ระหว่าง 16384-32767 RTP สามารถรับส่งข้อมูลอะไรก็ได้แบบ real-time เช่น ภาพและเสียง โดยใช้โปรโตคอล SIP ในการตั้งค่าและยกเลิก

SIP จะเป็นโปรโตคอลที่ใช้ส่งสัญญาณและตั้งค่าในระบบ IP สามารถใช้งานร่วมกับระบบโทรศัพท์ PSTN (Public Switched Telephone Network) ได้ ซึ่งมาตรฐาน SIP ไม่ได้ระบุไว้ SIP ทำได้เพียงสางสัญญาณและตั้งค่า อย่างไรก็ตาม SIP สามารถใช้งานในระบบเครือข่ายได้ เช่น Proxy Server และ User Agent ซึ่งจะเหมือนกับการทำงานของโทรศัพท์ คือ หมุนเบอร์, ทำให้โทรศัพท์ปลายทางส่งเสียง, ฟังเสียงตอบรับหรือสัญญาณไม่ว่าง

SIP ทำให้ระบบโทรศัพท์มีความสามารถในขั้นตอนโทรออกมากขึ้น ดูได้จาก Signalling System 7 (SS7) โดย SS7 จะเป็นโปรโตคอลที่รวมศูนย์, ใช้กับระบบรวมศูนย์ที่ซับซ้อน, และใช้งานกับเครื่องลูกข่ายที่ไม่เก่ง (โทรศัพท์บ้าน) SIP เป็นโปรโตคอลแบบ Peer-to-Peer ซึ่งใช้กับเครือข่ายที่ไม่ซับซ้อนและเครื่องลูกค้ามีความสามารถสูง

แม้ VoIP จะมีโปรโตคอลส่งสัญญาณเยอะอยุ่แล้ว แต่ SIP ก็ช่วยสร้างเครื่องหลักในการสื่อสารแบบ IP ได้มากกว่าระบบโทรคมนาคม SIP จะเป็นมาตรฐานของ IETF ขณะที่ H.323 เป็นโปรโตคอลของ ITU ซึ่งทั้งสององค์กรก็ให้เกียรติกัน

SIP สามารถทำงานร่วมกับโปรโตคอลอื่นได้โดยจะสร้างสัญญาณให้ Session ของการติดต่อสื่อสาร SIP จะทำงานเป็นพาหะของ Session Description Protocol (SDP) ใช้อธิบายรายละเอียดของเนื้อหาที่จะส่ง เช่น หมายเลขพอร์ตที่ใช้, Codec ที่ต้องการ

SIP จะคล้ายกับ HTTP เช่น การรับส่งข้อมูลใช้ภาษาที่มนุษย์อ่านได้, รหัสบอกสถานะจะคล้าย ๆ กัน บางคนกล่าวว่า SIP เป็นโปรโตคอลแบบ stateless ซึ่งสามารถตรวจสอบความผิดพลาดและเพิ่มเติมความสามารถได้มากกว่าโปรโตคอลแบบ stateful ซึ่งโปรโตคอลแบบ stateless จะส่งคำสั่งได้อย่างอิสระ โดยไม่ต้องสนใจว่าคำสั่งก่อนหน้าคือคำสั่งอะไร ในขณะที่โปรโตคอลแบบ stateful จะต้องมีการบันทึกสถานะการแลกเปลี่ยนข้อมูลไว้ตลอดเวลา


ส่วนประกอบของเครือข่าย SIP

Hardware ที่ใช้จะเหมือนกับโทรศัพท์บ้าน แต่ใช้ SIP และ RTP ในการสื่อสาร บางระบบจะใช้ Electronic Numbering (ENUM) หรือ DUDi ในการแปลงหมายเลขโทรศัพท์ให้เป็น SIP Address แล้วเรียก SIP อื่นในระบบเครือข่าย

ตัวอย่างโปรแกรมในปัจจุบันที่ใช้ SIP สื่อสาร เช่น Microsoft Windows Messenger, iChat AV, AIM ของ Apple ซึ่ง SIP จะอาศัย Proxy และอุปกรณ์เครือข่ายเพื่อทำงานแบบ peer-to-peer เหมือนระบบทั่วไป

SIP Request

RFC 3261 (SIP) มี 6 แบบ ได้แก่
- INVITE ใช้เมื่อ client ต้องการสร้าง session เพื่อติดต่อ
- ACK ใช้เมื่อ client ได้รับการตอบกลับจาก INVITE ภายในเวลาที่กำหนด
- BYE ใช้เมื่อต้องการสิ้นสุดการเชื่อมต่อ ซึ่งผู้ส่งและผู้รับสามารถส่งได้เหมือนกัน
- CANCEL ใช้เพื่อยุติการค้นหา แต่ไม่สามารถใช้ยกเลิกสายที่รับแล้วได้
- OPTIONS ใช้ตรวจสอบคุณสมบัติของ Server
- REGISTER ใช้ระบุ Address ของข้อมูล To ใน SIP Server

RFC 3262 เพิ่มความน่าเชื่อถือในการตอบกลับของ SIP
- PRACK

RFC 3265 เพิ่มเติม
- SUBSCRIBE แจ้ง Event ของ Notification จากผู้แจ้ง
- NOTIFY แจ้งเหตุการณ์ใหม่

SIP Response

1xx ข้อมูลการตอบกลับ
- 100 กำลังพยายาม
- 180 กำลังเรียก (ring)
- 181 กำลัง forward
- 182 กำลังเข้าคิว
- 183 ความคืบหน้าของ session

2xx ได้รับการตอบกลับ
- 200 OK
- 202 ตกลง

3xx Redirect
- 300 มีหลายตัวเลือก
- 301 ย้ายเป็นการถาวร
- 302 ย้ายเป็นการชั่วคราว
- 305 ใช้ Proxy
- 380 บริการเสริม

4xx การตอบกลับล้มเหลว
- 400 คำสั่ง Request ไม่ถูกต้อง
- 401 ไม่ได้รับสิทธิ ใช้กับ registrar เท่านั้น ส่วน Proxy ใช้ 407
- 402 ต้องจ่ายเงิน (สงวนไว้ใช้ในอนาคต)
- 403 ซ่อน
- 404 ไม่พบ ไม่มีผู้ใช้ชื่อนี้
- 405 ไม่อนุญาตให้ใช้วิธีนี้
- 406 ไม่สามารถรับได้
- 407 ไม่ได้รับสิทธิจาก Proxy
- 408 หมดเวลา ไม่สามารถค้นหาผู้ใช้ได้ในเวลาที่กำหนด
- 410 ไม่สามารถติดต่อผู้ใช้ได้ ณ เวลานี้
- 413 คำสั่ง Request ยาวเกินไป
- 414 Request-URI ยาวเกินไป
- 416 ไม่สนับสนุน URI แบบนี้
- 420 Server ไม่เข้าใจโปรโคตอ SIP ที่ส่งมา
- 421 ต้องการข้อมูลเพิ่มเติม
- 423 ช่วงเวลาน้อยเกินไป
- 479 ไม่สามารถใช้ URI นี้ได้
- 480 ปิดบริการชั่วคราว
- 481 ติดต่อไม่ได้
- 482 เกิดการวน loop
- 483 เชื่อมต่อมากเกินไป
- 484 Address ไม่ถูกต้อง
- 485 สับสน
- 486 สายไม่ว่าง
- 487 ยุติการร้องขอ
- 488 ไม่ได้รับ
- 489 เหตุการณ์ไม่ถูกต้อง
- 491 ยุติการร้องขอ
- 493 ไม่ถูกกฎ ไม่สามารถถอดรหัส S/MIME ได้
- 494 ต้องการความปลอดภัย

5xx server มีปัญหา
- 500 server มีปัญหาภายใน
- 501 ยังไม่เปิดใช้วิธีนี้
- 502 Gateway ไม่ถูกต้อง
- 503 ไม่สามารถให้บริการได้
- 504 หมดเวลาติดต่อ Server
- 505 Server ไม่สนับสนุนโปรโคตอล SIP รุ่นนี้
- 513 ข้อความยาวเกินไป

6xx ความล้มเหลว
- 600 ยุ่งตลอดเวลา
- 603 ไม่รับ
- 604 ไม่อยู่ตลอดเวลา
- 606 ไม่ยอมรับ

อื่น ๆ เช่น
- INFO ส่งข้อมูลโดยไม่แก้ไข Session State
- REFER ใช้กับ call transfer
- MESSAGE ข้อความที่ต้องการส่ง
- UPDATE ส่งข้อมูลเพื่อแก้ไข Session State แต่ไม่เปลี่ยนสถานะการทำงาน

ตัวอย่าง SIP Request

REGISTER sip:seberino@switch-2.nufone.net SIP/2.0
Via: SIP/2.0/UDP 66.159.194.51:5060
CSeq: 3363 REGISTER
To: sip:seberio@switch-2.nufone.net
Expires: 900
Call-ID: 401507385@66.159.194.51
User-Agent: Shtoom/0.3alpha0
Contact: <sip:seberino@66.159.194.51:5060>
Contact-Length: 0


ตัวอย่างภาษา Perl
use Net::SIP;

  # create new agent
  my $ua = Net::SIP::Simple->new(
                outgoing_proxy => '192.168.0.10',
                registrar => '192.168.0.10',
                domain => 'example.com',
                from => 'me',
                auth => [ 'me','secret' ],
  );

  # Register agent
  $ua->register;

  # Invite other party, send anncouncement once connected
  $ua->invite( 'you',
                init_media => $ua->rtp( 'send_recv', 'announcement.pcmu-8000' ),
                asymetric_rtp => 1,
  );

  # Mainloop
  $ua->loop;




ตัวอย่างการใช้งานใน ภาษา Java



http://www.javaworld.com/javaworld/jw-06-2006/jw-0619-sip.html



-------------------------------------------------------