本博客为本人学习笔记,代码出自GitHub:https://github.com/theintencity/p2p-siphtml
因为GitHub原著为英文,且至关的啰嗦,本文为翻译内容并去除其啰嗦的部分python
重点:代码只支持Pythongit
关键词:SIP, P2P, Python, p2psip, DHT, implementationgithub
相关连接: Blog, 39 peers, Implementing SIP telephony in Python, Student Projects, Supportweb
解释:网络电话能够是对等体系的应用,参与者不须要依赖昂贵或管理的服务提供者的状况下彼此定位和通信。算法
本项目目标是使用Python语言中的会话启动协议(P2P-SIP)来实现开源的点对点(peer-tp-peer,简称P2P)的互联网通话软件,项目支持开放协议,如IETF SIP和RTP安全
peer-to-peer系统优势:具备高扩展性、容错性、针对灾难性故障的稳健性。由于它没有中央服务器,而且没有网络自我组织服务器
代码总体分为两部分 - standards和applications。 某些RFC和Internet-drafts中指定的standards在std包中实现,而高级应用程序在app包中实现。 构建此项目的主要优势之一是源代码在代码行方面要少得多。网络
下表总结了std包的内容,并容许使用从相应规范中提取的嵌入式文档来浏览源代码。app
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
每一个模块都有一个简单的测试用例,做者以后还会上传使用这些基本模块构建的应用程序。
注意:第一个节点启动时须要加 -s ,以成为超级节点,后续启动的节点不要加 -s 以加入此P2Peye.com网络
第一个节点监听SIP端口5062,用 -d 参数能够查看节点之间交换的P2P消息。若是想要跨多个IP网络进行P2P网络,须要从新配置引到节点,由于多播发现一般只能在同一IP下运行
python app/p2psip.py -s # 第一个节点做为启动服务器 python app/p2psip.py # 其余终端/机器上的后续节点