本博客為本人學習筆記,代碼出自GitHub:https://github.com/theintencity/p2p-sip
由於GitHub原著為英文,且相當的啰嗦,本文為翻譯內容並去除其啰嗦的部分
重點:代碼只支持Python
Python版本開源互聯網點對點軟件
關鍵詞:SIP, P2P, Python, p2psip, DHT, implementation
相關鏈接: Blog, 39 peers, Implementing SIP telephony in Python, Student Projects, Support
解釋:網絡電話可以是對等體系的應用,參與者不需要依賴昂貴或管理的服務提供者的情況下彼此定位和通訊。
本項目目標是使用Python語言中的會話啟動協議(P2P-SIP)來實現開源的點對點(peer-tp-peer,簡稱P2P)的互聯網通話軟件,項目支持開放協議,如IETF SIP和RTP
peer-to-peer系統優點:具有高擴展性、容錯性、針對災難性故障的穩健性。因為它沒有中央服務器,並且沒有網絡自我組織
代碼結構
- src/tools/htmlify.py工具用於生成帶注釋的web視圖代碼
- src/app下面包含了,如SIP客戶端(voip.py),使用Bamboo的DHT(dht.py)等等
- src/std下面包含了各種IETF RFC實現的Internet草案,例如RFC 3261, RFC 3550, RFC 2617等等
- 有些模塊是未完成的半成品
代碼整體分為兩部分 - standards和applications。 某些RFC和Internet-drafts中指定的standards在std包中實現,而高級應用程序在app包中實現。 構建此項目的主要優點之一是源代碼在代碼行方面要少得多。
下表總結了std包的內容,並允許使用從相應規范中提取的嵌入式文檔來瀏覽源代碼。
Module | Description | Lines |
---|---|---|
rfc2198 | 實現 RTP payload type for 冗余音頻數據. | 45 |
rfc2396 | 實現各種形式的地址 such as URI or SIP 地址 | 177 |
rfc2617 | 實現在 SIP 中可重用的 HTTP 基本和摘要式的身份驗證 | 131 |
rfc2833 | 實現在 RTP 數據包中的 DTMF 按鍵音有效負載 | 40 |
rfc3261 | 實現會話啟動協議(SIP)的用戶代理部分 | 1558 |
rfc3263 | 會用 DNS NAPTR , SRV 和 A 實現 SIP 服務器發現 | 108 |
rfc3264 | 實現 SIP 中使用的單播會話的 SDP 提供答案模型 | 120 |
rfc3489bis | 實現基本的 NAT 遍歷技術 such as STUN, NAT discovery using STUN, TURN的變體 | 693 |
rfc3550 | 實現實時傳輸協議(RTP)及其配套控制協議RTCP。 | 687 |
rfc3551 | 定義RTP的靜態有效內容類型。 | 48 |
rfc3920 | 實現客戶端 XMPP 核心 | 435 |
rfc3921 | 實現IM和XMPP客戶端的存在(不完整)。 | 373 |
rfc4566 | 實現會話描述協議(SDP)。 | 162 |
高級應用程序模塊使用其中一些模塊並構建其他應用程序或庫,如下所述:
Module | Description | Lines |
---|---|---|
voip | 實現 SIP 用戶代理庫,用於注冊、呼叫、即時消息和會議 | 1261 |
dht | 實現 Bamboo/Pastry 分布式哈希表算法的變體 | 1983 |
opendht | 實現客戶端庫,用來連接到現有的OpenDHT服務 | 71 |
p2p | 使用 DHT 實現 peer-to-peer 的管道抽象(未完成) | 642 |
p2psip | 使用p2p和voip模塊實現各種P2P-SIP應用場景(未完成) | 285 |
crypto | 實現在dht或p2p中使用的加密算法的抽象(未完成) | 261 |
dhtgui | 實現一個用來啟動p2p / dht 模塊的測試工具,並以圓形來顯示節點 | 427 |
sipd | 使用rfc3261模塊實現一個非常簡單的SIP注冊和代理服務器。(不完全的) |
起支持作用的模塊
Module | Description | Lines |
---|---|---|
simplexml | 會用方便的方法和運算符實現簡單的 XML DOM,用來處理 XML 和 XMLList | 420 |
在運行代碼之前,需要自行配置Python的環境,下面的栗子是執行voip.py,這個腳本使用iptel.org服務器執行編寫SIP注冊、呼叫和即時消息測試
# 在download文件夾下 tar -zxvf source-*.tgz cd p2p-sip/src export PYTHONPATH=.:external:std:app python app/voip.py
每個模塊都有一個簡單的測試用例,作者之后還會上傳使用這些基本模塊構建的應用程序。
- dhtgui.py用於啟動P2P模塊的測試用戶界面,它取決於wxPython的用戶界面功能。運行會啟動具有DHT圈的用戶界面,我們可以在與安全中心附近單擊添加新的節點
- p2psip.py用於啟動P2P-SIP結點
注意:第一個節點啟動時需要加 -s ,以成為超級節點,后續啟動的節點不要加 -s 以加入此P2Peye.com網絡
第一個節點監聽SIP端口5062,用 -d 參數可以查看節點之間交換的P2P消息。如果想要跨多個IP網絡進行P2P網絡,需要重新配置引到節點,因為多播發現通常只能在同一IP下運行
python app/p2psip.py -s # 第一個節點作為啟動服務器 python app/p2psip.py # 其他終端/機器上的后續節點