李思銳 voip_taiwan@yahoo.com.tw VoIP系統與SIP協定 李思銳 voip_taiwan@yahoo.com.tw
大綱 VoIP 導論 電路交換與分封交換 FXS FXO T1 E1等電信介面之簡介 網路基本概念 Linux和Open Source 語音壓縮基本概念 封包大小與流量之計算
Telcom, Datacom Circuit switch: 電路交換 Packet switch: 分封交換 Example: (2G) GSM: Circuit switch (2.5G) GPRS: Circuit switch (voice) + Packet switch (data) (3G) CDMA: Packet switch
Communication Physical layer Protocol layer
Communication Example UART (TX, RX, Ground) or RS232 interface 115200, 8N1, XMODEM Telephony interface Dial Pulse or DTMF (dual-tone multi-frequency)
Dial Pulse 北美: 60 (on) : 40 (off) 歐洲: 63 (on) : 37 (off) 6~15 (8~10) pulses per second Mark (on), Break (off), Pause 所以傳統類比電話系統可以使用勾鍵(Hook)撥號
DTMF Tone Frequencies 雙音複頻 兩個不同頻率的聲音耦合 使用4x4的table表, 可以表達1, …, 9, #, 0, *, A, B, C, D的訊息
DTMF row frequency ROW 0: 697 Hz ROW 1: 770 Hz ROW 2: 852 HZ
DTMF col frequency COL 0: 1209 Hz COL 1: 1336 Hz COL 2: 1477 Hz
SIP Signaling RFC 2833 INFO messages or RTP messages Event 0~9: coding 0~9 Event *: 10 Event #: 11 Event A~D: 12~15 Event Flash: 16
FXS, FXO FXS: Foreign Exchange Station, interface provides power (battery) and generates ring signals, SLIC FXO: Foreign Exchange Office, interface receives power (battery) and receives ring signals, DAA
PCM PCM (pulse-code modulation) 類比數位的轉換 動作程序為: 取樣 量化 編碼
Sampling Sampling (取樣) 8 KHz, the voice frequency range is 0~4000 (300~3400), by Nyquist Theory, sampling speed must be taken greater (or equal) than double with frequency (s>=2f)
Quantifying Quantifying (量化) linear scale (線性量化) logarithmic scale (非線性量化)
Coding Coding (編碼) 8 bits (傳統電信) 16 bits, …
linear scale 如果編碼為n-bits, 將聲音頻率等分為2^n 例如, 如果編碼為8-bits, 那量化階度為等分256階 常見者為PCM8, PCM16
logarithmic scale 通常聲音頻率落在中間居多, 越高頻出現的機會較低, 為了讓量化更準確, 將聲音出現機率越高的頻段切分的更細, 以提高量化的準確度 常見者為G.711 u-Law和A-Law
u-law量化方式 y = ln(1 + ux) / ln(1 + u) where u = 255
A-law量化方式 y = Ax / (1 + ln A) for x <= 1/A y = (1 + ln Ax) / (1 + ln A) for 1/A <= x <= 1 where A = 87.6
CCS, CAS CCS: Common Channel Signaling 信令在獨立的通道上傳送, 因此信令的實體線路或路由可以和語音通道不同 CAS: Channel Associated (Access) Signaling 信令附加在語音通道, 所以信令的實體線路或路由可以和語音通道相同
Traditional Trunk 2-wire CO 2-wire E&M: E(RX), M(TX), G (Ground), B (Battery) 4-wire E&M: E1, E2, M1, M2, G, B 2-wire E&M and 4-wire E&M都是一路的語音中繼線路, 但是4-wire E&M的傳輸距離較遠
FDM, TDM FDM: 劃頻多工 對特定範圍的頻帶切割, 已傳輸多路的訊息, 例如廣播系統中的FM TDM: 劃時多工 利用切割時間的不同, 來達成同時傳輸多路的訊息, 類似電腦系統中的multi-task概念, 也因為要切割時間, 所以需要同步. 我們稱每個切割出來的區間為Time Slot, 若是用來傳遞語音則也稱為Voice Channel
TDM trunk T1 CAS: TS 0~23: Voice Channel using 1 bit as signaling every 6 TS I bit addition for sync. E1 CCS: TS 0: Frame Sync. and Alarm TS 1~15: Voice Channel TS 16: Signaling TS 17~31: Voice Channel
T1 PCM Sampling Rate: 8 KHz Encoding Law: u-law Bit Rate: 1.544 Mbps 8 KHz*(8 bits*24 TS+1 bit sync) Code: AMI, B8ZS Impedance: 100 Ohms Standard
E1 PCM Sampling Rate: 8KHz Encoding Law: A-law Bit Rate: 2.048Mbps 8 KHz * 8 bits * 32 TS Code: HDB3 Impedance: 120 Ohms Standard
Quiz The speed limiting of modem is 56kbps? Why or why not?
Protocol stacks The IETF Internet 4-layer Physical: Ethernet IP/ICMP TCP/UDP AP: SIP, H.323, RTP/RTCP
SIP RFC 3261 support TCP and UDP H.323 v1 and H.323 v2 support H.245 Q.931 over TCP and RAS over UDP H.323 v3 and H.323 v4 support H.245 Q.931 over TCP/UDP and RAS over UDP
Network Class Class A: 0.0.0.0 ~ 127.255.255.255 但是0開頭和127開頭為特殊用途 0結尾和255結尾也有特殊用途 Class B: 128.0.0.0 ~ 191.255.255.255 Class C: 192.0.0.0 ~ 223.255.255.255
Class D: 224.0.0.0 ~ 239.255.255.255 注意Class D為multicast 使用 Class E: 240.0.0.0 ~ 247.255.255.255 保留未來或實驗使用
特別的IP Address 0.0.0.0: 用於來源位址時, 合法用途為要讓IP位址動態地由伺服器分配 用於目的位址時, 合法用途為要參照一個預設路由
127.xxx.xxx.xxx: Loopback, 傳統上只使用127.0.0.1, 來表示本機 廣播位址: 例如255.255.255.255, 192.168.0.255
CIDR 舉例來說, 192.168.0.0/24, 表示subnet mask開頭有24個1, 也就是subnet mask =255.255.255.0; 所以整個區段的網路範圍為192.168.0.0 ~ 192.168.0.255
TCP vs. UDP TCP通訊協定(由上層AP看下來)保證沒有錯誤, 沒有遺失或重複, 依序傳遞; 而UDP則不保證, 而必須由AP層自行負責 由於UDP的負擔小, 在傳輸類似影像或聲音的資料流時, 通常不用考慮重傳的問題, 因此UDP就顯現出他的優點
The Open Source 通常我們稱open source, 是指軟體的版權規範於GPL, LGPL或是MPL等等, 通常我們可以自由下載使用, 甚至傳播這些軟體, 也可以更改程式的source, 不過若是更動source, 通常要回報原始的作者或是開發論壇, 詳細內容請見該程式的原始規範 所以, 我們可以說open source的精神, 就是要集合眾人之力, 把程式做到更完美
常用的Linux Command ls : list, 類似DOS的dir, 可以搭配ls -al使用 rm : remove,類似DOS的del rmdir : remove directory mkdir : make directory cd : change directory cp : copy
mv : move chmod : 更改權限 file : 看某個檔案的類型, 也常用來測試某檔案存不存在 find -name : 找檔案 grep : 找字串 cat : 顯示內容到stdout
ps : 顯示執行的process, 常使用ps aux touch : 更改檔案的timestamp, 也常用來產生一個空的檔案 man : manual ifconfig : 設定或顯示網路 ifconfig eth0 xxx.xxx.xxx.xxx
route : 設定或顯示路由 route add default gw yyy.yyy.yyy.yyy ping reboot : 重新開機 shutdown : 關機, 常用shutdown -h now
vi文字編輯器 vi 檔名 初始進入vi文字編輯器時, 我們稱之為命令模式
:wq. 存檔並結束 :q. 強迫結束(不存檔, 不論檔案有無被更改) :100. 跳到第100行(row) dd :wq 存檔並結束 :q! 強迫結束(不存檔, 不論檔案有無被更改) :100 跳到第100行(row) dd 刪除游標所在那一行(row) i 進入編輯模式, 在編輯模式中可以按ESC回到命令模式
語音壓縮 傳統的PCM編碼, 以u-law或是A-law為例, 他所需的傳輸速率要64kbps, 若以目前的網路環境(或許該說2000年以前), 是無法承受這麼大的網路頻寬需求, 因此語音封包需要壓縮, 以減少網路流量, 當然壓縮過後多多少少會導致語音的失真或品質的降低
G.711 PCM u-law 64 kbps data rate 10 ms sample size Default datagram 2 samples = 20 ms Default 1.5 ms packetization delay Default 40 ms jitter buffer delay (based on 2 datagrams) Theoretical maximum MOS 4.4
G.711 PCM A-law 64 kbps data rate 10 ms sample size Default datagram 2 samples = 20 ms Default 1.5 ms packetization delay Default 40 ms jitter buffer delay (based on 2 datagrams) Theoretical maximum MOS 4.4
G.729A 8 kpbs data rate 10 ms frame size Default datagram 2 frames = 20ms Default 15.0 ms packetization delay Default 40 ms jitter buffer delay (based on 2 datagrams) Theoretical maximum MOS 4.07
G.723.1 6.3 kbps 30 ms frame size Default datagram 1 frame = 30 ms Default 37.5 ms packetization delay Default 60 ms jitter buffer delay (based on 2 datagrams) Theoretical maximum MOS 3.87
g723.1 can also be 5.3 kbps with a maximum MOS 3.69
封包大小與流量之計算 以G.711為例 64 Kbps * 20 ms = 160 bytes Overhead, 以Ethernet為例 IP+UDP+RTP Overhead = 20 + 8 + 12 = 40 bytes Ethernet Overhead (包含4-byte的CRC) = 18 bytes
所以, 在Ethernet傳輸的總速率為 (160+40+18) bytes * 50 frame = 87.2 Kbps
大綱 SIP測試環境架設 安裝X-Lite, SJPhone與Ethereal 設定讓同一台PC執行兩個SIP soft phone 在Linux環境下編譯open source的Proxy Server
在只有文字模式Linux環境下擷取SIP封包: 編譯與使用ngrep
Testing Environment X-Lite SJPhone Ethereal VMWare Red Hat 9 SER ngrep
設定SJPhone Options/Profiles/PC to PC (SIP)確認設定為in use
在上個畫面點選Edit, 在Profile Option/STUN中, 不要勾選Use discovered address in SIP
如果要強迫binding某個IP, 可以在Options/Call Options/Outgoing calls裡設定
設定X-Lite X-Lite在安裝完成, 第一次執行時, 會一直跳出Menu/System Settings/SIP Proxy/Default的頁面, 我們需要設定一下以便測試點對點 Enable: Yes Display Name: 1001 Username: 1001 Authorization User: 1001 Password: 1001
Domain/Realm: 填Linux host IP, 之後要用,測試點對點時沒用到, 只是為了讓X-Lite不要一直跳出設定畫面
SIP Proxy: 填host Linux IP Outbound Proxy: 填 host Linux IP Use Outbound Proxy: Never Send Internal IP: Always Register: Never Direct Dial IP: Yes
在Menu/Network要設定 Auto Detect IP: No Listen on IP: 如果要強制binding某個IP, 可以填在這 Use X-NAT to Choose SIP/RTP Ports: Never Listen SIP Port: 為避免和SJPhone衝突, 不要填5060, 我通常喜歡改成50607或是50600
測試點對點 SJPhone X-Lite: 輸入1001@xxx.xxx.xxx.xxx:50600 X-Lite SJPhone: 輸入1000@xxx.xxx.xxx.xxx 這個模式(X-Lite主叫, SJPhone被叫)會有問題, 詳情請見下面說明
Some problems with SJPhone 注意我們只有一個網路介面, 而且只有一個音效介面, 因此在本機上SJPhone和X-Lite對打會有怪現象發生, 而且Ethereal會抓不到封包 另外, 由於我們在同一台機器上執行兩個sip soft phone, SJPhone若是被叫端, 他會回應c: IN IP4 127.0.0.1, 因此造成問題
安裝設定Ethereal 先安裝WinPcap 然後安裝Ethereal 啟動Ethereal後, 按下Capture/Interfaces, 會跑出一個視窗, 找到正確網路介面後, 按下Capture就開始抓封包了
為了方便閱覽, 我通常設定Filter: sip, 這樣其他不是sip的封包就會被過濾掉
通常要抓到封包需要純Hub, 而Switch Hub會有些問題 在比較新版的Ethereal中有個設定值Capture packets in promiscuous mode可以勾選, 以解決(部分)Switch Hub的問題
如果要把抓到的封包傳給別人分析, 用File/Save As, 就可以存成檔案 如果只是要方便閱讀, 可以用File/Export, 然後選擇匯出的格式
Host Linux VM + RH9 Development Tools + mysql-server + mysql-devel ( + apache-server + PHP) Memory > 128MB (256MB recommend) HD space > 2GB (4GB recommend)
SSH login 如果是安裝RH9, 在重啟後SSH就自動啟動 如果是其他平台, 先用ps aux檢查, 如果沒有啟動可以下命令service sshd start
putty 在Windows執行putty, 然後在Session/Host Name輸入Linux Host的IP
pietty 也可以用pietty取代putty
psftp 如果要在Windows和Linux Host之間傳輸檔案, 可以執行psftp psftp> open xxx.xxx.xxx.xxx psftp> put 要傳到linux裡的檔名 psftp> get 要回傳windows的檔名
winscp 有的時候psftp建立連線很慢, 可以用winscp取代psftp, 而且winscp有圖形介面
SIP proxy server # tar xvfz ser-0.9.6_src.tar.gz # cd ser-0.9.6 # make # make modules # make install # ser # serctl ul show
SER的啟動 SER如果沒有更改Makefile, 通常會安裝在/usr/local/sbin, 換句話說, 如果要改變安裝位置, 需要去更動Makefile SER的預設的config檔案通常是在/usr/local/etc/ser/ser.cfg, 我們可以用 ser -f your_own_ser_cfg 來改變讀取的config檔
如果在shell直接下命令, shell卻回報找不到執行檔, 可以檢查PATH(echo $PATH)後, 執行PATH=$PATH:/usr/local/sbin
SER啟動後檢查 Listening on: 檢查SER是否binding到我們要的protocol和位址 下命令ps aux, 檢查SER是否真的有啟動 如果SER啟動有問題, 可以用ser -c檢查config是否有錯 如果config檔沒錯, 但是SER啟動仍然有問題, 可以進入偵錯模式檢視問題
SER的偵錯模式 通常我會下命令 ser -ddd -D -E -l eth0:5060 -d: Debugging mode (multiple -d increase the level) -D: Do not fork into daemon mode -E: Log to stderr -l address: Listen on the specified address/interface
SER的config 如果執行ser之後, 發現ser抱怨SIP_DOMAIN沒有設定, 可以在linux shell執行以下命令 SIP_DOMAIN=“your_own_sip_domain” export SIP_DOMAIN SER的config檔內容在下面說明
global configuration parameters debug: -d fork: -D log_stderror: -E check_via: -v dns: -r rev_dns: -R port: the listen port
children: -n fifo: ser fifo location listen: the listen address alias: 別名 fifo_db_url: the database location of fifo
SER IPC SER利用fifo來達成IPC(inter-process communication), 通常是用在和外部程式溝通時使用 預設的SER config設定fifo="/tmp/ser_fifo"
在比較新版本的SER, 也可以用Unix socket來達到IPC, 設定的方法就是把fifo改成socket, 但是要注意Linux kernel必需support Unix socket 如果我們沒有要和其他process用fifo_db溝通, fifo_db_url可以不用設定, 不過SER會抱怨”no fifo_db_url given”
module-specific parameters loadmodule: 指定要載入的模組, 注意各模組之間可能會有相依性 modparam: 設定各模組的parameters, 各模組的設定值可以在官方網站或是source code裡的README檔案找到, 但是注意有時說明檔會沒有更新, 所以需要搭配研讀source code
request routing logic 這裡就是SER的routing table, 也就是我們要讓自己的SIP Proxy Server執行指定的行為的地方 在source code裡面有兩個目錄, etc和examples, 裡面有各式各樣的範例, 但是還是要注意, 也許程式更新了但是範例還是沒有更新
編譯與安裝libpcap ngrep depends on libpcap, 所以我們先編譯與安裝libpcap # tar xvfz libpcap-0.8.3.tar.gz # cd libpcap-0.8.3 # ./configure # make # make install
編譯與安裝ngrep # tar xvfj ngrep-1.44-1.tar.bz2 # cd ngrep-1.44 # ./configure # make # make install
使用ngrep擷取SIP封包 由於SIP封包的內容是純文字的, 而且每行結尾均為CR LF, 所以我們用下面的命令來擷取SIP封包 # ngrep -d any port 5060 -W byline
“-d”: 後面可以填device name(例如eth0), 我們填any表示所有的network device封包都要擷取 “port 5060”: 指定port=5060, 其他的不擷取, 若是SIP server的listen port不是用default的5060 port, 則這裡的值要跟著更改 “-W byline”: 如果收到的封包有換行符號, 則顯示時也跟著換行
如果要把抓到的封包存到檔案, 而不是輸出到stdout # ngrep -d any port 5060 -W byline \ > capture.txt # ngrep -d any port 5060 -W byline \ | tee capture.txt
大綱 SIP初探: 擷取SIP封包 點對點 Call Setup SIP Header SDP 註冊到Proxy Server 認證相關問題
Reference RFC 2327: SDP: Session Description Protocol RFC 2543: SIP: Session Initiation Protocol (俗稱SIP v1) RFC 3261: SIP: Session Initiation Protocol (俗稱SIP v2) RFC 3264: An Offer/Answer Model with the Session Description Protocol (SDP)
SIP user agents UAC (user agent client): an entity which make a call, terminal a call UAS (user agent server): an entity which receive a call , terminal a call
SIP servers Proxy server: make request on behalf of other clients Location server: keep the info of call party’s location Redirect server: map the address into new address Registrar server: accept REGISTER request
SIP client and SIP server 在本課程中, 我們稱一個SIP client, 他需具備UAC+UAS全部或部分的特性, 類似H.323裡所定義的Endpoint 在本課程中, 我們稱一個SIP server, 他需具備Proxy server+Location server+ Redirect server+Registrar server全部或部分的特性, 類似H.323裡所定義的Gatekeeper
有時候,我們稱一個Proxy server, 其實就是在說一個SIP server
SIP method REGISTER INVITE ACK BYE CANCEL OPTIONS: query the capability of server INFO: carry a out-of-band information (eg. DTMF)
SIP response 1xx: informational 2xx: successful 3xx: redirection 4xx: request failure 5xx: server failure 6xx: global failure
1xx and 2xx and 3xx 100 Trying 180 Ringing 181 Call Is Being Forwarded 183 Session Progress 200 OK 301 Moved Permanently 302 Moved Temporarily
4xx 401 Unauthorized 403 Forbidden 404 Not Found 405 Method Not Allowed 406 Not Acceptable 407 Proxy Authentication Required 408 Request Timeout
415 Unsupported Media Type 480 Temporarily Unavailable 481 Call/Transaction Does Not Exist 483 Too Many Hops 486 Busy Here 487 Request Terminated 488 Not Acceptable Here
5xx and 6xx 500 Server Internal Error 501 Not Implemented 503 Service Unavailable 513 Message Too Large 600 Busy Everywhere 603 Decline 604 Does Not Exist Anywhere 606 Not Acceptable
Make a simple call A send “INVITE” to B B send “180 Ringing” to A B send “200 OK” to A A send “ACK” to B Media connection between A and B B send “BYE” to A A send “200 OK” to B
Sample INVITE package INVITE sip:1000@192.168.11.200 SIP/2.0 Via: SIP/2.0/UDP 192.168.11.175:50607;rport;branch=z9hG4bK82FC66F931EF4E40AE365120135E5D8D From: 1001 <sip:1001@192.168.11.200:50607>;tag=2177201999 To: <sip:1000@192.168.11.200> Contact: <sip:1001@192.168.11.175:50607> Call-ID: D29C04C7-98D9-49B8-910E-561A4DC37902@192.168.11.175 CSeq: 39854 INVITE Max-Forwards: 70 Content-Type: application/sdp User-Agent: X-Lite release 1103m Content-Length: 197
v=0 o=1001 14655515 14655546 IN IP4 192.168.11.175 s=X-Lite c=IN IP4 192.168.11.175 t=0 0 m=audio 8000 RTP/AVP 0 101 a=rtpmap:0 pcmu/8000 a=rtpmap:101 telephone-event/8000 a=fmtp:101 0-15
Header fields Call-ID, i Contact, m Content-Length, l Content-Type, c From, f Subject, s To, t
Via, v CSeq Max-Forwards User-Agent …
The min required header field set Via Max-Forwards To From Call-ID CSeq
SDP Version number, v Origin containing name, o Subject, s Connection, c Time, t Media, m Attributes, a
Content-Length calculation v=0 --> 5 o=1001 14655515 14655546 IN IP4 192.168.11.175 --> 48 s=X-Lite --> 10 c=IN IP4 192.168.11.175 --> 25 t=0 0 --> 7 m=audio 8000 RTP/AVP 0 101 --> 28 a=rtpmap:0 pcmu/8000 --> 22 a=rtpmap:101 telephone-event/8000 --> 35 a=fmtp:101 0-15 --> 17
空白字元要計算 行尾的CR LF (0x0D 0x0A)要計算 所以上面例子裡的Content-Length為5+48+10+…+17=197
SJPhone reg to SER Options/Profiles點選New Profile Name: 輸入名字, 例如SER Profile Type: Calls through SIP Proxy
在按下2次OK後 Account: 1000 Password: 1000
新增完成後, 選取Edit, 在Proxy domain和User domain填入Linux Host IP
X-Lite reg to SER Menu/System Settings/SIP Proxy/Default Register: Always Direct Dial IP: No 設定完畢後, 記得重新啟動X-Lite
Registration A send “REGISTER” to P P send “100 Trying” to A P send “200 OK” to A
Sample REGISTER package REGISTER sip:192.168.11.200 SIP/2.0 Via: SIP/2.0/UDP 192.168.11.175:50607;rport;branch=z9hG4bK6C24482F4D7747ADBB4523FA7526E7C6 From: 1001 <sip:1001@192.168.11.200>;tag=1820338451 To: 1001 <sip:1001@192.168.11.200> Contact: "1001" <sip:1001@192.168.11.175:50607> Call-ID: 8588EED3AC6440C3A02DFE71976DC1B2@192.168.11.200 CSeq: 607 REGISTER Expires: 1800 Max-Forwards: 70 User-Agent: X-Lite release 1103m Content-Length: 0
Call with proxy server A send “INVITE” to P P send “INVITE” to B B send “180 Ringing” to P P send “180 Ringing” to A B send “200 OK” to P P send “200 OK” to A A send “ACK” to B
Media connection between A and B B send “BYE” to P P send “BYE” to A A send “200 OK” to P P send “200 OK” to B
SER with mysql support Modify Makefile to enable mysql support 找到exclude_modules, 把mysql去掉 Re-compile and re-install SER 記得先停止SER, 可以下命令killall ser 確保安全, 先清掉之前安裝的目錄, 然後make clean
SER mysql table 記得先export SIP_DOMAIN 執行SER, 確認SER已經啟動 然後Create the database table 問密碼時直接按Enter 注意, 這裡的密碼指的是MySQL的密碼, 預設是沒有
# export SIP_DOMAIN="RH9“ # ser # ser_mysql.sh create MySql password for root: creating database ser ... Enter password:
Add user 命令格式為 serctl add username passwd email SER database table的預設密碼為heslo # serctl add 1000 1000 1000@localhost MySql password: heslo new user added new user into uri table added 多加幾個, 例如1001, 1002, 1003, …
Re-install SER mysql table 如果SER的mysql table毀損可以 下命令ser_mysql.sh reinstall, 或是 利用工具清掉mysql裡的table, 然後依照前面的做法, 重新create新的
mysql and phpmyadmin # tar xvfz phpMyAdmin-2.9.0.tar.gz \ –C /var/www/html # service mysqld start 在某些系統可能是service mysql start # service httpd start 開啟IE, 網址列輸入http://linux_host/phpMyAdmin-2.9.0/
Config Modify config file of SER to enable auth and mysql support vi /usr/local/etc/ser/ser.cfg 找到mysql.so, auth.so, auth_db.so把comment拿掉 (就是拿掉該行最前面那個#)
db_mode設成2 calculate_ha1設成yes password_column設成password 啟動www_authorize和www_challenge, 並且把domain清空
loadmodule "/usr/local/lib/ser/modules/mysql.so“ loadmodule "/usr/local/lib/ser/modules/auth.so" loadmodule "/usr/local/lib/ser/modules/auth_db.so“ modparam("usrloc", "db_mode", 2) modparam("auth_db", "calculate_ha1", yes) modparam("auth_db", "password_column", "password") www_authorize("", "subscriber") www_challenge("", "0")
Reg auth A send “REGISTER” to P P send “401 Unauthorized” to A (407 Proxy Authentication Required) A send “REGISTER” to P with Authorization information P send “200 OK” to A
Enable call auth with SER Copy the reg auth settings Modify it if (method=="INVITE") { if (!www_authorize("", "subscriber")) { www_challenge("", "0"); break; };
Call auth A send “INVITE” to P P send “401 Unauthorized” to A A send “ACK” to P A send “INVITE” to P with Authorization information P send “INVITE” to B B send “180 Ringing” to P P send “180 Ringing” to A
B send “200 OK” to P P send “200 OK” to A A send “ACK” to B Media connection between A and B B send “BYE” to P P send “BYE” to A A send “200 OK” to P P send “200 OK” to B
實地演練 練習將SJPhone和X-Lite都註冊到SER, 由SJPhone打給X-Lite, 啟動Ethereal抓取封包, 然後檢視封包內容 請比較no auth, reg auth和call auth之間行為的差異性
Quiz What should I fill the address of “From”, “To”, and “Contact” fields? Should it be local address, NAT’s address, or proxy server’s address?
大綱 SIP Registration Registration Registration Update Contact List Request UnRegistration Unsuccessful Registration
SIP Registration 這個部分我們使用X-Lite and SER, 直接擷取封包 請更改X-Lite的Advanced System Settings / SIP Settings, 設定Reregister Proxy = 180
Registration: 正常執行SER, 然後開啟X-Lite(假設已經設定完成)就可以擷取到註冊封包 Registration Update: 我們前面設定了Expire Time = 180 sec, 所以等待3分鐘後就可以擷取到重新註冊封包
Contact List Request: X-Lite於正常執行狀態, 更改X-Lite向SIP server註冊的帳號及密碼即可擷取到新的註冊封包 UnRegistration: 關閉X-Lite, 即可擷取到解除註冊的封包 Unsuccessful Registration: 把X-Lite向SIP server註冊的帳號及密碼故意填錯, 可以擷取到註冊失敗的封包
大綱 SIP Call Call Establishment Through Two Proxies No Answer Busy No Response Temporarily Unavailable
SIP Call 這個部分我們使用SJPhone, X-Lite and SER, 直接擷取封包 請將前面更改X-Lite的設定改回來(Advanced System Settings / SIP Settings, 設定Reregister Proxy = 1800)
Call Establishment: 由SJPhone發起呼叫, X-Lite為受話端即可 Through Two Proxies: 啟動另一個SER (listen port要跳開), 將SJPhone註冊到新的SER, 這個新的SER設定將封包forward到第一台SER, 測試完畢請將SJPhone註冊回原來的SER
No Answer: (1) 由SJPhone發起呼叫, X-Lite不要應答, 等待2分鐘會收到408 Request Timeout (2) 由SJPhone發起呼叫, X-Lite還沒應答, SJPhone掛斷電話 Busy: 用SJPhone或是X-Lite自己呼叫自己, 會收到486 Busy
No Response: 先停掉SER, 關掉X-Lite, 然後再啟動SER, 由SJPhone呼叫X-Lite(此時沒有啟動) Temporarily Unavailable: 將X-Lite正常開啟, 再正常關閉X-Lite, 然後由SJPhone呼叫X-Lite