RTP หรือ Real Time Protocol เป็นโปรโตคอลที่ใช้นำพาสัญญาณเสียง (และวีดีโอ) ของ VoIP นะครับ รับส่งกันแบบ UDP ไม่ใช่ TCP นะครับ เสียงที่อยู่ในรูปแบบที่บีบอัดแล้วตามโคเด็ค G.723, G.729, G.711 หรือโคเด็คอื่นๆก็จะถูกส่งไปใน RTP นี้ครับ ใช้กับทุกๆ VoIP โปรโตคอลที่มีอยู่บน Asterisk ครับ เช่น SIP, H.323, IAX เป็นต้น
มาดูข้อมูลในไฟล์ /etc/asterisk/rtp.conf กันครับว่ามีออปชั่นอะไรบ้าง แต่ละออปชั่นทำหน้าที่อะไร
[general]
;
; RTP start and RTP end configure start and end addresses
;
; Defaults are rtpstart=5000 and rtpend=31000
;
rtpstart=10000
rtpend=20000
;
; Whether to enable or disable UDP checksums on RTP traffic
;
;rtpchecksums=no
;
; The amount of time a DTMF digit with no 'end' marker should be allowed to continue (in 'samples', 1/8000 of a second)
;
;dtmftimeout=3000
; rtcpinterval = 5000 ; Milliseconds between rtcp reports (min 500, max 60000, default 5000)
;
; Enable strict RTP protection. This will drop RTP packets that do not come from the source of the RTP stream. This option is disabled by default.
; strictrtp=yes
แต่ละบรรทัดมีความหมายดังต่อไปนี้
rtpstart พอร์ต RTP เริ่มต้น ตัวอย่างคือ 10000 เปลี่ยนได้
rtpstop พอร์ต RTP สิ้นสุด ตัวอย่างคือ 20000 เปลี่ยนได้
หมายเหตุ!
1 พอร์ตเริ่มต้น rtpstart ควรเป็นเป็นเลขคู่ เช่น 10000, 10002, 10004 เป็นต้น
2 พอร์ตสุดท้าย rtpend ควรเป็นเลขคู่ ถ้าเราใส่เป็นเลขคี่เช่น 19999 จะทำให้ Asterisk ใช้พอร์ต 20000
3 ต้องเปิดหลายๆพอร์ตครับเพราะจะทำให้ Asterisk รองรับปริมาณ Call ได้มากขึ้น ซึ่งทุกๆ 1 คอลจะใช้ 4 พอร์ตนะครับ Asterisk คุยกับต้นทางใช้ 2 พอร์ตคือ RTP และ RTCP ซึ่งเกิดคู่กัน และอีก 2 พอร์ตสำหรับ Asterisk คุยกับปลายทาง
4 RTCP ย่อมาจาก Real Time Control Protocol เป็นพอร์ต UDP เช่นเดียวกับ RTP แต่ไม่ได้นำพาสัญญาณเสียง ใช้เพื่อการควบคุม RTP ที่คู่กับมันเท่านั้น
5 พอร์ตที่ใช้งานนี้ Asterisk จะเป็นคนเลือกนะครับโดยจะใช้พอร์ตที่ยังว่างอยู่ และต้องมั่นใจว่าจะไม่มีโปรแกรมอื่นที่ใช้งานพอร์ต UDP ในช่วงนี้ (ก็คงไม่มีหรอกครับ แต่ก็เช็คด้วยเพื่อความชัวร์)
6 ในจำนวนพอร์ตทั้งหมดตั้งแต่ rtpstart จนถึง rtpend นะครับ Asterisk มันก็ไม่ได้ใช้ทุกพอร์ต มันจะใช้แค่พอร์ตเลขคู่เท่านั้น เช่น 10000, 10002, 10004 เป็นต้น
7 มาคำนวณเล่นๆกันครับ สมมติว่าถ้าต้องการให้ Asterisk รองรับ Concurrent Calls ได้ 100 Calls ต้องเปิดกี่พอร์ต ถ้า rtpstart = 20000 โดยใน 1 Concurrent Call จะนับจาก Asterisk ไปยังต้นทาง (หรือปลายทาง) เท่านั้นนะครับ ดังนั้นถ้าต้นทางคุยกับปลายทางผ่าน Asterisk จะนับเป็น 2 Concurrent Calls
1 Concurrent Call จะใช้ 2 พอร์ต (ประกอบด้วย RTP และ RTCP) ดังนั้น 100 Calls ก็ต้องใช้ 200 พอร์ต และดังนั้น rtpend = 20200 เพราะเราไม่ลงท้ายด้วยพอร์ตเลขคี่ แต่ในความเป็นจริงเวลาเปิดพอร์ต เขาบอกว่าให้เปิดอย่างน้อย 4 เท่าของพอร์ตที่ต้องการใช้งาน ดังนั้นกรณีนี้ rtpend= 20800 หรือ 21000 เลยครับ
มาดูกันครับว่าใน SIP Message มีใส่พอร์ต RTP เข้าไปตรงไหน ดูตัวอย่างกันเลยครับ ใช้โปรแกรม Ngrep ดูนะครับ
U 192.168.4.5:5060 -> 192.168.4.123:5060
INVITE sip:6621010000@192.168.4.123:5060;user=phone SIP/2.0..Via: SIP/2.0/UDP 192.168.4.5:5060;branch=z9hG4bK1ca4589054b6642c
5-86601-0..Max-Forwards: 70..Contact: <sip:66858350000@192.168.4.5:5060>..To: <sip:6621010000@192.168.4.123:5060>..From: <sip
:66858350000@192.168.4.5:5060>;tag=30f2745d-co5504-INS001..Call-ID: 4cf422331556663a1c22163e4404390f@192.168.4.5..CSeq: 550401
INVITE..Content-Type: application/sdp..Date: Mon, 01 Feb 2010 02:56:05 GMT..User-Agent: ENS2.5.31-IS1-RMRG23-RG100-CPO1764..Co
ntent-Length: 306....v=0..o=- 821195869 821195869 IN IP4 192.168.4.5..s=ENSResip..c=IN IP4 192.168.4.5..t=0 0..m=audio 12282
RTP/AVP 18 8 0 4 2 97..a=fmtp:97 0-15..a=rtpmap:18 G729/8000..a=rtpmap:8 PCMA/8000..a=rtpmap:0 PCMU/8000..a=rtpmap:4 G723/8000
..a=rtpmap:2 G726-32/8000..a=rtpmap:97 telephone-event/8000..a=sendrecv..
ตัวเลขที่เป็นสีแดงคือหมายเลขพอร์ต RTP ที่ 192.168.4.5 เปิดรอรับคอนเน็คชั่นของ โดยจะรอรับที่ไอพีแอดเดรสที่อยู่ใน c=IN IP4 นั่นคือไอพี 192.168.4.5 ไอพีเดียวกับ SIP Server แต่ก็อาจจะไม่ใช่ไอพีเดียวกับ SIP Server เสมอไปนะครับถ้ามีการแยก Signaling และ Media Server เป็นคนละตัวกัน (เพื่อลดโหลดของ SIP Server)
ทีนี้มาดู SIP Message เมื่อปลายทางรับสายบ้าง ซึ่ง Asterisk SIP Server ปลายทางจะส่ง 200 OK กลับมา
U 192.168.4.123:5060 -> 192.168.4.5:5060
SIP/2.0 200 OK..Via: SIP/2.0/UDP 192.168.4.5:5060;branch=z9hG4bK1ca4589054b6642c5-86601-0..Record-Route: <sip:192.168.4.123:5
060;lr>..From: <sip:66858350000@192.168.4.5:5060>;tag=30f2745d-co5504-INS001..To: <sip:6621010000@192.168.4.123:5060>;tag=as2
62c0af6..Call-ID: 4cf422331556663a1c22163e4404390f@192.168.4.5..CSeq: 550401 INVITE..User-Agent: DIDWW..Allow: INVITE, ACK, CAN
CEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY..Supported: replaces..Contact: <sip:6621010000@192.168.4.123:5060>..Content-Type:
application/sdp..Content-Length: 306....v=0..o=root 650 651 IN IP4 192.168.4.36..s=session..c=IN IP4 192.168.4.36..t=0 0..m=a
udio 15832 RTP/AVP 18 8 0 97..a=rtpmap:18 G729/8000..a=fmtp:18 annexb=no..a=rtpmap:8 PCMA/8000..a=rtpmap:0 PCMU/8000..a=rtpmap:
97 telephone-event/8000..a=fmtp:97 0-16..a=silenceSupp:off - - - -..a=ptime:20..a=sendrecv..
ใน Message 200 OK นี้จะบอกว่าปลายทางรอรับ RTP ที่ไอพีแอดเดรส 192.168.4.36 คนละไอพีกับ SIP Server นะครับเพราะว่าเขาแยก SIP Server และ Media Server เป็นคนละตัวกัน ส่วนพอร์ตคือ 15832
จากนั้นโฟลว์การไหลของเสียงพูด (RTP) จะเป็นแบบนี
192.168.4.5 (12282) --> 192.168.4.36 (15832)
192.168.4.36 (15832) --> 192.168.4.5 (12282)
เมื่อวางสายก็จะกลับมาเป็นโฟลว์ของ SIP Signaling (UDP) แบบนี้
192.168.4.5 (5060) -> 192.168.4.123 (5060)
192.168.4.123 (5060) -> 192.168.4.5 (5060)
ถ้าในเน็ตเวอร์คมีการใช้ไฟร์วอลล์ เช่น iptables ก็อย่าลืมเปิดให้พอร์ต RTP วิ่งได้ด้วยนะครับ เปิดให้เต็มช่วงเลยตั้งแต่ rtpstart จนถึง rtpend สำหรับ iptables เปิดแบบนี้ครับ
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 10000:20000 -j ACCEPT