
VoIP Fundamentals — พื้นฐานที่ต้องรู้
VoIP (Voice over Internet Protocol) คือเทคโนโลยีการส่งเสียงผ่านเครือข่าย IP แทนที่จะใช้สายโทรศัพท์แบบเดิม (PSTN) ระบบ VoIP ประกอบด้วย Protocol หลัก 2 ตัว:
SIP (Session Initiation Protocol): ทำหน้าที่ “ควบคุมการโทร” — เริ่มการโทร รับสาย วางสาย เหมือน “พนักงานต่อสาย” ที่จัดการว่าใครจะคุยกับใคร SIP ใช้ Port 5060 (UDP/TCP) หรือ 5061 (TLS) SIP ไม่ได้ส่งเสียงเอง แค่ตั้ง Session ขึ้นมา
RTP (Real-time Transport Protocol): ทำหน้าที่ “ส่งเสียงจริง” — เมื่อ SIP ตั้ง Session แล้ว เสียงจะถูกส่งผ่าน RTP ใช้ Port range 10000-20000 (UDP) แต่ละฝั่งจะส่ง RTP stream กัน
Codecs: Codec คือตัวแปลงเสียงเป็น Digital data ที่ส่งผ่าน Network ได้:
| Codec | Bitrate | คุณภาพ | Bandwidth ที่ใช้ | เหมาะกับ |
|---|---|---|---|---|
| G.711 (PCMU/PCMA) | 64 kbps | สูง (Toll quality) | ~87 kbps (+ header) | LAN, bandwidth เหลือเยอะ |
| G.729 | 8 kbps | ปานกลาง | ~31 kbps | WAN, bandwidth จำกัด |
| G.722 (HD Voice) | 64 kbps | สูงมาก (Wideband) | ~87 kbps | HD call, Conference |
| Opus | 6-510 kbps | สูงมาก (Adaptive) | แล้วแต่ Setting | WebRTC, Modern systems |
Capturing VoIP Traffic — เก็บ Packet VoIP
การ Setup Capture
VoIP traffic ส่งผ่าน Network ปกติ ดังนั้นต้อง “เห็น” Traffic ก่อนจึงจะ Capture ได้:
วิธีที่ 1: SPAN/Mirror Port — ตั้งค่า Switch ให้ Copy traffic จาก Port ที่ VoIP phone/server เชื่อมต่ออยู่ ไปยัง Port ที่ Wireshark เชื่อมต่อ:
# Cisco Switch — SPAN configuration
Switch(config)# monitor session 1 source interface Gi0/1
Switch(config)# monitor session 1 destination interface Gi0/24
# Gi0/1 = Port ที่ IP Phone / PBX เชื่อมต่อ
# Gi0/24 = Port ที่ PC ที่รัน Wireshark เชื่อมต่อ
# HP/Aruba Switch
Switch(config)# mirror-port 24
Switch(config)# interface 1 monitor
วิธีที่ 2: Capture บน PBX Server — ถ้า PBX เป็น Software-based (Asterisk, FreePBX, 3CX) สามารถ Capture บน Server นั้นได้โดยตรง:
# Capture บน Asterisk server
tcpdump -i eth0 -w voip_capture.pcap port 5060 or portrange 10000-20000
# หรือเฉพาะ SIP
tcpdump -i eth0 -w sip_only.pcap port 5060
# Capture เฉพาะ IP ที่สนใจ
tcpdump -i eth0 -w specific.pcap host 192.168.1.100 and \(port 5060 or portrange 10000-20000\)
วิธีที่ 3: Capture Filter ใน Wireshark — ตั้ง Capture filter ก่อนเริ่ม Capture เพื่อลดขนาดไฟล์:
# Wireshark Capture Filters
# จับเฉพาะ SIP traffic
port 5060
# จับ SIP + RTP
port 5060 or portrange 10000-20000
# จับ VoIP จาก/ไป IP ที่กำหนด
host 192.168.1.100 and (port 5060 or portrange 10000-20000)
# จับ SIP over TLS
port 5061
SIP Message Analysis — วิเคราะห์ SIP Messages
SIP Call Flow — การโทรปกติ
การโทร SIP ปกติจะมี Message flow ดังนี้:
Caller (A) PBX/Proxy Callee (B)
| | |
|--- INVITE ------->| |
|<-- 100 Trying ----| |
| |--- INVITE ------->|
| |<-- 100 Trying ----|
| |<-- 180 Ringing ---|
|<-- 180 Ringing ---| |
| |<-- 200 OK --------|
|<-- 200 OK --------| |
|--- ACK ---------->|--- ACK ---------->|
| | |
|<=============== RTP (Voice) ==========>|
| | |
|--- BYE ---------->|--- BYE ---------->|
|<-- 200 OK --------|<-- 200 OK --------|
SIP Messages สำคัญ:
| Message | Type | ความหมาย |
|---|---|---|
| INVITE | Request | เริ่มการโทร ระบุ Codec, IP, Port ที่ต้องการ |
| 100 Trying | Response | PBX รับ Request แล้ว กำลังประมวลผล |
| 180 Ringing | Response | เครื่องปลายทางกำลังดังกริ่ง |
| 200 OK | Response | รับสายแล้ว (หรือ Request สำเร็จ) |
| ACK | Request | ยืนยันการรับ 200 OK → เริ่ม Media stream |
| BYE | Request | วางสาย / จบการโทร |
| CANCEL | Request | ยกเลิกการโทรก่อนรับสาย |
| REGISTER | Request | IP Phone ลงทะเบียนกับ PBX |
| OPTIONS | Request | เช็คว่า Server ยังทำงานอยู่ (Keep-alive) |
SIP Error Codes — รหัสข้อผิดพลาด
| Code | ความหมาย | สาเหตุที่เป็นไปได้ |
|---|---|---|
| 400 Bad Request | SIP message ไม่ถูก Format | Misconfigured phone, Incompatible SIP version |
| 401 Unauthorized | ต้อง Authenticate ก่อน | ปกติ IP Phone จะส่ง Credentials ใหม่อัตโนมัติ |
| 403 Forbidden | ไม่มีสิทธิ์โทร | Dial plan restrictions, ACL block |
| 404 Not Found | เบอร์ไม่มีอยู่ | Extension ไม่มี, Wrong dial plan |
| 408 Request Timeout | ไม่ได้รับ Response ในเวลาที่กำหนด | Network issue, Endpoint offline |
| 480 Temporarily Unavailable | ปลายทางไม่ว่าง/ไม่ได้ลงทะเบียน | Phone offline, DND enabled |
| 486 Busy Here | สายไม่ว่าง | กำลังคุยโทรศัพท์อยู่ |
| 488 Not Acceptable Here | Codec ไม่ Match | Codec mismatch ระหว่างสองฝั่ง |
| 500 Server Internal Error | PBX เกิดข้อผิดพลาดภายใน | PBX crash, Configuration error |
| 503 Service Unavailable | PBX ไม่สามารถให้บริการได้ | PBX overloaded, Maintenance |
วิเคราะห์ SIP ใน Wireshark
# Wireshark Display Filters สำหรับ SIP
# แสดงเฉพาะ SIP traffic
sip
# แสดงเฉพาะ INVITE (เริ่มการโทร)
sip.Method == "INVITE"
# แสดงเฉพาะ Error responses (4xx, 5xx)
sip.Status-Code >= 400
# แสดงเฉพาะ Registration
sip.Method == "REGISTER"
# แสดงเฉพาะ Registration failures
sip.Method == "REGISTER" && sip.Status-Code >= 400
# แสดงเฉพาะ SIP จาก/ไป Extension ที่ต้องการ
sip.from.user == "1001" || sip.to.user == "1001"
# แสดงเฉพาะ Call-ID ที่สนใจ
sip.Call-ID == "[email protected]"
RTP Stream Analysis — วิเคราะห์ RTP
RTP คุณภาพเสียง Metrics
Wireshark สามารถวิเคราะห์คุณภาพเสียง VoIP ได้จาก RTP stream:
| Metric | ค่าที่ดี | ค่าที่ยอมรับได้ | ค่าที่ไม่ดี | ผลกระทบ |
|---|---|---|---|---|
| Jitter | < 20 ms | 20-50 ms | > 50 ms | เสียงกระตุก ขาดหาย |
| Packet Loss | < 1% | 1-3% | > 3% | เสียงขาดหาย คุณภาพลด |
| Latency (one-way) | < 150 ms | 150-300 ms | > 300 ms | Delay ในการสนทนา |
| MOS Score | 4.0-4.5 | 3.5-4.0 | < 3.5 | คุณภาพเสียงโดยรวม |
MOS Score (Mean Opinion Score): คะแนนคุณภาพเสียง 1-5 โดย 5 = เสียงสมบูรณ์แบบ, 4 = ดี (เทียบเท่าโทรศัพท์ปกติ), 3 = พอใช้ (เริ่มมี Artifacts), 2 = ไม่ดี (เข้าใจลำบาก), 1 = ใช้ไม่ได้
วิเคราะห์ RTP ใน Wireshark
# Wireshark Display Filters สำหรับ RTP
# แสดงเฉพาะ RTP traffic
rtp
# แสดง RTP จาก IP ที่กำหนด
rtp && ip.src == 192.168.1.100
# แสดง RTCP (control protocol สำหรับ RTP stats)
rtcp
# วิเคราะห์ RTP Stream:
# Wireshark → Telephony → RTP → RTP Streams
# จะเห็น: SSRC, Codec, Packets, Lost, Max Jitter, Mean Jitter
# ฟังเสียงจาก RTP Stream:
# Wireshark → Telephony → RTP → RTP Streams → เลือก Stream → Play Streams
# ดู Flow Sequence:
# Wireshark → Telephony → VoIP Calls → เลือก Call → Flow Sequence
# จะเห็น SIP message flow แบบ Diagram
Wireshark VoIP Menu — เครื่องมือสำหรับ VoIP โดยเฉพาะ
Wireshark มีเมนู Telephony ที่ออกแบบมาสำหรับ VoIP โดยเฉพาะ:
Telephony → VoIP Calls: แสดงรายการการโทรทั้งหมดในไฟล์ Capture: Start time, From, To, Protocol, Duration, State (Completed, In call, Rejected, Cancelled) สามารถเลือก Call แล้วดู Flow Sequence หรือ Play Audio ได้
Telephony → RTP → RTP Streams: แสดง RTP stream ทั้งหมด: Source/Destination IP:Port, SSRC, Codec, Packet count, Lost packets, Max/Mean jitter ถ้า Packet loss สูงหรือ Jitter สูง → ปัญหาเรื่อง Network
Telephony → RTP → RTP Player: เล่น Audio จาก RTP stream ได้เลยใน Wireshark ช่วยยืนยันว่าคุณภาพเสียงเป็นอย่างไร ได้ยินเสียง Choppy จริงหรือไม่
Telephony → SIP Flows: แสดง SIP message flow แบบ Diagram (Ladder diagram) เห็น Request/Response ระหว่าง Endpoints ชัดเจน ช่วย Debug ปัญหาเช่น Call setup ล้มเหลวเพราะ Missing 200 OK
Troubleshooting: One-Way Audio
One-Way Audio คือปัญหาที่ฝั่งหนึ่งได้ยินเสียง แต่อีกฝั่งไม่ได้ยิน เป็นปัญหาที่พบบ่อยที่สุดใน VoIP:
สาเหตุ #1: NAT Traversal issue
เมื่อ IP Phone อยู่หลัง NAT (Router/Firewall) SIP INVITE จะระบุ Private IP (เช่น 192.168.1.100) ใน SDP body แต่ปลายทางอยู่บน Public network → ส่ง RTP กลับไปที่ Private IP ไม่ได้ → ฝั่งที่อยู่หลัง NAT ไม่ได้ยินเสียง
# ดู SDP ใน INVITE message (Wireshark)
# c=IN IP4 192.168.1.100 ← Private IP!
# m=audio 10000 RTP/AVP 0 ← RTP port
# แก้ไข:
# 1. เปิด SIP ALG บน Firewall/Router (บางครั้งต้อง "ปิด" แทน เพราะ ALG ทำงานผิด)
# 2. ใช้ STUN/TURN server
# 3. ตั้ง External IP ใน PBX configuration
# Asterisk: externip=203.xxx.xxx.xxx ใน sip.conf หรือ pjsip.conf
# FreePBX: Settings → Asterisk SIP Settings → External Address
สาเหตุ #2: Firewall blocking RTP
Firewall อาจเปิด Port 5060 (SIP) แต่ไม่ได้เปิด RTP port range (10000-20000) ทำให้ SIP call setup สำเร็จ แต่ Audio ไม่ผ่าน
# ตรวจสอบใน Wireshark:
# ถ้าเห็น SIP INVITE → 200 OK → ACK สำเร็จ
# แต่ RTP packets ไป Direction เดียว → Firewall block
# แก้ไข: เปิด UDP port range สำหรับ RTP
# iptables
iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT
# Cisco ASA
access-list VOIP_IN extended permit udp any host PBX_IP range 10000 20000
สาเหตุ #3: Codec mismatch
ถ้าสองฝั่งไม่ Support Codec เดียวกัน อาจเจรจา Codec สำเร็จแต่ Audio decode ไม่ได้ ดู SDP ใน 200 OK ว่า Codec ที่ตกลงกันคืออะไร
Troubleshooting: No Audio (ไม่ได้ยินเสียงทั้งสองฝั่ง)
ขั้นตอนวิเคราะห์:
- ดู SIP flow — Call setup สำเร็จไหม? มี 200 OK + ACK ไหม?
- ดู RTP streams — มี RTP stream ไหม? ถ้าไม่มีเลย = Media path ถูก Block ทั้งหมด
- ดู SDP — IP address และ Port ใน SDP ถูกต้องไหม? มี Private IP ไหม?
- ดู Firewall logs — มี Dropped packets บน RTP port range ไหม?
# Wireshark Analysis Steps:
# 1. Filter: sip
# 2. ดู INVITE → 200 OK → ACK sequence
# 3. Click ที่ INVITE → expand "Session Description Protocol"
# 4. ดู c= (Connection) address → ถูกต้องไหม?
# 5. ดู m= (Media) → port ถูกต้องไหม?
# 6. Filter: rtp → มี packets ไหม?
# 7. Telephony → RTP Streams → ดู packet count ทั้งสองฝั่ง
Troubleshooting: Choppy Audio (เสียงกระตุก ขาดหาย)
เสียงกระตุกมักเกิดจาก Network quality:
Jitter สูง: ใน Wireshark → Telephony → RTP Streams → ดู Max Jitter ถ้า > 50 ms เสียงจะกระตุก แก้โดยตั้ง QoS (Quality of Service) บน Network equipment:
# QoS Configuration — Prioritize VoIP traffic
# Cisco Switch
Switch(config)# mls qos
Switch(config)# interface range Gi0/1-24
Switch(config-if-range)# mls qos trust dscp
# Mark VoIP packets with EF (Expedited Forwarding) DSCP value
# SIP: DSCP 26 (AF31) or 24 (CS3)
# RTP: DSCP 46 (EF)
# Cisco Router — Policy-map
Router(config)# class-map match-any VOIP
Router(config-cmap)# match dscp ef
Router(config-cmap)# match dscp af31
Router(config)# policy-map QOS_POLICY
Router(config-pmap)# class VOIP
Router(config-pmap-c)# priority percent 30
Packet Loss สูง: ดู RTP Streams ถ้า Lost > 3% → ตรวจสอบ: Interface errors (CRC, Runts) บน Switch, Network congestion (Bandwidth เต็ม), Duplex mismatch (Half vs Full duplex), Faulty cable/port
Network Congestion: VoIP ไม่ทน Congestion เหมือน Data traffic เพราะ Real-time ถ้า Network มี Congestion, Data download จะช้าลงแต่ยังใช้ได้ แต่ VoIP จะเสียงกระตุกหรือขาดหายเพราะ Delay/Loss ที่เกิดขึ้น
Troubleshooting: Registration Failures
เมื่อ IP Phone ลงทะเบียนกับ PBX ไม่สำเร็จ:
# Filter: sip.Method == "REGISTER"
# ดู Response:
# 401 Unauthorized (ปกติ ครั้งแรก)
# REGISTER → 401 (Challenge) → REGISTER (with auth) → 200 OK
# ถ้าวนลูป 401 ไม่หยุด = Username/Password ผิด
# 403 Forbidden
# = Account ถูก Lock, IP ถูก Block, ACL ไม่อนุญาต
# 408 Request Timeout
# = PBX ไม่ได้รับ REGISTER (Network issue, Firewall block port 5060)
# ตรวจสอบใน Wireshark:
# 1. ดู From: header → username ถูกไหม?
# 2. ดู To: header → SIP domain ถูกไหม?
# 3. ดู Contact: header → IP address ของ Phone ถูกไหม?
# 4. ดู Authorization: header → Credentials ถูก hash ส่งมาไหม?
Troubleshooting: Call Setup Failures
เมื่อโทรออกแต่ไม่สำเร็จ (ไม่ดัง ไม่ได้ยิน Ringback tone):
# Filter: sip.Method == "INVITE"
# ดู Response ที่ได้กลับมา:
# ไม่ได้ Response เลย (INVITE → timeout)
# = Network issue, Destination unreachable, Firewall block
# 404 Not Found
# = Extension ไม่มี → ตรวจ Dial plan
# 480 Temporarily Unavailable
# = Extension ไม่ได้ Register → ตรวจ Phone status
# 486 Busy Here
# = สายไม่ว่าง → ปกติ
# 488 Not Acceptable Here
# = Codec mismatch → ตรวจ Codec settings ทั้งสองฝั่ง
# ดู SDP ใน INVITE: a=rtpmap:0 PCMU/8000
# ดู SDP ใน 488: อาจไม่มี Codec ที่ Match
# 503 Service Unavailable
# = PBX overloaded หรือ Trunk เต็ม
QoS Verification — ตรวจสอบ QoS
ใช้ Wireshark ตรวจว่า VoIP packets ได้รับ QoS marking ที่ถูกต้อง:
# Wireshark Display Filter: ตรวจ DSCP marking
# ดู VoIP packets ที่ควรได้ EF (DSCP 46)
ip.dsfield.dscp == 46
# ดู SIP packets ที่ควรได้ AF31 (DSCP 26)
ip.dsfield.dscp == 26
# ดูว่ามี Packet ที่ไม่ได้รับ QoS marking ไหม
# (RTP packets ที่ DSCP = 0 แสดงว่า QoS ไม่ทำงาน)
rtp && ip.dsfield.dscp == 0
# ถ้า DSCP = 0 ตลอด:
# 1. IP Phone ไม่ได้ Mark DSCP → ตั้งค่าใน Phone settings
# 2. Switch strip DSCP → ตั้ง "mls qos trust dscp"
# 3. Router re-mark → ตรวจ Policy-map
NAT Traversal Issues — ปัญหา NAT
NAT เป็นศัตรูหมายเลข 1 ของ VoIP เพราะ SIP ฝัง IP address ไว้ใน Message body (SDP) ไม่ใช่แค่ IP header:
ปัญหา: IP Phone อยู่หลัง NAT (192.168.1.100) ส่ง INVITE ไปหา PBX ที่ Public IP SIP message บอกว่า "ส่ง RTP มาที่ 192.168.1.100:10000" แต่ PBX อยู่ภายนอก NAT → ส่ง RTP ไปที่ 192.168.1.100 ไม่ได้
Solutions:
- STUN (Session Traversal Utilities for NAT): IP Phone ถาม STUN server ว่า Public IP คืออะไร แล้วใส่ Public IP ใน SDP แก้ปัญหา NAT แบบง่าย
- TURN (Traversal Using Relays around NAT): ถ้า STUN ไม่ได้ (Symmetric NAT) ใช้ TURN server เป็น Relay ส่ง Media ผ่าน TURN server แทน มีค่า Latency เพิ่ม
- SIP ALG (Application Layer Gateway): Router/Firewall แก้ IP address ใน SIP message ให้อัตโนมัติ แต่บ่อยครั้ง SIP ALG ทำงานผิด → แนะนำ "ปิด" SIP ALG บน Consumer router
- Session Border Controller (SBC): อุปกรณ์เฉพาะทางสำหรับ NAT traversal + Security สำหรับ Enterprise VoIP
SIP TLS / SRTP — VoIP Security
VoIP traffic ที่ไม่ Encrypt สามารถถูก Capture และฟังได้ (Eavesdropping):
SIP TLS: Encrypt SIP signaling (Port 5061 แทน 5060) ป้องกันไม่ให้เห็น Call details (ใครโทรหาใคร เมื่อไหร่) ใน Wireshark จะเห็น TLS handshake แต่ไม่เห็น SIP message content
SRTP (Secure RTP): Encrypt voice stream ป้องกันไม่ให้ฟังเสียงสนทนา ใน Wireshark จะเห็น SRTP packets แต่ Play audio ไม่ได้ (Encrypted)
# Wireshark: ถ้ามี Key สามารถ Decrypt ได้
# Edit → Preferences → Protocols → SIP (for TLS)
# Edit → Preferences → Protocols → SRTP (for Secure RTP)
# วิเคราะห์ TLS handshake:
# Filter: tls && tcp.port == 5061
# ดู: TLS version, Cipher suite, Certificate
# ถ้าเจอปัญหา TLS:
# - Certificate expired → ตรวจ Not After date
# - Cipher mismatch → ดู Client Hello vs Server Hello
# - Self-signed cert rejected → ต้อง Import cert ที่ Phone
Wireshark VoIP Troubleshooting Checklist
| ปัญหา | สิ่งที่ต้องดูใน Wireshark | Filter |
|---|---|---|
| โทรไม่ติด | SIP INVITE response code | sip.Method == "INVITE" |
| ลงทะเบียนไม่ได้ | SIP REGISTER response | sip.Method == "REGISTER" |
| เสียงฝั่งเดียว | RTP stream direction, SDP IP | rtp, ดู Telephony → RTP Streams |
| ไม่มีเสียงเลย | RTP packets existence, SDP | rtp, sip → ดู SDP body |
| เสียงกระตุก | Jitter, Packet loss ใน RTP | Telephony → RTP Streams |
| เสียง Delay | Latency ระหว่าง Endpoints | Statistics → IO Graph |
| Codec mismatch | SDP codec list ใน INVITE/200 | sip → ดู SDP a=rtpmap |
| QoS ไม่ทำงาน | DSCP value ใน IP header | ip.dsfield.dscp == 46 |
สรุป
Wireshark เป็นเครื่องมือที่ทรงพลังมากสำหรับ VoIP troubleshooting เพราะให้เห็น "ทุกอย่าง" ที่เกิดขึ้นบน Network ตั้งแต่ SIP signaling (ใครโทรหาใคร ผลลัพธ์เป็นอย่างไร) ไปจนถึง RTP media (คุณภาพเสียงเป็นอย่างไร Jitter/Loss เท่าไหร่)
เริ่มต้น VoIP troubleshooting ด้วย Wireshark ให้ทำตามขั้นตอน: 1) Capture traffic ที่ถูกจุด (SPAN port หรือบน PBX), 2) ใช้ Telephony → VoIP Calls ดูภาพรวม, 3) ดู SIP flow sequence เข้าใจ Call setup, 4) ดู RTP streams เข้าใจ Media quality, 5) ตรวจ SDP, NAT, QoS ตาม Checklist การฝึกวิเคราะห์ Capture file บ่อยๆ จะทำให้คุณ Troubleshoot VoIP ได้รวดเร็วขึ้นอย่างมากเมื่อเกิดปัญหาจริง