SIP Message in Asterisk
SIP Message in Asterisk
หลังจากที่ผมได้ทดลองเขียน SIP Client มาสักพัก ก็เจอสิ่งที่น่าสนใจดังนี้
- การ Register user กับ SIP Server (Asterisk) ครั้งแรก Server จะตอบ 401 UNAUTHORIZED กลับมา เราต้อง AUTHORIZED โดยการใช้ WWW_AUTHENTICATE
- การ Invite user กับ SIP Server ครั้งแรกจะได้ ครั้งแรก Server จะตอบ 407 PROXY_AUTHENTICATION_REQUIRED กลับ เราต้อง AUTHENTICATION โดยการใช้ PROXY_AUTHENTICATE
- CSeq นั้นมีความสำคัญมาก หากเราใช้หมายเลข CSeq เดิม สำหรับการ Request ใหม่ Server จะไม่สนใจ Request นั้น (CSeq จะเพิ่มขึ้นในแต่ละ Request) ในทางกลับกัน การตอบกลับ ACK นั้นจะต้องตรงกับหมายเลข CSeq ที่ส่งมาด้วย
- SIP Client Programmer ทุกคน คงจะเจอ ICMP Unreachable ก็ไม่ต้องแปลกใจนะครับ นั่นคือ การ ปิด SIP Client ของเราลงไปดื้อ ๆ โดยที่ไม่ได้สั่งลา (De Register) นั่นเอง วิธีการ DeRegister ก็คือการส่ง SIP Register ที่มี Expire=0 ใน contact ครับ
- SIP Options จะถูกส่งมาเป็นระยะ ๆ จาก SIP Server ใน RFC 3261 อธิบายว่า Options นั้น ใช้สำหรับ สอบถามข้อมูลเกี่ยวกับ Support feature ที่ client มีความสามารถ โดยที่ไม่จำเป็นต้องไปรบกวน Client (ไป Ring) มากนัก
- ผู้ส่ง ส่ง Invite หาผู้รับ โดยติดต่อผ่านทาง SIP Server ซึ่ง SIP Server จะ Route ไปยังที่อยู่ของผู้รับ โดยใช้ข้อมูลที่ผู้รับได้ Register ไว้ แน่นอนเมื่อ Invite เสร็จเรียบร้อยแล้ว Session จัดตั้งขึ้นมาแล้ว ผู้รับ สามารถส่งข้อมูลผ่าน RTP ไปยังผู้ส่งได้โดยตรง โดยใช้ข้อมูลของผู้ส่งจาก SDP แต่ผู้ส่ง ต้องส่ง ผ่าน SIP Server ไป
- หลังจากนั้น SIP Server จะส่ง Invite ไปหาผู้ส่งอีกรอบ พร้อมทั้งแนบ SDP ที่ใช้ติดต่อผู้รับมาใหม่ ผู้ส่ง สามารถใช้ข้อมูลตรงนี้ เพื่อสร้าง session ไปหาผู้รับโดยตรงได้ใหม่ทันที
- เมื่อผู้รับต้องการยกเลิกการติดต่อ (terminate session) ผู้รับสามารถส่ง Bye หา Server แล้ว Server ก็จะตอบ 200 OK ไปให้ แต่ในกรณีของผู้ส่งนั้น Server จะส่ง Invite ไปให้ก่อน คิดว่าคงจะส่งเพื่อ clean up process ให้เรียบร้อย แล้วค่อยส่ง bye ตามไปให้ ดังนี้
ผู้ส่ง Asterisk ผู้รับ| | | |<-----2 way RTP Peer to Peer---->| | | | | |<-----BYE-------| | |-----200 OK---->| |<--INVITE-------| | |---TRYING------>| | |---200 OK------>| | |<----ACK--------| | |<----BYE--------| | |----200 OK----->| |