研究了將近幾個月的voip,總結出來一下相關概念的知識,特此分享一下。若是有錯誤還請你們多多指教。 算法
咱們先說爲何要講 turn stun ice kamailio之間的關係,由於點對點通話是基於ip的音頻流通訊,而因爲上網設備的增多,ipv4沒法知足給每個設備分配一個ip,因此就出現了nat這個概念。而stun、stun、ice、kamailio有些模塊都是爲nat穿透而準備的(具體的nat穿透能夠網上搜索)。爲何要準備這麼多呢?由於nat有不少類型,因爲我在實際測試中只遇到過兩種類型:一種是徹底開放型的、一種是對稱型的(具體能夠搜索nat類型)。若是你的上網設備是在公網上,則徹底沒有必要往下看了。可是大多數上網設備都是在nat後的。 apache
stun 服務器
stun是一個正對stun協議的單獨的服務器,你使用stun協議訪問他時他會返回你上網設備的公網ip,stun和sip協議沒有關係,你若是用到stun的話sip客戶端會吧stun返回的公網ip做爲本身的sip本機ip,這樣別人就能夠找到你了,音頻數據流就能夠直接經過該ip地址和你點對點通話 測試
turn spa
turn服務器至關於把本身的ip租給你使用,應爲turn服務器在公網。當對方找你的時候就像找到turn分配給你的ip,而後經過他給你發送音頻流。其實turn至關於服務器中轉,與之相似的好比rtpproxy、mediaproxy等等 代理
ice ip
ice實際上是一種算法,由於對稱型nat中上網設備每次數據的出口和入口端口都是隨機的,這時候stun是沒有辦法獲取到可以讓另外一個終端的公共ip和端口,ice經過算法來預測讓對方數據流進來的 文檔
kamailio io
voip經常使用的協議是sip協議(相似於http協議),kamailio是sip協議的服務器(相似於http協議的apache)。只負責處理sip協議,固然它有不少模塊實現不少功能, 通過一段時間的官方文檔閱讀發現他有一個stun.so和outbound 模塊好像是做爲代理模式能夠充當stun的功能,可是因爲項目時間緣由就沒有仔細閱讀 音頻