本篇教學提供讀者了解SIP 的基本知識與建置SIP Server - GitHub
文章推薦指數: 80 %
註冊處理完成後,註冊伺服器將使用者之聯絡位址上傳至Location Server 資料庫中儲存。
SIP. Proxy Server. SIP Proxy 主要負責將User Agent 或者其他SIP Proxy 發送的請求 ...
Skiptocontent
{{message}}
imac-cloud
/
OpenSIPS
Public
Notifications
Fork
1
Star
11
本篇教學提供讀者了解SIP的基本知識與建置SIPServer
11
stars
1
fork
Star
Notifications
Code
Issues
0
Pullrequests
0
Actions
Projects
0
Wiki
Security
Insights
More
Code
Issues
Pullrequests
Actions
Projects
Wiki
Security
Insights
Thiscommitdoesnotbelongtoanybranchonthisrepository,andmaybelongtoaforkoutsideoftherepository.
master
Branches
Tags
Couldnotloadbranches
Nothingtoshow
{{refName}}
default
Couldnotloadtags
Nothingtoshow
{{refName}}
default
1
branch
0
tags
Code
Latestcommit
Gitstats
20
commits
Files
Permalink
Failedtoloadlatestcommitinformation.
Type
Name
Latestcommitmessage
Committime
photo
.gitignore
README.md
Viewcode
SIP簡介
前言
UAC與UAS
RegisterServer
ProxyServer
RedirectServer
LocationServer
SIPGateways
SIP特點
SIP相關的網路協定
SIP請求(Requests)與回應(Responses)
SIP請求
SIP回應
SIP流程
SIP安裝教學
作業系統與SIP套件:
更新apt-get:
下載安裝相關套件:
下載OpenSIPS套件:
修改配置檔:
安裝OpenSIPS:
安裝完畢後,修改部分opensipsctlrc文件,如下:
執行建立資料庫腳本:
常見錯誤:
設定OpenSIPslisten:
OpenSIPS操作:
用戶端軟體
README.md
SIP簡介
前言
由於路由式IP網路的普及化,企業與個人都希望降低電信費用,我們何不利用IP網路的數據傳輸來實作語音服務呢?本篇是筆者研讀許多VoIP相關文件後所整理的筆記,透過SIP不僅可以實現通話及會議通訊功能,也同時擁有視訊會議與訊息傳輸的技術,不過你可能會想,若只局限於PCtoPC間的通話,是否對於使用者來說方便性過於狹隘?但是對於這部份,筆者最後也整理了幾個APPclient提供使用者作為參考,讓你的智慧型手機(android、iOS)也可以享有與PC相同的服務品質。
UAC與UAS
SIP網路元件可分為使用者代理器(UserAgents-UA)與伺服器(Server)兩部分。
其中UA又可細分為UAC(UserAgentClient)與UAS(UserAgentServer)。
UAC負責建立請求,如:一個通話的開始,而UAS負責依照請求產生應答,如:接收通話。
換而言之,每個SIPUserAgent都包含UAC及UAS,如此一來每個終端設備都兼具接收與撥號功能。
流程如下圖:
RegisterServer
這個伺服器主要是接收UserAgent註冊要求功能,並且提供authentication(驗證)服務,通常與Proxy或RedirectServer放在一起,且更新LocationServer上的UserAgent資訊與位址。
其流程如下:
RegisterServer接收並處理使用者之註冊請求。
使用者藉由註冊請求,向網路特定RegisterServer登錄該使用者連位址。
註冊處理完成後,註冊伺服器將使用者之聯絡位址上傳至LocationServer資料庫中儲存。
ProxyServer
SIPProxy主要負責將UserAgent或者其他SIPProxy發送的請求代為傳遞到另一個SIP元件。
當UserAgent發出請求時,請求並非直接傳遞到目的地端的UserAgent,而是經過一層層的SIPProxy後才將請求訊息傳遞至目的地端。
每個SIPPrxoy都會決定下一個路由並且對請求訊息做出適當加工處理後才傳遞。
反之,目的地端回送訊息給發送端也是如此。
SIPProxy事實上同時扮演SIPClient與SIPServer兩個角色,當他接受其他Client請求時,即為SIPServer。
當他轉送SIP請求至其他Server時,即為SIPClient。
RedirectServer
RedirectServer目的是接受SIP的要求,將位址對應到零個或多個新的位址,並將結果回傳給Client。
與ProxyServer不同,RedirectServer並不會發出自己的SIP請求。
與UserAgentServer不同,RedirectServer並不會接受或結束一個通話。
LocationServer
當ProxyServer呼叫建立時,向LocationServer查詢被呼叫者的聯絡位址,以轉送呼叫建立訊息。
通常被SIPRedirect或ProxyServer所使用。
SIPGateways
負責SIP協定和其他非SIP協定(PSTN)轉換的橋樑
負責語音通訊時資料傳送,將封包型態的數位資料轉換成類比訊號後,由PSTN網路傳送,或將類比資料轉成數位後在包裝成封包後,由IP網路傳送出去。
SIP特點
簡單:SIP通訊協定與HTTP通訊協定類似,都是採用請求(Requests)與回應(Responses)模式,提供數種命令與回應代碼來完成呼叫控制。
以文字為主:類似HTTP的作法,將協定的訊息以文字表達並使用標準的字元編碼,如ASCII、UTF-8,運用這個方式的好處是容易實作與偵錯、擴充性佳、增加額外訊息不需大幅更動原有解析程式。
與傳輸層分離:SIP運作在傳輸層之上,可以提昇網路傳輸的適應性和支援性。
在封包容易遺失的環境下使用TCP連線,而在環境叫穩定的狀況下使用UDP。
支援移動性:SIP在制定時,就已經將支援移動性納入考量,就算使用者在呼叫階段或是交談過程中,都可以藉由轉送或是重新邀請來維持會談。
SIP相關的網路協定
SDP(會談描述協定):此協定主要用來協商雙方建立多媒體資料封包通道之用,雙方會在邀請(INVITE)訊息的三向交握過程中交換彼此可以使用的通訊方式及資料格式。
RTP(即時傳輸協定):此協定用於即時資料傳輸,如影像資料...等,由於VoIP所傳輸的多媒體資料大多屬於即時性優先於資料完整性,所以利用RTP的特性來編排及傳遞這些資料內容最適合。
LDAP(輕量及目錄訪問協定):此協議主要是讓SIPServer用來與位址服務的伺服器溝通,以取得每個目的的正確位址。
SIP請求(Requests)與回應(Responses)
SIP請求
SIP的六項基本的方法向伺服器發出請求,以下簡單敘述:
方法
敘述
INVITE
邀請建立會議(Session)
ACK
回覆確認邀請(INVITE)的回覆已收到
OPTIONS
用來傳送midcall訊號(mid-session資訊)並不改變Session狀態
BYE
結束一個已連結的Session
CANCEL
取消一個已發出邀請但尚未連結的Session
REGISTER
註冊使用者的URL
SIP回應
SIPResponses訊息包含一個三個位數的狀態碼(statuscode),用來表示回應原因:
1XX-InformationMessages.(訊息通知,請求處理中尚未完成。
)
2XX-SuccessfulResponses.(請求處理成功。
)
3XX-RedirectionResponses.(重新導向,將請求訊息重新導向至另一個SIP元件。
)
4XX-RequestFailureResponses.(客戶端錯誤,錯誤的原因在於請求端。
可以矯正後重試。
)
5XX-ServerFailureResponses.(伺服器端錯誤,錯誤的原因在於目的端。
可以重試其他的location。
)
6XX-GlobalFailureResponses.(錯誤-GlobalError,請求失敗且無法重試。
)
代碼
敘述
代碼
敘述
100
正在嘗試
305
使用代理伺服器
180
正在撥打
380
替代服務
181
正在轉接
400
呼叫不當
182
正在排隊
401
未經授權
183
通話進展
402
要求付費
200
OK
403
被禁止的
202
被接受
404
未發現用戶
300
多項選擇
405
不允許的方法
301
被永久遷移
406
不可接受的
302
被暫時遷移
407
需要代理伺服器授權
代碼
敘述
代碼
敘述
408
呼叫超時
481
通話/事務不存在
410
用戶曾經存在,但現在不存在
482
檢測到迴圈
413
呼叫實體過大
483
跳數過多
414
呼叫URI過長
484
位址不全
415
不支援的媒體類型
485
模糊不清
416
不支援的URI方案
486
忙碌中
420
不當擴展
487
呼叫被終止
421
需要擴展
488
此處不可接受
423
時間間隔過短
491
呼叫待批
480
暫時不可以使用
493
無法解讀
代碼
敘述
500
伺服器內部錯誤
501
SIP呼叫方法在此無法實施
502
不當閘道
503
服務不可使用
504
伺服器超時
505
伺服器不支援SIP協定的這個版本
513
消息過長
600
各處忙碌
603
拒絕
604
無處存在
605
不可使用
SIP流程
由下圖可知,當Client1撥打電話給Client2時,會先發送INVITE請求並且與Client1請求代理伺服器授權。
當前置動作完成以後,SIPServer會發送INVITE給Client2,此時雙方的電話將會響起,假設雙方都接受電話請求,此時開始進行對話。
最後,當一方送出BYE訊息時,系統會執行通話終止,並且同時送出BYE訊息給另一方結束此次通話。
SIP安裝教學
作業系統與SIP套件:
Ubuntu-14.04
OpenSIPS-2.1
Openstack-
主機
PrivateIP
PublicIP
SIPServer
192.168.100.174
10.26.1.25
更新apt-get:
sudoapt-getupdate
下載安裝相關套件:
sudoapt-getinstall-ygitmakebisonflexmysql-servermysql-clientlibmysqlclient-devlibncurses5libncurses5-dev
下載OpenSIPS套件:
cd~/
sudogitclonehttps://github.com/OpenSIPS/opensips.git-b2.1opensips_2_1
修改配置檔:
sudovim~/opensips_2_1/Makefile.conf.tmplate
移除exclude_modules中db_mysql並儲存
安裝OpenSIPS:
cd~/opensips_2_1
sudomakeall
sudomakeinstall
安裝完畢後,修改部分opensipsctlrc文件,如下:
sudovim/usr/local/etc/opensips/opensipsctlrc
修改如下,將部分註解刪除
##yourSIPdomain
#SIP_DOMAIN=ubuntustudio
##chrooteddirectory
#$CHROOT_DIR="/path/to/chrooted/directory"
##databasetype:MYSQL,PGSQL,ORACLE,DB_BERKELEY,orDBTEXT,
##bydefaultnoneisloaded
#Ifyouwanttosetupadatabasewithopensipsdbctl,youmustatleastspecify
#thisparameter.
DBENGINE=MYSQL
##databasehost
DBHOST=localhost
##databasename(forORACLEthisisTNSname)
DBNAME=opensips
#databasepathusedbydbtextordb_berkeley
DB_PATH="/usr/local/etc/opensips/dbtext"
##databaseread/writeuser
DBRWUSER=opensips
##passwordfordatabaseread/writeuser
DBRWPW="opensipsrw"
##databasesuperuser(forORACLEthisis'scheme-creator'user)
DBROOTUSER="root"
#usernamecolumn
USERCOL="username"
若出現ERROR:databaseenginenotspecified,pleasesetuponeintheconfigscript錯誤,請修改/usr/local/etc/opensips權限。
執行建立資料庫腳本:
/usr/local/sbin/opensipsdbctlcreate
你會看到如下方結果:
MySQLpasswordforroot:
INFO:testservercharset
INFO:creatingdatabaseopensips...
INFO:CoreOpenSIPStablessuccesfullycreated.
Installpresencerelatedtables?(y/n):y
INFO:creatingpresencetablesintoopensips...
INFO:Presencetablessuccesfullycreated.
Installtablesforimccplsiptracedomainpolicycarrierrouteuserblacklist?(y/n):y
INFO:creatingextratablesintoopensips...
INFO:Extratablessuccesfullycreated.
如果執行出現錯誤,可以從/var/log/syslog檢視錯誤資訊。
常見錯誤:
var/run路徑權限不足
sudochmod777/var
sudochmod777/var/run
opensips.cfg權限不足
sudochmod755/usr/local/etc/opensips/opensips.cfg
設定OpenSIPslisten:
使用你慣用的編輯軟體如:vim,開啟/usr/local/etc/opensips/opensips.cfg進行設定。
...
advertised_address="10.26.1.25"
alias="10.26.1.25"
listen=udp:192.168.100.174:5060
...
若你想在AWSEC2或OpenstackInstance佈署OpenSIPS服務,請務必加入advertised_address與alias,如此一來你的服務才能夠被正確的對應出來。
如果你使用的是EC2請輸入PublicIP,如果你使用的是OpenstackInstance請輸入FloatingIPs。
OpenSIPS操作:
啟動:
/usr/local/sbin/opensipsctlstart
暫停:
/usr/local/sbin/opensipsctlstop
重新啟動:
/usr/local/sbin/opensipsctlrestart
如果執行時出現錯誤,請檢查opensips.cfg、/var與/var/run權限是否有誤。
用戶端軟體
MacOS:YateClient、Zoiper
Android:ECOASip(可至Play商店下載)
iOS:Zoiper(可至AppStore下載)
以上為筆者列舉幾項作為示範,若需要更多相關用戶端軟體可至opensourceVOIPSoftware取得。
About
本篇教學提供讀者了解SIP的基本知識與建置SIPServer
Resources
Readme
Stars
11
stars
Watchers
7
watching
Forks
1
fork
Releases
Noreleasespublished
Packages0
Nopackagespublished
Youcan’tperformthatactionatthistime.
Yousignedinwithanothertaborwindow.Reloadtorefreshyoursession.
Yousignedoutinanothertaborwindow.Reloadtorefreshyoursession.
延伸文章資訊
- 1架設SIP Proxy打造免費專屬VoIP系統 - 網管人
網路電話(Voice over IP,VoIP)被廣泛應用,在台灣早已不是新聞。從早期的H.323,到後來的SIP(Session Initiation Protocol),早已在各大大小小的企...
- 2網路電話系統建置 - iT 邦幫忙
但是我實在是不會設定網路電話. 我有架設一台SIP server Asterisk 在CentOS上面Console介面也有出現. 但是完全不會設定SIP server 跟IP phone. 請...
- 3本篇教學提供讀者了解SIP 的基本知識與建置SIP Server - GitHub
註冊處理完成後,註冊伺服器將使用者之聯絡位址上傳至Location Server 資料庫中儲存。 SIP. Proxy Server. SIP Proxy 主要負責將User Agent 或者其...
- 4架設VoIP時,電信達人會注意的5個要點!
若沒有完善的防衛機制,駭客攻擊不僅能讓您公司在一夜之間暴增上百萬通話費,還可能竊取系統中重要的通話資料。真正專業的網路設備商不僅會選用搭載SIP防火牆的IP PBX以 ...
- 5簡單易用的VOIP SIP Server – miniSipServer
最近由於家裡的頻寬升級,想說自己來試試網路語音方面的東西,讀了一些相關文章,決定走SIP路線,第一步,嘗試在家中架個SIP Server,需求是能安裝 ...