บทความนี้ต้องการตรวจสอบความถูกต้องจากผู้เชี่ยวชาญในเรื่องนั้น ๆ โปรดเพิ่มพารามิเตอร์ reason หรือ talk ลงในแม่แบบนี้เพื่ออธิบายปัญหาของบทความ |
Session Initiation Protocol (SIP) คือ โพรโทคอลหรือเกณฑ์วิธีเพื่อใช้งานด้านมัลติมีเดีย เช่น การส่งข้อมูลเสียงหรือวิดีโอบนเครือข่าย IP ได้รับการพัฒนาโดย IETF และ SIP ถือว่าเป็นโพรโทคอลที่เหนือกว่าโพรโทคอลอื่นในแง่ของการที่สามารถปรับใช้และนำไปพัฒนาได้ง่ายกว่า โดยตัวโพรโทคอลเองมีความสามารถในการสร้าง (create) , ปรับ (modify) และ ยกเลิก (terminate) การติดต่อสื่อสารระหว่างโหนดที่เป็นแบบหนึ่งต่อหนึ่ง (unicast) หรือแบบกลุ่ม (multicast) ได้ ซึ่ง SIP สามารถปรับเปลี่ยนที่อยู่ (address), หมายเลขพอร์ต, เพิ่มสายผู้สนทนา และสามารถเพิ่มหรือลดการส่งข้อมูลมิเดีย (media stream) บางประเภทได้ ตัวอย่างของโปรแกรมประยุกต์ (application) ที่อาศัย SIP ในการเชื่อมต่อ เช่น การประชุมด้วยวิดีโอ (video conferencing), การกระจายข้อมูลภาพและเสียง (streaming multimedia distribution), การส่งข้อความด่วน (instant messaging), การส่งไฟล์ (file transfer) และ เกมออนไลน์ เป็นต้น
SIP ถูกออกแบบโดยนาย Henning Schulzrinne และนาย Mark Handly ตั้งแต่ปี ค.ศ. 1996 โดยเวอร์ชันล่าสุดถูกประกาศใน RFC 3261 โดย IETF Network Working Group และในปี ค.ศ. 2000 SIP ได้ถูกใช้เป็นส่วนหนึ่งของระบบ IP Multimedia Subsystem (IMS) ของ 3GPP ซึ่งมาตรฐานการส่งสัญญาณมัลติมีเดียแบบ IP-based บนระบบ โทรศัพท์เคลื่อนที่ (cellular) อีกด้วย
โพรโทคอล SIP ทำงานอยู่บน Application Layer และถูกออกแบบโดยไม่คำนึงถึงชนิดของ Transport Layer ที่ใช้ในการส่งข้อมูล SIP สามารถทำงานบน Transmision Control Protocol (TCP), User Datagram Protocol (UDP), หรือ Stream Control Transmission Protocol (SCTP) ได้ โพรโทคอล SIP ทำงานในลักษณะ text-based ซึ่งมีลักษณะการทำงานคล้าย Hypertext Transfer Protocol (HTTP) และ Simple Mail Transfer Protocol (SMTP)
โพรโทคอล SIP ถูกออกแบบมาคล้ายกับโพรโทคอล HTTP ในส่วนของการร้องขอและการตอบรับ (request/response) ระหว่างลูกข่าย (client) ซึ่งเป็นผู้เริ่มต้นการเชื่อมต่อ โดยส่งการร้องขอ (request) การทำงานบางอย่างกับเครื่องแม่ข่าย (server) และ SIP ยังใช้ข้อมูล header, กฎการเข้ารหัส และหมายเลขสถานะ (status codes) เหมือนกับ HTTP อีกด้วย
ในการส่งสัญญาณมีเดีย SIP จะต้องทำงานร่วมกับโพรโทคอลอื่น ๆ ในการส่งสัญญาณ แต่ SIP เท่านั้นที่จะถูกใช้เป็นตัวเริ่มต้นการสื่อสาร (communication session) โดยปกติ SIP ฝั่งลูกข่าย (client) จะใช้โพรโทคอล TCP หรือ UDP พอร์ตหมายเลข 5060 หรือ 5061 ในการเชื่อมต่อกับเครื่องแม่ข่าย (server) หรือ SIP endpoint โดยพอร์ตหมายเลข 5060 จะใช้ในการส่งสัญญาณแบบไม่เข้ารหัส (non-encrypted signaling traffic) ส่วนพอร์ตหมายเลข 5061 จะใช้ในกรณีที่มีการส่งสัญญาณแบบเข้ารหัส และจะทำงานร่วมกับ Transport Layer Security (TLS) อีกที โดยหลัก ๆ แล้ว SIP จะทำหน้าที่ติดต่อหรือยกเลิกการส่งสัญญาณเสียงหรือภาพวิดีโอ ซึ่งในโปรแกรมประยุกต์หลายชนิดจะใช้ SIP ในการส่งข้อมูลมิเดียเช่น โปรแกรม instant messaging ที่สามารถส่งภาพและเสียงพร้อมกันได้ นอกจากนี้ยังมีเอกสารหลากหลายฉบับที่เกี่ยวข้องกับ SIP ซึ่งถูกประกาศโดย IETF เช่น Real-time Transport Protocol (RTP), Session Description Protocol (SDP) โดย SDP จะถูกใช้ร่วมกับ SIP สำหรับการทำข้อตกลง (negotiate) รูปแบบตัวแปรที่ใช้ในการเชื่อมต่อข้อมูลมิเดีย เช่น หมายเลขพอร์ต, โพรโทคอล, การเข้ารหัสสัญญาณมิเดีย (codecs) โดยข้อมูลของ SDP เหล่านี้จะถูกส่งภายใต้ข้อมูลของ SIP packet body อีกที
เป้าหมายในการออกแบบโพรโทคอล SIP ก็เพื่อใช้เป็นมาตรฐานในการเริ่มต้นการส่งสัญญาณโทรศัพท์ (signaling and call setup protocol) บนเครือข่ายแบบ IP-based และสามารถทำงานร่วมกับ public switched telephone network (PSTN) ที่มีอยู่เดิมได้ทันที และ SIP ถูกออกแบบมาโดยอ้างอิงถึงการเชื่อมต่อกันระว่าง proxy server และ user agents เพื่อให้มีลักษณะคล้ายกับการทำงานของโทรศัพท์มากที่สุด เช่น การส่งหมายเลข (dialing a number), การส่งสัญญาณกระดิ่ง (ringing), การส่งสัญญาญรอการเชื่อมต่อ (ring back) และการส่งสัญญาณสายไม่ว่าง (busy tone)
โพรโทคอล SIP ยังเพิ่มความสามารถพิเศษให้กับโพรโทคอล Signaling System 7 (SS7) อีกด้วย ถึงแม้ทั้งสองโพรโทคอลจะทำงานแตกต่างกันมาก เพราะ SS7 เป็นโพรโทคอลที่ทำงานอยู่บนแกนกลางของระบบเครือข่ายที่เชื่อมต่อกับเครื่องลูกข่ายจำนวนมาก ซึ่งจะแตกต่างกับ SIP ที่เป็นโพรโทคอลที่ทำงานแบบ peer-to-peer ที่ทำงานระหว่าง endpoint กับ endpoint
ถึงแม้ว่าจะมีโพรโทคอลหลากหลายที่ใช้งานบน VoIP signaling protocols แต่ SIP ยังเป็นที่นิยมในการสื่อสารแบบ IP community มากกว่า telecommunications industry นอกจาก SIP แล้วยังมีโพรโทคอล H.323 ของ International Telecommunication Union (ITU) ที่ทำงานลักษณะเดียวกันอีกด้วย
เอกสารการทำงานของ SIP เวอร์ชัน 2.0 ประกาศครั้งแรกใน RFC 2543 และถูกปรับปรุงอีกครั้งใน RFC 3261
โดยทั่วไปจะที่ไม่กำหนดตายตัวว่า UA ใดต้องเป็น UAC หรือ UAS ตลอดเวลาขึ้นอยู่กับเซสชั่นนั้นว่าทำหน้าที่อะไร
Alice Bob | | | 1. INVITE | |- ---------------------->| | 2. 180 Ringing | | <-----------------------| | | | 3. 200 OK | | <-----------------------| | 4. ACK | |- ---------------------->| | RTP Media | | <============>| | | | 5. BYE | | <----------------------- | | 6. 200 OK | |- ----------------------> | | |
site-a.com............site-b.com . proxy proxy . . . John's .......................................................... Bob's softphone SIP Phone | | | | John | 1. INVITE | | | เริ่มต้นโทรออก |-----------------> | 2. INVITE | | | 3. 100 Trying |---------------> | 4. INVITE | | <---------------- | 5. 100 Trying |----------------> | | |<-------------- | 6. 180 Ringing | Bob John | | 7. 180 Ringing |<---------------- | ได้ยินสัญญาณโทรเข้า ได้ยิน Ringback tone | 8. 180 Ringing |<--------------- | 9. 200 OK | หรือ Music on hold |<--------------- | 10. 200 OK |<--------------- | Bob รับสาย | 11. 200 OK |<--------------- | | | <--------------- | | | | 12. ACK F12 | |- -------------------------------------------------------> | | RTP Media Session | สนทนา |<==============================> | สนทนา | 13. BYE | | <-------------------------------------------------------- | Bob วางหู | 14. 200 OK | John วางหู |--------------------------------------------------------> | | |
INVITE sip:junk@realm SIP/2.0 Route: <sip:192.168.0.79;lr> Via: SIP/2.0/UDP 192.168.0.200:5060;branch=z9hG4bKrfpISNp7Z6jqn From: sip:[email protected];tag=aEJISW8Nwm To: sip:junk@realm Supported: 100rel, sec-agree Contact: sip:[email protected] CSeq: 5714 INVITE Call-ID: 34VISPImLSPTBk0OgCZ3lgbCyjup48 s: subject Max-Forwards: 70 Content-Type: application/sdp Content-Length: 157 v=0 o=original 3326093141 3326093142 IN IP4 192.168.0.200 s=SipSession c=IN IP4 192.168.0.200 t=0 0 m=application 49152 TCP Chipflip a=direction:both
1xx: การร้องขอและจัดเตรียมทรัพยากรของระบบ (Provisional)
Code | Description | References |
---|---|---|
100 | Trying. | RFC 3261 |
180 | Ringing. | RFC 3261 |
182 | Queued. | RFC 3261 |
183 | Session progress. | RFC 3261 |
2xx:การตอบกลับการร้องขอว่ากระทำสำเร็จ (Success)
Code | Description | References |
---|---|---|
200 | OK. | |
202 | Accepted. | RFC 3265 |
204 | No Notification. |
3xx: การส่งต่อและการร้องขอเพิ่มเติมเพื่อทำให้การร้องขอสมบูรณ์ (Redirection)
Code | Description | References |
---|---|---|
300 | Multiple choices. | RFC 3261 |
301 | Moved permanently. | |
302 | Moved temporarily. | |
305 | Use proxy. | |
380 | Alternative service. |
4xx: การตอบกลับข้อผิดพลาดที่เกิดจากไคลเอนต์ (Client error)
Code | Description | References |
---|---|---|
400 | Bad request. | |
401 | Unauthorized. | |
402 | Payment required. | |
403 | Forbidden. | |
404 | Not found. | |
405 | Bad request. | |
406 | Not acceptable. | |
407 | Proxy authentication required. | |
408 | Request timeout. | |
410 | Gone. | |
412 | Conditional request failed. | RFC 3903 |
413 | Request entity too large. | |
414 | Request-URI too long. | |
415 | Unsupported media type. | |
416 | Unsupported URI scheme. | |
417 | Unknown Resource-Priority. | RFC 4412 |
420 | Bad extension. | |
421 | Extension required. | |
422 | Session Interval too small. | RFC 4028 |
423 | Interval too brief. | |
428 | Use Identity Header. | RFC 4474 |
429 | Provide referrer identity. | RFC 3892 |
433 | Anonymity Disallowed. | RFC 5079 |
436 | Bad Identity-Info. | RFC 4474 |
437 | Unsupported Certificate. | RFC 4474 |
438 | Invalid Identity Header. | RFC 4474 |
439 | First Hop Lacks Outbound Support. | RFC 5626 |
440 | Max-Breadth Exceeded. | RFC 5393 |
470 | Consent needed. | RFC 5360 |
480 | Temporarily unavailable. | |
481 | Call/Transaction does not exist. | |
482 | Loop detected. | |
483 | Too many hops. | |
484 | Address incomplete. | |
485 | Ambiguous. | |
486 | Busy here. | |
487 | Request terminated. | |
488 | Not acceptable here. | |
489 | Bad event. | RFC 3265 |
491 | Request pending. | |
493 | Undecipherable. | |
494 | Security agreement required. | RFC 3329 |
5xx: การตอบกลับข้อผิดพลาดที่เกิดจากเครื่องแม่ข่าย (Server error)
Code | Description | References |
---|---|---|
500 | Server internal error. | RFC 3261 |
501 | Not implemented. | |
502 | Bad gateway. | |
503 | Service unavailable. | RFC 3261 |
504 | Server timeout. | |
505 | Version not supported. | |
513 | Message too large. | |
580 | Precondition Failure. | RFC 3312 |
6xx: การร้องขอไม่สามารถดำเนินการได้ (Global failure)
Code | Description | References |
---|---|---|
600 | Busy everywhere. | |
603 | Decline. | |
604 | Does not exist anywhere. | |
606 | Not acceptable. |
use Net::SIP;
my $ua = Net::SIP::Simple->new ( outgoing_proxy => '192.168.0.10', registrar => '192.168.0.10', domain => 'example.com', from => 'me', auth => , );
$ua->register;
$ua->invite ('you', init_media => $ua->rtp ('send_recv', 'announcement.pcmu-8000' ), asymetric_rtp => 1, );
$ua->loop;