SIP คืออะไร? คู่มือโปรโตคอล SIP ฉบับวิศวกร

เผยแพร่ 2026-05-07อัปเดต 2026-09-26 36 นาทีSIPPER Team

SIP (Session Initiation Protocol, RFC 3261) คือโปรโตคอล Signalling ระดับ Application Layer สำหรับสร้าง ปรับเปลี่ยน และยุติ Session แบบ Real-time เช่น เสียงและวิดีโอบน IP Network บทความนี้อธิบายว่า SIP ทำงานร่วมกับ SDP และ RTP อย่างไร ข้อความ Transaction และ Dialog เชื่อมโยงกันแบบไหน การลงทะเบียน การยืนยันตัวตน NAT และความปลอดภัยทำงานอย่างไร และวิธีไล่แก้ปัญหาสายจริงทีละชั้น

แยกชั้นก่อนวิเคราะห์ SIP: กรอบคิดสำหรับการแก้ปัญหา

ตัวอย่างเคสที่พบบ่อยในองค์กร: Extension 1001 ลงทะเบียนสำเร็จ รับสายเข้าได้ ผู้ใช้ได้ยินเสียงปลายทางชัดเจน แต่ฝั่งผู้โทรกลับไม่ได้ยินอะไรเลย สถานะการลงทะเบียนอธิบายอาการนี้ไม่ได้ เพราะ REGISTER ที่สำเร็จพิสูจน์เพียงว่า Signalling ของ SIP ไปถึง Registrar ได้ ไม่ได้บอกว่า RTP ถูกส่งไปที่ไหน Firewall ยอมให้ผ่านหรือไม่ หรือปลายทางถอดรหัสเสียงได้หรือเปล่า

SIP แยกการควบคุม Session ออกจากตัว Media ข้อความ SIP ใช้ตกลงว่าใครคุยกับใครและใช้คำอธิบาย Media แบบใด ส่วน SDP ที่อยู่ใน Body ของข้อความระบุที่อยู่ Port และ Codec จากนั้น RTP จึงส่งเสียงจริงแยกออกไป และบ่อยครั้งใช้เส้นทางเครือข่ายต่างจาก Signalling ปัญหาในชั้นหนึ่งจึงอาจดูเหมือนปัญหาของอีกชั้น หากไม่ตรวจแต่ละชั้นด้วยหลักฐานของชั้นนั้นเอง

แบบจำลองที่ใช้งานได้จริงแบ่งเป็น 4 ชั้น ชั้น Connectivity ครอบคลุม IP Routing การ Resolve DNS, Transport ที่เลือกใช้ (UDP, TCP, TLS หรือ WebSocket) และ State ของ Firewall ชั้น Signalling ครอบคลุม Request, Response, Transaction และ Dialog ชั้น Session Description ครอบคลุม SDP ได้แก่ Connection Address, Media Port, Payload Format และ Direction Attribute ส่วนชั้น Media และ Application ครอบคลุมการส่ง RTP/RTCP, Packet Loss, Jitter, การถอดรหัส และสิ่งที่ผู้ใช้ได้ยินจริง

บันทึกการวิเคราะห์ที่ดีควรเขียนเป็นข้อเท็จจริงรายชั้น ไม่ใช่ข้อสรุป เช่น INVITE ได้รับ 200 OK และปลายทางได้รับ ACK ที่ตรงกันแล้ว SDP Answer เลือก PCMA (Payload 8) ที่ 198.51.100.20:41000 RTP จาก 198.51.100.20 ไปถึง 192.0.2.10 แต่ RTP จาก 192.0.2.10 ไม่ผ่าน Firewall ของสาขาไปถึง 198.51.100.20 บันทึกลักษณะนี้ชี้ไปยังอุปกรณ์ที่ต้องแก้ได้ทันที

ภาพรวมที่แยก Signalling ของ SIP ออกจาก Media ของสายสนทนา
ภาพที่ 01: SIP ใช้เจรจาและควบคุม Session ส่วน RTP ส่งเสียงของสายเป็นอีก Flow หนึ่งแยกกัน

บทบาทของโปรโตคอล: SIP, SDP, RTP และ RTCP ในสาย VoIP

คำเหล่านี้มักถูกใช้ปนกันในเอกสารการขาย แต่แต่ละคำหมายถึงคนละชั้น VoIP คือแนวทางการส่งเสียงผ่าน IP โดยรวม SIP (RFC 3261) คือโปรโตคอลควบคุม SDP (RFC 8866) คือรูปแบบข้อความที่ใช้อธิบาย Media และ RTP (RFC 3550) คือโปรโตคอลที่ขนเสียงดิจิทัล ส่วน SIP Trunk คือบริการหรือการเชื่อมต่อที่ใช้ SIP ระหว่างระบบโทรศัพท์ ซึ่งส่วนใหญ่เป็นการเชื่อม PBX ขององค์กรกับผู้ให้บริการที่ต่อออกโครงข่ายโทรศัพท์สาธารณะ

หลักคิดคือ SIP ประสาน Session, SDP อธิบายพารามิเตอร์ของ Media และ RTP ขนเสียง เมื่อเป็นคนละ Flow ข้อความ SIP อาจผ่าน Proxy หนึ่งตัวหรือมากกว่า ขณะที่ RTP วิ่งตรงระหว่าง Endpoint หรือผ่าน Media Relay เช่น SBC ขึ้นอยู่กับการออกแบบ ดังนั้นอย่าสันนิษฐานว่าเส้นทาง Signalling กับเส้นทาง Media เป็นเส้นทางเดียวกัน

ข้อความ SIP อาจวิ่งผ่าน Proxy ขณะที่ RTP วิ่งตรงระหว่าง Endpoint ในตัวอย่างนี้
ภาพที่ 02: ในตัวอย่างนี้ SIP วิ่งผ่าน Proxy ส่วน RTP วิ่งตรงระหว่าง Endpoint ทั้งสองฝั่ง
คำศัพท์คืออะไรไม่ใช่อะไร
SIPโปรโตคอล Signalling สำหรับสร้าง แก้ไข และยุติ Session (RFC 3261)ตัวส่งหรือตัวเล่นเสียง
VoIPการสื่อสารด้วยเสียงผ่าน IP Networkสิ่งที่ผูกกับโปรโตคอล Signalling ตัวเดียวแบบบังคับ
SIP Trunkการเชื่อมต่อด้วย SIP ระหว่าง PBX กับผู้ให้บริการหรือระบบอื่นวิธีลงทะเบียนหรือนโยบาย Codec แบบตายตัว
PBX, IP-PBX, Cloud PBXระบบโทรศัพท์ขององค์กร คำว่า IP บอกวิธีเชื่อมเครือข่าย ส่วน Cloud บอกว่าระบบทำงานที่ไหนสถาปัตยกรรม SIP แบบเดียวที่ตายตัว
SDPข้อความอธิบาย Media Session (RFC 8866) ใช้ร่วมกับโมเดล Offer/Answer (RFC 3264)ตัว Media Stream เอง
RTP และ RTCPการขนส่ง Media แบบ Real-time และโปรโตคอลควบคุม/รายงานคู่กัน (RFC 3550)การรับประกัน Bandwidth การส่งถึง หรือคุณภาพเสียง
SRTP และ SRTCPการเข้ารหัส ตรวจความถูกต้อง และกัน Replay ให้ RTP และ RTCP (RFC 3711)การเข้ารหัส Signalling ของ SIP
SBCฟังก์ชันควบคุมขอบเขต Session ซึ่งส่วนใหญ่ทำงานแบบ B2BUAผลิตภัณฑ์เดียวที่ใช้ได้ทุกกรณี หรือหลักประกันความปลอดภัยอัตโนมัติ
WebRTCสถาปัตยกรรมและชุดโปรโตคอลสื่อสาร Real-time บน Browserข้อบังคับให้ต้องใช้ SIP เป็น Signalling

องค์ประกอบของระบบ SIP: User Agent, Proxy, Registrar, B2BUA และ SBC

User Agent (UA) คือฟังก์ชันปลายทางเชิงตรรกะ ทำหน้าที่เป็น User Agent Client (UAC) เมื่อส่ง Request และเป็น User Agent Server (UAS) เมื่อรับ Request แล้วสร้าง Response บทบาทนี้กำหนดตาม Transaction ไม่ได้ผูกกับอุปกรณ์ โทรศัพท์ IP เครื่องเดียวเป็น UAC ตอนส่ง INVITE และเป็น UAS ตอนได้รับ BYE จากอีกฝั่งในภายหลัง

Proxy Server รับ Request แล้วส่งต่อไปยังเป้าหมาย โดยตัดสินเส้นทางจาก Request-URI นโยบาย และ DNS Proxy ไม่ได้เป็นผู้เริ่มหรือผู้รับสายเอง Proxy แบบ Stateful เก็บ State ของ Transaction และสามารถ Fork Request ไปหลาย Contact พร้อมกันได้ รวมถึงใส่ Header Record-Route เพื่อให้ Request ถัดไปใน Dialog ยังคงผ่าน Proxy ตัวนั้น

Registrar รับ Request ประเภท REGISTER แล้วเก็บ Binding ระหว่าง Address of Record (AoR) กับ Contact Address หนึ่งรายการหรือมากกว่าไว้ใน Location Service จากนั้น Proxy จะค้นหาจาก Location Service ว่าผู้ใช้ติดต่อได้ที่ใดในขณะนั้น ในผลิตภัณฑ์จำนวนมาก Registrar, Location Service และ Proxy รวมอยู่ใน Server เดียว แต่ใน RFC 3261 ถือเป็นบทบาทเชิงตรรกะที่แยกกัน

Back-to-Back User Agent (B2BUA) รับสายด้านหนึ่งในฐานะ UAS แล้วเริ่มสายใหม่อีกด้านในฐานะ UAC แต่ละด้านเป็น Dialog อิสระที่มี Call-ID, Tag และลำดับ CSeq ของตัวเอง IP-PBX และ Session Border Controller (SBC) มักทำงานแบบ B2BUA จึงซ่อนโครงสร้างเครือข่ายภายใน ปรับ Header ให้เข้ากันระหว่างผู้ผลิต บังคับใช้นโยบายการรับสายและป้องกันการฉ้อโกง และยึด (Anchor) หรือแปลง Codec ของ Media ได้เมื่อการออกแบบต้องการ

บทบาทที่ห้าคือ Redirect Server ซึ่งไม่ส่ง Request ต่อ แต่ตอบกลับด้วย Response กลุ่ม 3xx ที่ระบุ Contact ทางเลือกให้ผู้ส่งติดต่อเอง

Transport, การระบุที่อยู่ และการค้นหา Next Hop ด้วย DNS (RFC 3263)

SIP ทำงานได้บน UDP, TCP, TLS บน TCP, SCTP และ WebSocket (RFC 7118 สำหรับ Client บน Browser) Port มาตรฐานของ URI แบบ sip บน UDP หรือ TCP คือ 5060 และสำหรับ TLS คือ 5061 ค่าเหล่านี้ใช้เฉพาะเมื่อไม่ได้ระบุ Port ไว้ชัดเจน ระบบจริงจะใช้ Port อื่นก็ได้

Transport ที่เลือกมีผลกับ Signalling เท่านั้น การใช้ SIP บน TCP หรือ TLS ไม่ได้ย้าย RTP ไปใช้ TCP ด้วย Media ยังใช้ Transport ตามที่ SDP ระบุ ซึ่งสำหรับ RTP/AVP และ RTP/SAVP คือ UDP เช่นเดียวกับ Client แบบ WebRTC ที่ส่ง SIP ผ่าน Secure WebSocket ก็ยังส่ง Media ผ่าน Flow แบบ DTLS-SRTP แยกต่างหาก ไม่ได้ส่งอยู่ภายใน WebSocket

UDP อ่อนไหวต่อขนาดข้อความ RFC 3261 กำหนดให้ Client ต้องใช้ Transport ที่มี Congestion Control เช่น TCP เมื่อ Request มีขนาดใกล้ Path MTU ไม่เกิน 200 Byte หรือใหญ่กว่า 1300 Byte ในกรณีที่ไม่ทราบ MTU ข้อความ INVITE ที่มี SDP ยาวจึงเป็นสาเหตุที่พบได้จริงของปัญหา IP Fragmentation บน UDP

การระบุที่อยู่: Address of Record เทียบกับ Contact URI

Address of Record คือตัวตนสาธารณะที่คงที่ของผู้ใช้ เช่น sip:1001@example.com ส่วน Contact URI คือที่อยู่จริงที่อุปกรณ์เครื่องหนึ่งกำลังรอรับอยู่ เช่น sip:1001@192.0.2.10:5060 การลงทะเบียนเป็นขั้นตอนที่ผูกสองค่านี้เข้าด้วยกัน และอุปกรณ์หลายเครื่องสามารถลงทะเบียน Contact ให้ AoR เดียวกันได้

หมายเลขโทรศัพท์มักปรากฏเป็น sip URI ที่มี User Part เป็นหมายเลขรูปแบบสากล เช่น +6620000000 หรือเป็น tel URI ตาม RFC 3966 ระบบที่ออกแบบดีจะแปลงหมายเลขให้อยู่ในรูปแบบเดียวกันก่อนตัดสินเส้นทาง

การค้นหา Next Hop ด้วยระเบียน NAPTR, SRV และ A หรือ AAAA

RFC 3263 กำหนดวิธีที่ Client แปลง SIP URI เป็นที่อยู่ Port และ Transport ของ Next Hop ถ้าส่วน Host เป็น IP Address อยู่แล้วก็ไม่ต้องค้นหา DNS ถ้ามีพารามิเตอร์ transport แต่ไม่มี Port Client จะข้าม NAPTR แล้วค้นหาระเบียน SRV เช่น _sip._udp.example.com ทันที และถ้าระบุ Port ไว้ชัดเจน Client จะข้ามทั้ง NAPTR และ SRV แล้วค้นหาเฉพาะระเบียน A หรือ AAAA ของ Host

ในกรณีอื่น Client จะค้นหา NAPTR ก่อนเพื่อดูว่าโดเมนรองรับ Transport ใดและเรียงลำดับความสำคัญอย่างไร จากนั้นค้นหา SRV เช่น _sips._tcp.example.com หรือ _sip._udp.example.com เพื่อได้รายชื่อเป้าหมายพร้อม Priority, Weight และ Port แล้วจึงค้นหา A หรือ AAAA เพื่อได้ IP Address ผลจาก SRV ยังเป็นลำดับ Server สำรองที่ Client ใช้เมื่อ Server ตัวแรกไม่ตอบ

เมื่อสายล้มเหลวก่อนได้รับ Response ใด ๆ ให้ยืนยันว่าอุปกรณ์เลือก Next Hop ใดจริง โทรศัพท์ที่ตั้ง Port ตายตัว มี DNS Cache เก่า หรือใช้ Resolver ที่ไม่คืนค่า SRV อาจส่งไปยัง Server คนละตัวกับที่ผู้ดูแลระบบคาดไว้

โครงสร้างข้อความ SIP และ Header ที่สำคัญ

SIP เป็นโปรโตคอลแบบข้อความที่มีไวยากรณ์คล้าย HTTP ทุกข้อความประกอบด้วย Start-line ชุด Header บรรทัดว่างที่บอกจุดสิ้นสุดของ Header และ Body ที่มีหรือไม่มีก็ได้ Request เริ่มด้วย Request-Line (Method, Request-URI และเวอร์ชัน SIP) ส่วน Response เริ่มด้วย Status-Line (เวอร์ชัน SIP, Status Code สามหลัก และ Reason Phrase) ทุกบรรทัดจบด้วย CRLF ชื่อ Header ไม่สนตัวพิมพ์เล็กใหญ่ และมีรูปย่อ เช่น v แทน Via และ i แทน Call-ID

RFC 3261 หัวข้อ 8.1.1 ระบุ Header ที่ทุก Request ต้องมี ได้แก่ To, From, CSeq, Call-ID, Max-Forwards และ Via ส่วน Contact ต้องมีเพิ่มใน Request ที่สร้าง Dialog ได้ เช่น INVITE และใน REGISTER จะใช้ Contact ระบุ Binding ที่ต้องการเพิ่มหรือลบ

ต้องแยก Request-URI ออกจาก Header To ให้ชัด Proxy จะเปลี่ยนเป้าหมายใน Request-URI ระหว่างที่ Request เดินทางไปยังอุปกรณ์ที่จะรับสาย ขณะที่ To ยังเก็บเป้าหมายเชิงตรรกะตามที่ผู้โทรขอไว้แต่แรก ที่อยู่ของ Media ไม่เคยอยู่ใน Header เหล่านี้ แต่อยู่ในบรรทัด c= และ m= ของ SDP Body

ข้อความ SIP แบ่งเป็น Start-line, Header, บรรทัดว่าง และ SDP Body
ภาพที่ 03: ข้อความ SIP มี Start-line, Header, บรรทัดว่าง และในตัวอย่างนี้มี SDP เป็น Body
Header หรือส่วนประกอบหน้าที่สิ่งที่ควรตรวจ
Request-URIทรัพยากรที่ Request มุ่งไปในแต่ละ Hopรูปแบบหมายเลข และ Proxy แต่ละตัวแก้ไขตามที่คาดหรือไม่
Via และ branchบันทึกเส้นทางสำหรับส่ง Response กลับ ค่า branch บนสุดระบุ Transactionbranch ขึ้นต้นด้วย z9hG4bK และมี Via หนึ่งรายการต่อหนึ่ง Hop
received และ rportที่อยู่และ Port ต้นทางที่ Hop ถัดไปมองเห็นจริง (RFC 3261, RFC 3581)Response ถูกส่งกลับไปยัง NAT Mapping ถูกต้องหรือไม่
From, To และ Tagผู้เริ่มและเป้าหมายเชิงตรรกะ โดย Tag ระบุปลายทั้งสองของ DialogFrom Tag อยู่ใน Request และ UAS เป็นผู้เพิ่ม To Tag
Call-IDจัดกลุ่มทุกข้อความของการลงทะเบียนหรือ Dialog เดียวกันค่าเดิมตลอด Dialog และต่างกันในแต่ละสาย
CSeqเลขลำดับคู่กับชื่อ MethodResponse ฉบับนั้นเป็นของ Request ใด
Contactที่อยู่ที่ติดต่อผู้ส่งได้โดยตรงสำหรับ Request ถัดไปที่อยู่ Private หรือที่อยู่ที่เข้าถึงไม่ได้หลัง NAT
Max-Forwardsจำนวน Hop ที่เหลือ ปกติเริ่มที่ 70483 Too Many Hops ที่เกิดจาก Routing Loop
Record-Route และ Routeทำให้ Proxy ที่เลือกไว้อยู่บนเส้นทางของ Request ภายใน Dialogรายการที่หายไปจนข้าม SBC หรือ PBX
Allow, Supported และ Requireประกาศ Method และ Option Tag ของ Extensionมี Extension ที่ต้องใช้ เช่น 100rel หรือไม่
Content-Type และ Content-Lengthรูปแบบและความยาวเป็น Byte ของ Bodyความยาวไม่ตรงหลังอุปกรณ์กลางทางแก้ไข Body
Authorization และ Proxy-Authorizationข้อมูลยืนยันตัวตนที่ส่งตอบ Challengeใช้ Header ถูกคู่ระหว่าง 401 กับ 407 หรือไม่

Method และ Response Code ของ SIP

RFC 3261 กำหนด Method หลักไว้ 6 ตัว INVITE ใช้เริ่ม Session หรือแก้ไข Session เดิมเมื่อส่งภายใน Dialog ในรูปแบบ re-INVITE ส่วน ACK ใช้ยืนยัน Final Response ของ INVITE, BYE ใช้ยุติ Session, CANCEL ขอให้ Server หยุดประมวลผล Request ที่ยังค้างอยู่ ซึ่งในทางปฏิบัติคือ INVITE ที่ยังไม่มีคนรับ, REGISTER ใช้เพิ่ม ต่ออายุ หรือลบ Contact Binding และ OPTIONS ใช้สอบถามความสามารถ ซึ่งนิยมใช้เป็น Keepalive หรือ Health Probe ระหว่าง PBX, SBC และผู้ให้บริการ

Extension เพิ่ม Method อื่นอีก ได้แก่ PRACK สำหรับยืนยัน Provisional Response แบบ Reliable (RFC 3262), UPDATE สำหรับเปลี่ยนพารามิเตอร์ Session ได้ทั้งก่อนและหลังรับสายโดยไม่กระทบ State ของ Dialog (RFC 3311), REFER สำหรับขอให้ผู้รับติดต่อบุคคลที่สาม ซึ่งเป็นพื้นฐานของการโอนสาย (RFC 3515), INFO สำหรับส่งข้อมูลระดับแอปพลิเคชันภายใน Dialog (RFC 6086), SUBSCRIBE และ NOTIFY สำหรับแจ้งเหตุการณ์ (RFC 6665) และ MESSAGE สำหรับข้อความแบบทันที (RFC 3428)

Response แบ่งกลุ่มตามหลักแรก 1xx คือ Provisional, 2xx คือสำเร็จ, 3xx คือ Redirect, 4xx คือ Request ล้มเหลว, 5xx คือ Server ล้มเหลว และ 6xx คือล้มเหลวทุกปลายทาง ต้องอ่าน Response คู่กับ Method ใน Header CSeq เสมอ เช่น 200 OK ของ BYE หมายถึงการวางสายได้รับการยอมรับ ไม่ได้หมายความว่ามีคนรับสาย

Codeความหมายสถานการณ์ที่พบตรวจอะไรต่อ
100TryingHop ถัดไปได้รับ Request แล้วและกำลังประมวลผลมี Provisional หรือ Final Response ตามมาหรือไม่
180Ringingปลายทางกำลังแจ้งเตือนผู้ใช้มี SDP หรือไม่ และใครเป็นผู้สร้างเสียง Ringback
183Session Progressข้อมูลความคืบหน้า มักมาพร้อม Early MediaSDP Body, 100rel และ RTP ที่เกิดขึ้นจริง
200OKRequest ที่ระบุใน CSeq สำเร็จMethod ใน CSeq และข้อความถัดไปที่ควรเกิด
302Moved Temporarilyเปลี่ยนเส้นทางไปยัง Contact อื่นค่า Contact และนโยบาย Routing
401UnauthorizedChallenge จาก Registrar หรือ UASWWW-Authenticate และ Request ที่ส่งซ้ำ
403ForbiddenServer ปฏิเสธ Requestสิทธิ์ ตัวตน และ Log ของนโยบาย
404Not Foundไม่มีผู้ใช้หรือหมายเลขนี้ในโดเมนนั้นRequest-URI รูปแบบหมายเลข และ Hop ที่ปฏิเสธ
407Proxy Authentication RequiredChallenge จาก ProxyProxy-Authenticate และ Proxy-Authorization
408Request Timeoutไม่ได้รับ Final Response ภายในเวลาอุปกรณ์ใดสร้าง Response นี้ และส่งต่อไปถึงไหนได้บ้าง
480Temporarily Unavailableปลายทางติดต่อไม่ได้ชั่วคราวหรือยังไม่ลงทะเบียนสถานะการลงทะเบียน การเข้าถึง และการตั้งค่าของผู้ใช้
481Call/Transaction Does Not Existไม่พบ Dialog หรือ Transaction ที่ตรงกันCall-ID, Tag, branch และการ Failover ของเส้นทาง
486Busy Hereปลายทางนี้ไม่ว่างBranch อื่นที่ถูก Fork และสถานะของอุปกรณ์
487Request TerminatedRequest ที่ค้างอยู่ถูกยุติ ส่วนใหญ่เพราะ CANCELCANCEL หรือสาเหตุอื่นที่เกิดก่อนหน้า
488Not Acceptable HereSession ที่เสนอมาไม่เป็นที่ยอมรับที่ปลายทางนี้SDP Offer ทั้งหมด Codec และข้อกำหนด SRTP
491Request Pendingมี Offer/Answer ซ้อนกันใน Dialog เดียวจังหวะเวลาของ re-INVITE หรือ UPDATE ที่เกิดพร้อมกัน
503Service UnavailableServer รับ Request ไม่ได้ชั่วคราวRetry-After, ความจุ และเส้นทางสำรอง
603Declineปลายทางปฏิเสธการรับสายทุกที่อุปกรณ์ที่ส่ง Response และ Header Reason ถ้ามี

Transaction, Dialog และ Session

วิศวกรใช้คำที่เกี่ยวข้องกัน 5 คำ Message คือ Request หรือ Response หนึ่งฉบับ Transaction คือ Request หนึ่งฉบับพร้อม Response ทั้งหมดของมันรวมถึงการส่งซ้ำ ทั้ง Client และ Server ระบุ Transaction ด้วยพารามิเตอร์ branch ของ Via บนสุด ซึ่งตาม RFC 3261 จะขึ้นต้นด้วย Magic Cookie z9hG4bK เสมอ ร่วมกับชื่อ Method ส่วน Dialog คือความสัมพันธ์แบบ Peer-to-Peer ระหว่าง User Agent สองฝั่งที่คงอยู่ช่วงเวลาหนึ่ง สร้างโดย INVITE หรือ SUBSCRIBE และระบุด้วย Call-ID, Local Tag และ Remote Tag

Session คือการแลกเปลี่ยน Media ตามที่ SDP อธิบาย และ Call Leg เป็นคำเรียกทั่วไปของ Dialog หนึ่งตัว เมื่อ B2BUA หรือ SBC แบ่งสายปลายถึงปลายออกเป็นหลาย Dialog

เมื่อ UAS ส่ง Provisional Response ที่ไม่ใช่ 100 Trying พร้อม To Tag จะเกิด Early Dialog และเมื่อได้รับ Final Response กลุ่ม 2xx Dialog จะกลายเป็น Confirmed Request ถัดมาใน Dialog เช่น re-INVITE, UPDATE หรือ BYE ใช้ Call-ID และ Tag เดิม แต่แต่ละฉบับเป็น Transaction ใหม่ที่มี branch ใหม่ และมีเลข CSeq สูงขึ้นตามฝั่งผู้ส่ง แต่ละฝั่งมีลำดับ CSeq ของตัวเอง เลขใน BYE ที่ส่งจากฝั่งผู้รับสายจึงไม่จำเป็นต้องต่อจากเลขของผู้โทร

การ Fork ทำให้ซับซ้อนขึ้น เมื่อ Proxy ส่ง INVITE ไปหลายเครื่องพร้อมกัน เครื่องที่ตอบด้วย To Tag ของตัวเองจะสร้าง Early Dialog แยกกันโดยใช้ Call-ID เดียวกัน Proxy อาจ CANCEL Branch ที่ยังไม่รับสายเมื่อได้รับ 2xx แรก แต่หากหลาย Branch ส่ง 2xx ก่อนการยกเลิกจะสำเร็จ จะเกิด Confirmed Dialog หลายตัว UAC ต้องส่ง ACK ให้แต่ละ 2xx และส่ง BYE ใน Dialog ที่ไม่ต้องการ

ขอบเขตของ Transaction, Dialog และ Session พร้อมตัวระบุที่ใช้ติดตามสาย
ภาพที่ 04: Transaction, Dialog และ Media Session เป็นคนละชั้น และแต่ละชั้นติดตามด้วยตัวระบุของตัวเอง

กฎของ ACK: Final Response ที่ไม่ใช่ 2xx เทียบกับ 2xx

ACK ทำงานต่างกันตามชนิดของ Final Response ถ้า INVITE ได้รับ Final Response ที่ไม่ใช่ 2xx เช่น 407, 486 หรือ 487 ACK จะเป็นส่วนหนึ่งของ INVITE Transaction ถูกส่งแบบ Hop-by-Hop ใช้ branch เดียวกับ INVITE และสร้างโดยชั้น Transaction

ถ้าเป็น Response กลุ่ม 2xx ACK จะถูกสร้างโดย UAC Core เดินทางแบบปลายถึงปลายตาม Route ของ Dialog ไปยัง Contact ของ UAS และใช้ค่า branch ใหม่ จึงไม่อยู่ใน INVITE Transaction เลข CSeq เท่ากับของ INVITE แต่ Method เป็น ACK หาก ACK นี้ไปไม่ถึง UAS จะส่ง 200 OK ซ้ำไปเรื่อย ๆ และสุดท้ายจะวางสาย ซึ่งเป็นกลไกเบื้องหลังอาการสายหลุดที่ 32 วินาทีในหัวข้อการแก้ปัญหา

การลงทะเบียน (REGISTER) และการยืนยันตัวตนแบบ Digest

REGISTER ใช้สร้าง ต่ออายุ หรือลบ Contact Binding ของ Address of Record อายุที่ขอระบุได้ทั้งในพารามิเตอร์ expires ของ Contact หรือใน Header Expires และ Registrar จะแจ้งอายุที่อนุญาตจริงกลับมาใน 200 OK ซึ่งอาจสั้นกว่าที่ขอ Client ต้องต่ออายุก่อนหมดเวลาที่ได้รับ และ REGISTER ที่ระบุอายุเป็นศูนย์คือการลบ Binding

การลงทะเบียนกับการยืนยันตัวตนเป็นคนละเรื่อง การลงทะเบียนตอบคำถามว่าตอนนี้ติดต่อผู้ใช้ได้ที่ไหน ส่วนการยืนยันตัวตนตอบว่าผู้ส่งพิสูจน์ตัวตนได้หรือไม่ Binding ที่หมดอายุทำให้สายเรียกเข้าใหม่ไม่ถูกส่งไปยัง Contact นั้น แต่ไม่ได้ตัด Dialog ที่สร้างไว้แล้ว

การถูก Challenge ใน Request แรกเป็นเรื่องปกติ Registrar ที่ต้องการข้อมูลยืนยันตัวตนจะตอบ REGISTER ฉบับแรกด้วย 401 Unauthorized พร้อม Header WWW-Authenticate จากนั้น Client จะส่ง REGISTER ฉบับใหม่ที่มี Header Authorization

ลำดับการลงทะเบียนเมื่อถูก Challenge

ในตัวอย่าง UA 1001 ที่ 192.0.2.10 ส่ง REGISTER สำหรับ sip:1001@example.com ด้วย CSeq 1 และ branch z9hG4bK-reg-1 โดยขอ Binding อายุ 3600 วินาที Registrar ตอบ 401 ที่มี CSeq 1 REGISTER พร้อม Challenge จากนั้น UA ส่ง REGISTER ฉบับที่สองโดยใช้ Call-ID และ From Tag เดิม แต่เป็น CSeq 2 ใช้ branch ใหม่ z9hG4bK-reg-2 และแนบ Header Authorization แล้ว Registrar ตอบ 200 OK ที่มี CSeq 2 REGISTER พร้อมแสดง Contact ปัจจุบันและอายุที่อนุญาต

เนื่องจาก REGISTER ไม่ใช่ INVITE จึงไม่มี ACK ตามหลัง 401 หรือ 200 การส่งซ้ำพร้อมข้อมูลยืนยันตัวตนคือ Transaction ใหม่ทั้งหมด เลข CSeq และค่า branch จึงเปลี่ยนทั้งคู่

REGISTER ที่ส่งซ้ำใช้ CSeq และ Via branch ใหม่ และลำดับการลงทะเบียนนี้ไม่มี ACK
ภาพที่ 05: REGISTER ฉบับที่ส่งซ้ำใช้ CSeq และ Via branch ใหม่ และในลำดับนี้ไม่มี ACK

Digest Challenge: 401 เทียบกับ 407, Realm, Nonce และ Algorithm

SIP นำ HTTP Digest Authentication มาใช้ (RFC 3261 หัวข้อ 22) Registrar หรือ UAS จะ Challenge ด้วย 401 Unauthorized และ WWW-Authenticate โดย Client ตอบด้วย Authorization ส่วน Proxy รวมถึง Outbound Proxy หรือ SBC ที่ทำหน้าที่เป็น Proxy จะ Challenge ด้วย 407 Proxy Authentication Required และ Proxy-Authenticate โดย Client ตอบด้วย Proxy-Authorization การใช้ Header ผิดคู่เป็นปัญหา Interoperability ที่พบบ่อย

Challenge ประกอบด้วย realm ที่ระบุขอบเขตการป้องกัน และ nonce ที่ Server สร้างขึ้น Client คำนวณ Hash จาก Username, Realm, Password, Nonce, Method และ Request URI รวมถึง cnonce และ Nonce Count เมื่อใช้ qop เดิม RFC 3261 กำหนดให้ใช้ MD5 ต่อมา RFC 8760 เพิ่ม Algorithm แบบ SHA-256 และ SHA-512/256 สำหรับ Digest ใน SIP

Digest พิสูจน์ว่ารู้รหัสลับร่วมโดยไม่ต้องส่ง Password แบบข้อความธรรมดา แต่ไม่ได้เข้ารหัสข้อความ และในโหมด auth ที่ใช้กันทั่วไปก็ไม่ได้ป้องกันการแก้ไข Header หรือ Body การรักษาความลับของ Signalling ต้องใช้ TLS

ตัวอย่างประกอบ: ไล่ข้อความของสายหนึ่งสายทีละฉบับ

ตัวอย่างนี้ใช้ที่อยู่สำหรับเอกสาร (Documentation Address) เพื่อให้ติดตามทุกค่าได้ UA 1001 อยู่ที่ 192.0.2.10 และ UA 1002 อยู่ที่ 198.51.100.20 ทั้งคู่อยู่ในโดเมน example.com เพื่อให้กระชับ ข้อความจะวิ่งตรงระหว่าง User Agent ทั้งสอง หากมี Proxy ที่ทำ Record-Route อยู่ในเส้นทาง แต่ละ Request จะมี Via เพิ่มหนึ่งรายการต่อหนึ่ง Hop และมี Header Route ที่ได้จาก Record-Route

สายนี้ใช้ Call-ID call-a-1001-1002@example.com โดย UA 1001 ใส่ Tag a1001 ใน From และ UA 1002 เพิ่ม Tag b1002 ใน To ของ Response ทั้งสามค่านี้คือตัวระบุ Dialog INVITE Transaction ใช้ branch z9hG4bK-call-a-invite และ CSeq 1 INVITE ส่วน ACK ของ 200 OK ใช้ branch ใหม่ z9hG4bK-call-a-ack แต่ยังคงเลข CSeq 1 พร้อม Method ACK และ BYE เป็น Transaction ใหม่ที่ใช้ branch z9hG4bK-call-a-bye และ CSeq 2 BYE

SDP Offer ใน INVITE ประกาศ Media ที่ 192.0.2.10 Port 40000 พร้อม Payload Type 0, 8, 111 และ 101 ส่วน SDP Answer ใน 200 OK ประกาศ Media ที่ 198.51.100.20 Port 41000 และคงไว้เพียง Payload Type 8 กับ 101 หลัง ACK แล้ว RTP จะวิ่งระหว่าง 192.0.2.10:40000 กับ 198.51.100.20:41000

ลำดับข้อความค่า Header สำคัญBody
1INVITE sip:1002@198.51.100.20:5060Via branch z9hG4bK-call-a-invite, From Tag a1001, To ยังไม่มี Tag, CSeq 1 INVITE, Contact sip:1001@192.0.2.10:5060, Max-Forwards 70SDP Offer: c=IN IP4 192.0.2.10 และ m=audio 40000 RTP/AVP 0 8 111 101
2180 Ringingbranch, Call-ID และ CSeq 1 INVITE เดิม โดยเพิ่ม To Tag b1002ไม่มี
3200 OKbranch เดิม, To Tag b1002, CSeq 1 INVITE, Contact sip:1002@198.51.100.20:5060SDP Answer: c=IN IP4 198.51.100.20 และ m=audio 41000 RTP/AVP 8 101
4ACK sip:1002@198.51.100.20:5060branch ใหม่ z9hG4bK-call-a-ack, From Tag a1001, To Tag b1002, CSeq 1 ACKไม่มี
5BYE sip:1002@198.51.100.20:5060branch ใหม่ z9hG4bK-call-a-bye, Call-ID และ Tag เดิม, CSeq 2 BYEไม่มี
6200 OK ตอบ BYEbranch z9hG4bK-call-a-bye, CSeq 2 BYEไม่มี

SDP Offer/Answer และการเจรจา Codec (RFC 3264, RFC 8866)

SDP กำหนดไว้ใน RFC 8866 ซึ่งแทนที่ RFC 4566 SIP ใช้ SDP ร่วมกับโมเดล Offer/Answer ของ RFC 3264 ฝั่งหนึ่งส่ง Offer ที่อธิบาย Media ที่ต้องการแลกเปลี่ยน อีกฝั่งตอบด้วย Answer ที่ยอมรับ ปรับภายในกติกาที่อนุญาต หรือปฏิเสธ Media Stream แต่ละรายการ

Offer ในตัวอย่างประกอบด้วย v=0 บรรทัด o= ที่ระบุผู้สร้าง Session ID เวอร์ชัน และที่อยู่ 192.0.2.10 ชื่อ Session บรรทัด c=IN IP4 192.0.2.10 บรรทัด t=0 0 บรรทัด m=audio 40000 RTP/AVP 0 8 111 101 บรรทัด a=rtcp:40001 บรรทัด rtpmap ที่จับคู่ 0 กับ PCMU/8000, 8 กับ PCMA/8000, 111 กับ opus/48000/2 และ 101 กับ telephone-event/8000 บรรทัด fmtp ของ 101 ที่ระบุ 0-15 และ a=ptime:20 กับ a=sendrecv ส่วน Answer ใช้ c=IN IP4 198.51.100.20 และ m=audio 41000 RTP/AVP 8 101 คือเลือก PCMA และ telephone-event

Payload Type 0 (PCMU หรือ G.711 mu-law) และ 8 (PCMA หรือ G.711 A-law) เป็นค่าคงที่จาก RTP Audio/Video Profile (RFC 3551) ส่วน Opus และ telephone-event ใช้ Dynamic Payload Type ในช่วง 96 ถึง 127 และต้องประกาศด้วย a=rtpmap ทุกครั้ง Opus จะระบุใน rtpmap เป็น Clock 48000 Hz และ 2 Channel เสมอ แม้จะใช้กับเสียงพูดแบบ Mono ก็ตาม (RFC 7587)

Offer เรียง Format ตามลำดับที่ต้องการ Answer ต้องมีบรรทัด m= จำนวนเท่ากันและเรียงลำดับเดียวกัน สำหรับ Unicast Stream ที่ยอมรับต้องมีอย่างน้อยหนึ่ง Format ที่ร่วมกับ Offer และอาจระบุ Format เพิ่มที่ไม่ได้อยู่ใน Offer ได้ แต่จะยังใช้ Format เพิ่มนั้นส่ง Media ไม่ได้จนกว่าจะมี Offer ภายหลังที่รองรับ ปฏิเสธ Stream ใดก็ได้ด้วยการตั้ง Port เป็นศูนย์ ถ้าไม่มี Format ที่ยอมรับได้เลย UAS มักปฏิเสธ INVITE ด้วย 488 Not Acceptable Here หรือ 606 เมื่อปฏิเสธในทุกปลายทาง

Offer มี Payload 0, 8, 111 และ 101 ส่วน Answer นี้คงไว้เพียง 8 และ 101
ภาพที่ 06: Offer ระบุ Payload 0, 8, 111 และ 101 ส่วน Answer เลือกเก็บ 8 (PCMA) และ 101 (telephone-event)
บรรทัด SDPความหมาย
v=0เวอร์ชันของ SDP ซึ่งเป็น 0 เสมอ
o=ผู้สร้าง Session ID เวอร์ชันของ Session และที่อยู่ของผู้สร้าง เวอร์ชันต้องเพิ่มขึ้นทุกครั้งที่คำอธิบายเปลี่ยน
s=ชื่อ Session
c=Connection Address ที่ผู้เขียน SDP คาดว่าจะรับ Media
t=0 0Session ไม่มีกำหนดเวลาเริ่มและสิ้นสุด
m=audio 40000 RTP/AVP ...ชนิด Media, Port ที่รับ, Transport Profile และรายการ Payload Format
a=rtcp:Port ของ RTCP และที่อยู่ถ้ามี เมื่อไม่ได้ใช้ Port ปริยาย (RFC 3605)
a=rtpmap:จับคู่ Payload Type กับชื่อ Encoding, Clock Rate และจำนวน Channel
a=fmtp:พารามิเตอร์เฉพาะของแต่ละ Format เช่น ช่วงของ Event สำหรับ telephone-event
a=ptime:20ความยาว Packet เป็นมิลลิวินาทีที่ผู้เขียนต้องการรับ เป็นคำแนะนำ ไม่ใช่ข้อบังคับ
a=sendrecvทิศทาง Media ตามมุมมองของผู้เขียน SDP ได้แก่ sendrecv, sendonly, recvonly หรือ inactive

Early Offer เทียบกับ Delayed Offer

แบบ Early Offer จะใส่ SDP Offer ไว้ใน INVITE และได้ Answer กลับมาใน Provisional Response แบบ Reliable หรือใน 200 OK รูปแบบนี้พบมากที่สุดบน SIP Trunk เพราะรู้พารามิเตอร์ Media ตั้งแต่ก่อนรับสาย

แบบ Delayed Offer จะส่ง INVITE โดยไม่มี SDP Offer หาก UAS ใส่ Offer ใน 200 OK UAC จะส่ง Answer ใน ACK แต่หาก Offer อยู่ใน Provisional Response แบบ Reliable UAC ต้องส่ง Answer ใน PRACK Gateway และ SBC บางรุ่นแปลงระหว่างสองรูปแบบนี้ได้ รูปแบบที่เห็นบน Call Leg หนึ่งจึงอาจไม่เหมือนอีก Leg

Call Flow พื้นฐาน: การตั้งสายและวางสายที่สำเร็จ

สายที่สำเร็จระหว่าง UA 1001 กับ UA 1002 มี 4 ขั้นตอน ขั้นแรก UA 1001 ส่ง INVITE ที่มี SDP Offer และ CSeq 1 อาจได้รับ 100 Trying กลับมาเพื่อหยุดการส่ง INVITE ซ้ำบน UDP ซึ่ง 100 Trying เป็นแบบ Hop-by-Hop และส่วนใหญ่สร้างโดย Proxy ตัวถัดไปหรือ UAS จากนั้น UA 1002 แจ้งเตือนผู้ใช้และส่ง 180 Ringing

ขั้นที่สอง เมื่อผู้ใช้รับสาย UA 1002 ส่ง 200 OK พร้อม SDP Answer และ UA 1001 ยืนยันด้วย ACK ถึงจุดนี้ Dialog อยู่ในสถานะ Confirmed

ขั้นที่สาม RTP วิ่งสองทิศทางระหว่างที่อยู่และ Port ตาม SDP คือ 192.0.2.10 Port 40000 กับ 198.51.100.20 Port 41000 ในตัวอย่าง ขึ้นอยู่กับการออกแบบ PBX หรือ SBC อาจยึด Media ไว้ที่ตัวเองแทนที่จะให้วิ่งตรง

ขั้นที่สี่ ฝั่งใดฝั่งหนึ่งวางสายด้วยการส่ง BYE ภายใน Dialog ในตัวอย่างคือ UA 1001 ส่งด้วย CSeq 2 และอีกฝั่งตอบ 200 OK ลำดับ INVITE, 180, 200, ACK, Media, BYE, 200 นี้คือเส้นฐานที่ใช้เปรียบเทียบกับ Flow อื่นทั้งหมด

เสียง Ringback ใน Flow นี้เครื่องผู้โทรสร้างขึ้นเองเมื่อได้รับ 180 ที่ไม่มี SDP ส่วนเสียงหรือประกาศจากผู้ให้บริการที่ได้ยินก่อนรับสายใช้ Early Media ซึ่งอธิบายในหัวข้อถัดไป

ตัวอย่างสายที่สำเร็จ ตั้งแต่ INVITE และ ACK จนถึง BYE พร้อม Response ที่สัมพันธ์กัน
ภาพที่ 07: สายที่สำเร็จตั้งแต่ INVITE และ ACK จนถึง BYE โดยจับคู่ Response แต่ละฉบับกับ Request ของมัน

Flow กรณีล้มเหลวและยกเลิก: Proxy Challenge, CANCEL และ 486 Busy Here

ระบบจริงเจอ Flow เหล่านี้ทุกวัน และทุก Flow ยังต้องเป็นไปตามกฎของ Transaction คือ Final Response ของ INVITE ทุกฉบับต้องได้รับ ACK และ Request ใหม่คือ Transaction ใหม่เสมอ

INVITE ที่ถูก Proxy Challenge ด้วย 407

เมื่อ UA 1001 โทรออกผ่าน PBX หรือ SBC ที่ทำหน้าที่เป็น Proxy ซึ่งต้องยืนยันตัวตน INVITE ฉบับแรกที่ใช้ CSeq 1 จะได้รับ 407 Proxy Authentication Required พร้อม Header Proxy-Authenticate เนื่องจาก 407 เป็น Final Response ที่ไม่ใช่ 2xx ของ INVITE UA 1001 จึงส่ง ACK ด้วย CSeq 1 ACK บน branch เดิมเพื่อปิด Transaction นั้น

จากนั้น UA 1001 ส่ง INVITE ใหม่ที่ใช้ Call-ID และ From Tag เดิม แต่เป็น CSeq 2 ใช้ branch ใหม่ และแนบ Header Proxy-Authorization สายดำเนินต่อตามปกติคือ 180, 200 OK ที่มี CSeq 2 INVITE, ACK ด้วย CSeq 2, Media และภายหลังคือ BYE ด้วย CSeq 3 หากผู้ Challenge เป็น UAS ปลายทาง Response จะเป็น 401 พร้อม WWW-Authenticate และตอบด้วย Authorization แต่ลำดับของ Transaction ยังเหมือนเดิม

ยกเลิกก่อนรับสายด้วย CANCEL

ถ้าผู้โทรวางสายขณะที่ปลายทางยังดังอยู่ UA 1001 จะส่ง CANCEL ซึ่งคัดลอก Request-URI, Call-ID, From, To และเลข CSeq ของ INVITE (แต่ Method เป็น CANCEL) และใช้ branch ของ Via บนสุดเดียวกัน เพื่อให้แต่ละ Hop จับคู่กับ INVITE ที่ค้างอยู่ได้ UAC ต้องไม่ส่ง CANCEL ก่อนได้รับ Provisional Response

Server ตอบ CANCEL เองด้วย 200 OK จากนั้นยุติ INVITE ด้วย 487 Request Terminated และ UA 1001 ส่ง ACK CSeq 1 ยืนยัน 487 ดังนั้นในลำดับนี้มี Final Response สองฉบับคือ 200 OK ของ CANCEL และ 487 ของ INVITE ต้องดู Method ใน CSeq เสมอ เพราะ 200 ของ CANCEL ไม่ได้หมายความว่ามีคนรับสาย

การยกเลิกก่อนรับสายเทียบกับการวางสายหลังรับสาย แยก Response ของ CANCEL และ INVITE
ภาพที่ 08: CANCEL ใช้ยุติสายที่ยังไม่มีคนรับ ส่วน BYE ใช้วางสายหลังจาก 200 OK และ ACK แล้ว

เมื่อ CANCEL กับ 200 OK สวนกัน

Race Condition เกิดขึ้นเมื่อผู้รับสายกดรับในจังหวะเดียวกับที่ผู้โทรยกเลิก ถ้า 200 OK ของ INVITE ถูกส่งออกก่อนที่ CANCEL จะมาถึง CANCEL จะไม่มีผลกับสายที่รับแล้ว UA 1001 ยังต้องส่ง ACK ยืนยัน 200 OK แล้วจึงส่ง BYE เพื่อยุติ Dialog ส่วน CANCEL จะได้รับ Response ของตัวเอง ซึ่งโดยทั่วไปคือ 200 OK หรือ 481 ถ้า Server ไม่มี Transaction ที่ตรงกันเหลืออยู่แล้ว

ปลายทางไม่ว่าง: 486 Busy Here

ถ้าผู้ใช้ปลายทางไม่ว่าง UAS จะตอบ 486 Busy Here UA 1001 ส่ง ACK CSeq 1 ยืนยัน แล้วเล่นสัญญาณสายไม่ว่างในเครื่อง 486 มีผลเฉพาะปลายทางนั้น Proxy ที่ Fork อาจยังลอง Contact อื่นต่อได้ ขณะที่ 600 Busy Everywhere บอกผู้โทรว่าไม่มีปลายทางอื่นที่จะสำเร็จ

Early Media, 183 Session Progress และ PRACK (RFC 3262)

ผู้โทรมักได้ยินเสียงจากเครือข่ายก่อนมีคนรับสาย เช่น Ringback จากผู้ให้บริการ ประกาศว่าเลขหมายไม่สามารถติดต่อได้ หรือเสียงเมนู IVR สิ่งนี้เรียกว่า Early Media และส่วนใหญ่ส่งสัญญาณด้วย 183 Session Progress ที่มี SDP ทำให้ RTP เริ่มได้ก่อน 200 OK

180 Ringing มักทำให้เครื่องผู้โทรสร้าง Ringback เองตามนโยบายของอุปกรณ์ ส่วน SDP ใน Provisional Response อาจสร้าง Early Media Session ได้ แต่ไม่ได้ยืนยันว่าจะมีเสียง RTP มาถึงหรือสั่งให้หยุด Ringback ทันที ตาม RFC 3960 เครื่องผู้โทรควรพิจารณา Media ที่ได้รับจริงร่วมกับนโยบายท้องถิ่น เช่น เล่นเสียงจากปลายทางและหยุด Ringback เมื่อ RTP มาถึง การตัดสินใจผิดอาจทำให้ Ringback เงียบหรือดังซ้อนบน Trunk

ปกติ Provisional Response ไม่ Reliable คือบน UDP จะไม่ถูกส่งซ้ำ 183 ที่หายไปจึงอาจทำให้ SDP ช่วงก่อนรับสายหายไปด้วย RFC 3262 เพิ่มความ Reliable ให้ UAC ประกาศว่ารองรับด้วย Supported: 100rel ใน INVITE จากนั้น UAS จึงส่ง 183 พร้อม Require: 100rel และค่า RSeq ได้ เช่น RSeq 71 และจะส่งซ้ำจนกว่าจะได้รับการยืนยัน UAC ยืนยันด้วย PRACK ซึ่งเป็น Request ใหม่ใน Early Dialog ที่มี CSeq ของตัวเอง (ในตัวอย่างคือ CSeq 2 PRACK) และมี RAck: 71 1 INVITE หมายถึง RSeq 71 ของ CSeq 1 INVITE แล้ว UAS ตอบ PRACK ด้วย 200 OK

เมื่อมีคนรับสาย 200 OK ของ CSeq 1 INVITE จะปิด INVITE Transaction และได้รับการยืนยันด้วย ACK CSeq 1 ถ้า SDP Answer ถูกส่งไปแล้วใน 183 แบบ Reliable การทำ Offer/Answer ของ INVITE ถือว่าเสร็จแล้ว SDP ที่ส่งซ้ำใน 200 OK ต้องเหมือนเดิมทุกประการ ไม่ใช่ Answer ใหม่ และ BYE ภายหลังจะใช้ CSeq 3

ตัวอย่าง 183 แบบ Reliable ที่ใช้ 100rel, RSeq 71 และ PRACK พร้อม RAck 71 1 INVITE
ภาพที่ 09: 183 แบบ Reliable ที่ใช้ 100rel และ RSeq 71 ซึ่งได้รับการยืนยันด้วย PRACK ที่มี RAck 71 1 INVITE

การทำงานระหว่าง Dialog: Hold, โอนสาย และ Session Timer

เมื่อมี Dialog แล้ว ทั้งสองฝั่งเปลี่ยนแปลงสายได้โดยไม่ต้องโทรใหม่ งานที่สำคัญที่สุดในระบบองค์กรมี 3 อย่าง คือ Hold และ Resume การโอนสาย และการต่ออายุเป็นระยะ ทุกงานใช้ Transaction ใหม่ภายใน Dialog เดิม Call-ID และ Tag จึงคงเดิม แต่ branch และ CSeq เปลี่ยน

กลไกการต่ออายุState ที่รักษาไว้หลักฐานที่ต้องตรวจ
ต่ออายุการลงทะเบียนBinding จาก AoR ไปยัง Contact ที่ Registrarรอบของ REGISTER อายุที่อนุญาต และ Response
Session Timer (RFC 4028)การยืนยันว่า Session ที่สร้างแล้วยังทำงานอยู่Session-Expires, Min-SE, บทบาท Refresher และ re-INVITE หรือ UPDATE
Keepalive ของ NAT หรือ ConnectionNAT Mapping, State ของ Firewall หรือ Transport Connectionวิธี Keepalive รอบเวลา และ Mapping ยังอยู่หรือไม่

Hold และ Resume ด้วย re-INVITE

Hold คือการเปลี่ยน SDP ที่ส่งใน re-INVITE เมื่อ UA 1001 ต้องการพักสายที่คุยกับ UA 1002 ฝั่ง UA 1001 จะส่ง re-INVITE ด้วย CSeq 2 ที่ Offer ใช้ a=sendonly ถ้าจะส่งเพลงรอสาย หรือ a=inactive ถ้าไม่ต้องการให้มี Media และเพิ่มเลขเวอร์ชันในบรรทัด o= UA 1002 ตอบด้วย a=recvonly หรือ a=inactive ตามลำดับ เมื่อต้องการกลับมาคุย UA 1001 ส่ง re-INVITE อีกครั้งด้วย CSeq 3 ที่ใช้ a=sendrecv และเพิ่มเวอร์ชันใน o= อีกครั้ง แล้วได้รับ sendrecv ใน Answer

Direction Attribute เขียนจากมุมมองของฝั่งที่ส่ง SDP เสมอ ถ้าทั้งสองฝั่งส่ง re-INVITE พร้อมกัน ฝั่งหนึ่งจะได้รับ 491 Request Pending และต้องลองใหม่หลังหน่วงเวลาแบบสุ่ม (RFC 3261 หัวข้อ 14.1)

การโอนสายด้วย REFER (RFC 3515)

REFER ขอให้ผู้รับส่ง Request ไปยังบุคคลที่สามตามที่ระบุใน Header Refer-To และผู้รับรายงานความคืบหน้ากลับด้วย NOTIFY ที่มี Body แบบ message/sipfrag ในการโอนแบบ Blind ผู้โอนส่ง REFER โดยไม่ได้คุยกับปลายทางก่อน ส่วนการโอนแบบ Attended ผู้โอนโทรหาปลายทางก่อน แล้วส่ง REFER ที่ Refer-To URI มี Header Replaces (RFC 3891) เพื่อให้สายใหม่เข้าแทนที่ Dialog ที่ใช้ปรึกษา

IP-PBX จำนวนมากเป็น B2BUA การกดโอนสายบนโทรศัพท์จึงมักเกิด REFER เฉพาะระหว่างโทรศัพท์กับ PBX ส่วนฝั่ง SIP Trunk นั้น PBX อาจใช้ re-INVITE กับ Leg เดิม หรือเชื่อม Media ภายในแทน ควรวิเคราะห์ทีละ Leg ก่อนสรุปว่าการโอนสายเสีย

Session Timer และกลไกต่ออายุอื่น ๆ

Session Timer (RFC 4028) ช่วยให้ User Agent และ Proxy ตรวจพบ Session ที่จบไปโดยไม่มี BYE Header Session-Expires ระบุช่วงเวลา Min-SE ระบุช่วงเวลาต่ำสุดที่อุปกรณ์ยอมรับ และพารามิเตอร์ refresher บอกว่า UAC หรือ UAS เป็นผู้ต่ออายุ ผู้ต่ออายุส่ง re-INVITE หรือ UPDATE ก่อนหมดเวลา ถ้าต่ออายุไม่สำเร็จ ฝั่งใดฝั่งหนึ่งควรส่ง BYE ก่อนหมดเวลา Request ที่ขอช่วงเวลาสั้นเกินไปจะถูกปฏิเสธด้วย 422 Session Interval Too Small

การต่ออายุการลงทะเบียนและ Keepalive ของ NAT เป็นคนละกลไก Keepalive อาจใช้ CRLF Ping หรือ STUN บน Flow ของ SIP ตามที่ SIP Outbound (RFC 5626) กำหนด หรือใช้ Request แบบ OPTIONS รอบเวลาต้องสั้นกว่า Idle Timeout ของ NAT และ Firewall ทุกตัวบนเส้นทาง ซึ่งแตกต่างกันไปตามอุปกรณ์

ชั้น Media: RTP, RTCP, SRTP และ DTMF

RTP (RFC 3550) ขน Media ที่เข้ารหัสแล้ว ส่วนใหญ่บน UDP ทุก Packet มี Payload Type ที่อ้างถึงการจับคู่ Codec จาก SDP มี Sequence Number ให้ผู้รับตรวจ Packet หายหรือสลับลำดับ มี Timestamp สำหรับกำหนดจังหวะการเล่นและคำนวณ Jitter และมี SSRC ที่ระบุแหล่งกำเนิด

RTCP (อยู่ใน RFC 3550 เช่นกัน) ส่ง Sender Report และ Receiver Report ที่มีจำนวน Packet, Packet Loss สะสม, Interarrival Jitter และข้อมูลสำหรับคำนวณ Round-Trip Time ตามธรรมเนียม RTP ใช้ Port เลขคู่และ RTCP ใช้ Port เลขคี่ถัดไป เช่น 40000 และ 40001 SDP สามารถประกาศ Port ของ RTCP ที่ต่างออกไปด้วย a=rtcp (RFC 3605) และระบบสมัยใหม่จำนวนมากรวม RTP กับ RTCP ไว้บน Port เดียว (RFC 5761)

SRTP (RFC 3711) ให้การรักษาความลับ การยืนยันความถูกต้องของข้อความ และการป้องกัน Replay แก่ RTP และ RTCP Transform ปริยายคือ AES แบบ Counter Mode สำหรับการเข้ารหัส และ HMAC-SHA1 สำหรับการยืนยันความถูกต้อง ส่วน AES-GCM ถูกเพิ่มภายหลังใน RFC 7714 กุญแจของ SRTP มาจากกลไกจัดการกุญแจแยกต่างหาก ที่พบบ่อยคือ SDES ซึ่งใส่ crypto attribute ใน SDP (RFC 4568) และปลอดภัยเฉพาะเมื่อ Signalling ของ SIP ถูกป้องกันด้วย TLS หรือใช้ DTLS-SRTP (RFC 5764) แบบที่ WebRTC ใช้

วิธีส่ง DTMFตัวเลขเดินทางอยู่ที่ไหนสิ่งที่ต้องตรวจ
In-band Audioเป็นเสียงสองความถี่ที่ได้ยินได้ภายในเสียงสนทนาที่เข้ารหัสแล้วชนิด Codec การบีบอัด และการตรวจจับ Tone ที่ฝั่งรับ
RTP telephone-event (RFC 4733)เป็น Payload แบบ Named Event ที่เจรจาไว้ภายใน RTP Streamการจับคู่ Payload Type ช่วง Event ระยะเวลา และการทำเครื่องหมายจบ Event
SIP INFO (RFC 6086)อยู่ใน Body ของ Request แบบ INFO ภายใน Dialogทั้งสองฝั่งตกลงใช้ INFO Package หรือรูปแบบ Body เดียวกัน

ทางเลือกในการส่ง DTMF

RFC 4733 ซึ่งแทนที่ RFC 2833 เป็นทางเลือกที่ทำงานร่วมกันได้ดีที่สุดบน SIP Trunk และกับ IVR เพราะส่งตัวเลขเป็น Event ที่ชัดเจนโดยไม่ขึ้นกับ Codec เสียง Tone แบบ In-band ผ่าน G.711 ได้ดี แต่ถูกบิดเบือนโดย Codec บิตเรตต่ำอย่าง G.729 จึงไม่น่าเชื่อถือเมื่อมีการบีบอัด ส่วน SIP INFO ส่งตัวเลขไปกับ Signalling ซึ่งใช้ได้เฉพาะเมื่อทั้งสองฝั่งและ B2BUA ทุกตัวบนเส้นทางรองรับรูปแบบเดียวกัน

ปัญหา DTMF ส่วนใหญ่คือความไม่ตรงกันระหว่าง Leg เช่น Leg หนึ่งเจรจา telephone-event ด้วย Payload 101 อีก Leg คาดหวัง Payload 96 หรือ SIP INFO และไม่มีอุปกรณ์ใดแปลงให้ ให้ติดตามตัวเลขหนึ่งตัวข้ามทุก Leg เพื่อหาจุดที่ตัวเลขหายไป

NAT, Firewall และบทบาทของ SBC

NAT และ Stateful Firewall ก่อปัญหากับ SIP มากกว่าฟังก์ชันเครือข่ายอื่นใด SIP และ SDP บรรจุ IP Address และ Port ไว้ภายในข้อความ ทั้งใน Via, Contact และบรรทัด c= กับ m= ของ SDP อุปกรณ์ NAT แก้ไขเฉพาะ Header ชั้น IP และ Transport ภายนอก โทรศัพท์หลัง NAT จึงอาจประกาศที่อยู่ Private ที่ปลายทางเข้าถึงไม่ได้ Signalling อาจยังทำงาน เพราะ Response เดินตาม Via แต่ Media ล้มเหลวหรือไปได้ทางเดียว

ลองพิจารณา Extension 1003 ที่ทำงานนอกสำนักงาน มีที่อยู่ Private 192.168.1.50 อยู่หลัง NAT ที่มีที่อยู่ Public 203.0.113.80 REGISTER ของเครื่องนี้มาถึงจาก 203.0.113.80 บน Port ที่ถูกแปลงแล้ว แต่ Contact และ SDP ยังระบุ 192.168.1.50 Registrar, PBX หรือ SBC ต้องตัดสินใจว่าจะเชื่อที่อยู่ใดในแต่ละชั้น และต้องยืนยันเส้นทาง Media ด้วย Packet Capture แทนการอนุมานจาก SIP

ในการออกแบบระดับองค์กร SBC ที่ขอบเครือข่ายคือเครื่องมือหลัก SBC ทำงานแบบ B2BUA ใช้ที่อยู่ Public ของตัวเองใน SIP และ SDP ยึด Media เมื่อจำเป็น และซ่อนโครงสร้างภายใน แต่ยังต้องตั้งค่าให้ถูกต้อง SBC ไม่ได้รับประกัน Routing ที่ถูกต้อง การรองรับ Codec หรือความปลอดภัยด้วยตัวมันเอง

ที่อยู่ระดับ IP, SIP และ SDP ที่แยกกันในตัวอย่าง NAT ซึ่งต้องตรวจสอบเส้นทาง Media
ภาพที่ 10: IP Header, SIP Header และ SDP Body อาจมีที่อยู่ต่างกัน จึงต้องตรวจสอบเส้นทาง Media จริง
กลไกทำอะไรข้อจำกัด
Via received และ rport (RFC 3581)ส่ง Response กลับไปยังที่อยู่และ Port ต้นทางที่มองเห็นจริงไม่ได้แก้ Contact หรือที่อยู่ Media ใน SDP
SIP Outbound (RFC 5626)รักษา Flow ที่ Client เปิดไว้และส่ง Request กลับเข้าทาง Flow นั้นต้องรองรับทั้งที่ Client และ Edge Proxy หรือ Registrar
Connection Reuse (RFC 5923)ใช้ TLS Connection ที่สร้างไว้แล้วส่ง Request ได้ทั้งสองทิศทางใช้ได้ภายใต้กติกาที่กำหนด ไม่ใช่กับทุก TCP Connection
Symmetric RTP (RFC 4961)Endpoint ส่งและรับ Stream บน IP และ Port ภายในเดียวกันช่วยให้ทำ Latching ได้ แต่ไม่ได้นิยามการ Latching ของฝั่งตรงข้าม
Media LatchingSBC หรือ Media Server ส่ง RTP ไปยังต้นทางที่เห็นจริงจาก Endpointต้องให้ Endpoint ส่งก่อน และขึ้นกับนโยบายกันการแย่ง Media
STUN (RFC 8489)ค้นหาที่อยู่และ Port สาธารณะที่ถูก Map ของ Clientไม่ Relay Media และ NAT บางประเภทยังบล็อกเส้นทาง
TURN (RFC 8656)ให้ที่อยู่ Transport แบบ Relay บน Serverต้องมี Relay ที่เข้าถึงได้ และเพิ่ม Latency กับต้นทุน
ICE (RFC 8445)รวบรวม Candidate ทดสอบคู่ที่อยู่ แล้วเลือกเส้นทางที่ใช้ได้ต้องรองรับทั้งสอง Endpoint และใน Signalling

SIP ALG และการออกแบบนโยบาย Firewall

Router และ Firewall จำนวนมากมาพร้อม SIP Application Layer Gateway (ALG) ที่พยายามแก้ที่อยู่ใน SIP และ SDP ระหว่างทาง แต่ละผู้ผลิตทำงานต่างกันมาก และพบบ่อยว่าแก้ไม่ครบ คำนวณ Content-Length ผิด หรือจัดการ TCP Segment ผิดพลาด ALG ยังอ่านหรือแก้ SIP ที่ส่งผ่าน TLS ไม่ได้ เมื่อมี SBC, Hosted PBX ที่จัดการ NAT เอง หรือ SIP Outbound ดูแลการผ่าน NAT อยู่แล้ว คำแนะนำทั่วไปคือปิด ALG เพื่อไม่ให้มีสองกลไกแก้ไขข้อความเดียวกัน

กฎ Firewall ควรแยก Signalling กับ Media ออกจากกัน อนุญาตเฉพาะ Port ของ SIP ที่ใช้จริง เช่น UDP หรือ TCP 5060 หรือ TLS 5061 และจำกัดเฉพาะคู่สื่อสารที่รู้จักเมื่อทำได้ พร้อมอนุญาตช่วง Port ของ RTP ตามที่ตั้งค่าไว้ใน PBX, SBC หรือโทรศัพท์ ควรตรวจช่วง Port จริงจากการตั้งค่าอุปกรณ์แทนการเดาค่าปริยาย และตั้ง UDP Idle Timeout ของ Firewall ให้ยาวกว่ารอบการต่ออายุและ Keepalive

ความปลอดภัยของ SIP: TLS สำหรับ Signalling และ SRTP สำหรับ Media

Signalling และ Media ถูกป้องกันแยกกัน SIP over TLS ซึ่งปกติใช้ Port 5061 จะเข้ารหัสและรักษาความถูกต้องของ Signalling แบบ Hop-by-Hop ระหว่าง Client กับ Proxy หรือระหว่าง Server สองตัว ป้องกันหมายเลขที่โทร ตัวตน Digest Challenge และกุญแจ SRTP ที่อยู่ใน SDP URI แบบ sips ขอให้ใช้ TLS ทุก Hop ไปจนถึงปลายทางรวม Hop สุดท้ายตาม RFC 5630 แนวทางปัจจุบันเลิกใช้ TLS 1.0 และ 1.1 (RFC 8996) และแนะนำ TLS 1.2 หรือ TLS 1.3 (RFC 9325)

TLS ไม่ได้ป้องกัน Media เสียงจะถูกเข้ารหัสเฉพาะเมื่อเจรจา SRTP บน Media Leg แต่ละช่วง และจะได้รับการป้องกันแบบปลายถึงปลายเฉพาะเมื่อไม่มี B2BUA หรือ SBC ตัวใดบนเส้นทางถอดรหัสแล้วเข้ารหัสใหม่ TLS Connection และ SRTP Context แต่ละชุดจึงมีจุดสิ้นสุดของตัวเอง ซึ่งควรระบุไว้ในเอกสารการออกแบบ

เนื่องจาก TLS เป็นแบบ Hop-by-Hop ทุก Proxy หรือ SBC ที่เป็นปลายของ TLS สามารถอ่านและแก้ไขข้อความ SIP ได้ ความน่าเชื่อถือของเครือข่าย SIP จึงขึ้นกับว่าไว้วางใจอุปกรณ์ใดบ้างด้วย ไม่ใช่แค่เรื่องการเข้ารหัส

ขอบเขตการป้องกัน Signalling และ Media รวมถึงจุดสิ้นสุด TLS และ SRTP ในตัวอย่าง
ภาพที่ 11: TLS ป้องกัน Signalling ทีละ Hop ส่วน SRTP ป้องกัน Media โดยมีจุดสิ้นสุดแยกกันในตัวอย่างนี้

ตัวตนผู้โทรและการป้องกัน Toll Fraud

ภายใน Trust Domain เครือข่ายจะยืนยันตัวตนผู้โทรที่ตรวจสอบแล้วด้วย P-Asserted-Identity (RFC 3325) ขณะที่ From ยังเป็นค่าที่ User Agent ต้นทางตั้งเองได้อย่างอิสระ อุปกรณ์ที่ขอบ Trust Domain ต้องลบหรือเขียนทับ P-Asserted-Identity ที่ไม่น่าเชื่อถือซึ่งมาจากภายนอก และ Header Privacy (RFC 3323) ใช้ควบคุมว่าจะซ่อนตัวตนจากผู้รับสายหรือไม่

Toll Fraud มุ่งเป้าไปที่ PBX และ Trunk ที่เปิดสู่อินเทอร์เน็ต มาตรการที่ใช้ได้จริง ได้แก่ ใช้ SIP Credential ที่แข็งแรงและไม่ซ้ำกัน จำกัดอัตราและบล็อกการยืนยันตัวตนที่ล้มเหลวซ้ำ ๆ จำกัดปลายทางต่างประเทศและหมายเลขพิเศษตาม Class of Service จำกัดการเข้าถึง Trunk เฉพาะ IP ที่รู้จักเมื่อผู้ให้บริการรองรับ และเฝ้าดูปริมาณและปลายทางของสายเพื่อหาความผิดปกติ

SIP Trunk, Microsoft Teams Direct Routing และ Voice AI

SIP Trunk เชื่อม PBX กับผู้ให้บริการผ่าน IP แทนสาย Analog หรือวงจร ISDN Primary Rate หมายเลข DID (Direct Inward Dialling) ถูกจับคู่กับ Extension และควรแปลงหมายเลขให้อยู่ในรูปแบบ E.164 ก่อนตัดสินเส้นทาง เช่น +66 ตามด้วยหมายเลขในประเทศที่ตัดเลข 0 นำหน้าออก Trunk ยืนยันตัวตนได้ทั้งแบบลงทะเบียนด้วย Digest Credential หรือแบบ IP Address ที่เชื่อถือได้ ขึ้นกับผู้ให้บริการ

Microsoft Teams Direct Routing เชื่อม Teams Phone เข้ากับ SIP Trunk ผ่าน SBC ที่ Microsoft รับรองสำหรับงานนี้ ฝั่ง Teams ใช้ SIP over TLS และ SRTP และ SBC ทำหน้าที่แปลงระหว่าง Interface นั้นกับ Trunk หรือ PBX รวมถึงการจัดการ Header, Codec และ Media

แพลตฟอร์ม Voice AI เช่น พนักงานรับสายอัตโนมัติและระบบวิเคราะห์เสียงสนทนา มักเชื่อมเข้ากับสายผ่าน SIP Interface หรือการ Fork Media หลักการเดียวกันยังใช้ได้ คือแยกการเชื่อม Signalling ออกจาก Media Stream ยืนยัน Codec และวิธีส่ง DTMF และวัด Latency บนเส้นทาง Media ซึ่งมีผลโดยตรงต่อความเป็นธรรมชาติของบทสนทนา

SIPPER ออกแบบและดูแลการเชื่อมต่อ SIP Trunk, SBC และ Teams Direct Routing สำหรับองค์กร รายละเอียดการเลือกบริการ SIP Trunk อยู่ในบทความที่เกี่ยวข้องด้านล่าง

แนวทางแก้ปัญหา SIP ทีละชั้น

เริ่มจากหลักฐานที่เก็บจากจุดที่ถูกต้อง คือ Packet Capture ฝั่งโทรศัพท์ PBX, SBC และ Interface ที่ต่อกับผู้ให้บริการ โดยจับคู่กันด้วย Call-ID และเวลา บน B2BUA ค่า Call-ID จะเปลี่ยนระหว่าง Leg จึงต้องบันทึกเวลา หมายเลข และ Header สำหรับจับคู่ที่ระบบเพิ่มไว้ด้วย

ตารางนี้จับคู่อาการที่พบบ่อยกับสาเหตุที่เป็นไปได้และหลักฐานแรกที่ควรเก็บ ไล่ตรวจตามลำดับชั้น ได้แก่ Connectivity, Transaction, Dialog และ Route, SDP, RTP และ RTCP แล้วจึงดูพฤติกรรมของแอปพลิเคชัน

ตรวจสอบ Connectivity, Transaction, Dialog/Route, SDP, RTP/RTCP และพฤติกรรมของแอปพลิเคชัน
ภาพที่ 12: ตรวจ Connectivity, Transaction, Dialog และ Route, SDP, RTP และ RTCP แล้วจึงดูพฤติกรรมของแอปพลิเคชัน
อาการสาเหตุที่เป็นไปได้หลักฐานที่ต้องเก็บขั้นแรกในการแยกปัญหา
REGISTER ไม่สำเร็จหรือถูก Challenge ซ้ำCredential หรือ Realm ผิด Algorithm ไม่ตรง Nonce หมดอายุ ส่งผิด Registrar หรือติดนโยบายChallenge และ Request ที่ส่งซ้ำ Log การยืนยันตัวตน และปลายทางที่ส่งจริงเทียบ Challenge แรกกับ Request ถัดไปและผลลัพธ์ของมัน
โทรออกถูกปฏิเสธDial Plan สิทธิ์ ตัวตนผู้โทร ปลายทาง หรือนโยบายของบริการRequest-URI ต้นทางของ Response Header ที่เกี่ยวข้อง และ Log ของ PBX หรือผู้ให้บริการติดตาม Request ไปจนถึงอุปกรณ์ที่ปฏิเสธ
ได้ 200 แล้วสายหลุดACK ไปผิดทางหรือไปไม่ถึง การตัดสินใจของปลายทางหรือแอปพลิเคชัน นโยบาย MediaMethod ที่ได้ 200 ACK ที่ปลายทาง การส่งซ้ำ และ BYE หรือ Reasonยืนยันว่า Dialog ถูกยอมรับแล้วก่อนไปตรวจเสียง
สายหลุดที่เวลาใกล้เคียงกันทุกครั้งSession Refresh, Timeout ของ Transport หรือ NAT ACK ไม่ถึง หรือ Media TimeoutTimeline, Session-Expires การส่งซ้ำ และสถานะ Connectionจับคู่การวางสายกับเหตุการณ์หรือ Timer ที่ตั้งไว้
ไม่มีเสียงหรือได้ยินทางเดียวปลายทาง Media ผิด ถูกกรอง NAT, Codec หรือ SRTP ไม่ตรง หรืออุปกรณ์เสียงเสียSDP ทั้งสองฝั่ง Packet ทั้งสองทิศทาง และสถานะการถอดรหัสและเล่นเสียงเทียบฝั่ง LAN กับ WAN หรือทั้งสองฝั่งของ Media Relay
IVR ไม่รับตัวเลขที่กดวิธีส่ง DTMF หรือ Payload ไม่ตรง จังหวะเวลา หรือ Media หายการจับคู่ telephone-event หรือ Body และ Response ของ INFOติดตามตัวเลขหนึ่งตัวข้ามทุก Leg ที่เกี่ยวข้อง
Hold, Resume หรือโอนสายล้มเหลวDirection ไม่ตรง Offer ซ้อนกัน Target Refresh ผิด ขาด Extension หรือติดนโยบายSDP ก่อนและหลัง CSeq, REFER และ NOTIFY และสถานะของ Call Legหาขั้นตอนแรกที่ State เริ่มไม่ตรงกัน
เสียงขาด ๆ หาย ๆ ทั้งที่ SIP ปกติPacket Loss, Jitter, ความแออัด Capture ตกหล่น หรือปลายทางประมวลผลไม่ทันRTP และ RTCP สถิติของ Interface และค่าที่วัดได้ที่ปลายทางเทียบช่วงเวลา Media เดียวกันจากสองจุด

สายหลุดที่ 32 วินาที: 200 OK ที่ไม่เคยได้รับ ACK

อาการคลาสสิกคือสายติด มีเสียงคุยได้ แล้วหลุดประมาณ 32 วินาทีหลังรับสาย นี่ไม่ใช่การจำกัดระยะเวลาสายที่ตั้งไว้ แต่เป็นวิธีที่ RFC 3261 จัดการ Response กลุ่ม 2xx ที่ไม่ได้รับการยืนยัน หลังส่ง 200 OK ของ INVITE แล้ว UAS Core จะส่ง 200 OK ซ้ำ โดยเริ่มที่ T1 (ค่าปริยาย 500 มิลลิวินาที) และเพิ่มช่วงเวลาเป็นสองเท่าจนถึง T2 (4 วินาที) ไปเรื่อย ๆ จนกว่าจะได้รับ ACK

ถ้าไม่มี ACK มาถึงภายใน 64 เท่าของ T1 ซึ่งเท่ากับ 32 วินาทีเมื่อใช้ค่าปริยาย RFC 3261 ระบุว่า Dialog ยืนยันแล้ว แต่ UAS ควรยุติ Session ด้วยการส่ง BYE (หัวข้อ 13.3.1.4) สาเหตุที่พบบ่อยคือ ACK ถูกส่งไปยังที่อยู่ใน Contact หรือ Record-Route ที่เข้าถึงไม่ได้ ซึ่งมักเป็นที่อยู่ Private หลัง NAT หรือ Firewall หรือ ALG ทิ้ง ACK หรือ Transport สองฝั่งไม่ตรงกัน ให้มองหา 200 OK ที่ถูกส่งซ้ำใน Capture เพราะเป็นลายเซ็นของปัญหานี้

Display Filter ของ Wireshark ที่ใช้บ่อย

Filter ช่วยจำกัดมุมมอง แต่ไม่ได้แทนการอ่าน Dialog ทั้งหมด Wireshark อาจต้องเปิด RTP Heuristic หรือมี SDP อยู่ใน Capture เดียวกันจึงจะถอดรหัส RTP ได้ ก่อนส่ง Capture ออกนอกองค์กร ให้ลบหรือปิดบัง Digest Credential ตัวตนและหมายเลขโทรศัพท์ของบุคคล และกุญแจ SRTP ที่อยู่ใน SDP

  • sip แสดงข้อความ SIP ทั้งหมดใน Capture
  • sip.Call-ID == "call-a-1001-1002@example.com" แยกดูสายเดียวบน Leg เดียว
  • sip.CSeq.method == "INVITE" แสดง INVITE และ Response ของมัน
  • sip.Status-Code >= 400 แสดงเฉพาะ Response ที่เป็นข้อผิดพลาด
  • rtp หรือ rtcp แสดง Media และรายงานของ Media จากนั้นใช้เครื่องมือ RTP Stream Analysis วัด Loss และ Jitter

เอกสารอ้างอิงและมาตรฐาน

รายการด้านล่างคือมาตรฐานหลักที่ใช้ในบทความนี้ กรณีที่ RFC เดิมถูกแทนที่แล้ว จะระบุเอกสารฉบับปัจจุบันไว้ก่อน

  • RFC 3261: SIP โปรโตคอลหลัก
  • RFC 3262: ความ Reliable ของ Provisional Response (100rel และ PRACK)
  • RFC 3263: การค้นหา SIP Server ด้วยระเบียน NAPTR, SRV และ A หรือ AAAA
  • RFC 3264: โมเดล Offer/Answer ร่วมกับ SDP
  • RFC 8866: SDP ซึ่งแทนที่ RFC 4566
  • RFC 3550: RTP และ RTCP และ RFC 3551: Audio/Video Profile ที่กำหนด Static Payload Type
  • RFC 3711: SRTP, RFC 7714: AES-GCM สำหรับ SRTP, RFC 4568 และ RFC 5764: การจัดการกุญแจของ SRTP
  • RFC 3581: rport, RFC 5626: SIP Outbound, RFC 5923: Connection Reuse, RFC 4961: Symmetric RTP
  • RFC 8445, RFC 8489 และ RFC 8656: ICE, STUN และ TURN
  • RFC 3311: UPDATE, RFC 3515: REFER, RFC 3891: Replaces, RFC 4028: Session Timer, RFC 6086: INFO
  • RFC 4733: DTMF แบบ telephone-event ซึ่งแทนที่ RFC 2833 และ RFC 7587: RTP Payload ของ Opus
  • RFC 3325: P-Asserted-Identity, RFC 3323: Privacy, RFC 5630: SIPS, RFC 8760: Digest แบบ SHA-2 สำหรับ SIP, RFC 8996 และ RFC 9325: แนวทางเวอร์ชัน TLS
  • RFC 7118: SIP over WebSocket, RFC 6026: การแก้ไขการจัดการ INVITE Transaction, RFC 6665: SUBSCRIBE และ NOTIFY, RFC 3428: MESSAGE, RFC 3966: tel URI, RFC 3605: RTCP Attribute, RFC 5761: การรวม RTP กับ RTCP บน Port เดียว

คำถามที่พบบ่อย

พร้อมใช้งานจริง?

SIPPER ออกแบบ ติดตั้ง และดูแลระบบโทรศัพท์องค์กรครบวงจร เริ่มต้นด้วยการขอใบเสนอราคาฟรี