我的网络编程之旅——P2P相关话题

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介:

最早接触P2P是大学时利用BitTorrent下载电影和游戏,当时我们只知道这个软件叫bt,给女性同学介绍此软件为什么会有如此高效时,简单讲述了一下P2P网络的特点后,还特意强加一句所以这个软件叫变态(bt)软件,现在想起来都好笑,完全误解了BitTorrent软件名的由来。近两年的工作中因为要涉及到点对点的视频传输,用户对用户的视频传输,对这块也曾经做了较为系统的学习和研究,今天拿出来和大家简要分享一下我的理解。


以下讲述我会首先把P2P分为(point-to-point)和(peer-to-peer)两个概念来讲述,分别针对我工作中所用到的点对点和用户对用户的视频传输。

第一部分:point-to-point

因为工作中涉及到用户要看一个安防摄像头,这其中面临最大的挑战是用户端要如何突破阻碍去直连这个摄像头,这个阻碍就是NAT,采用的方案就是NAT穿透。有些童鞋要问了,为什么你们不直接采用类似流媒体的转发呢?为了减少转发服务器的成本,我们会优先让用户这一端去直连摄像头,要知道对于我们雷锋式的传输免费,几十万甚至上百万摄像头都走转发,俺们公司直接倒闭算了。

大家应该都了解NAT

  • 他的积极作用是:解决IP地址短缺;隐藏网络,安全。

  • 他的消极作用是:破坏了端到端的通信,使网络结构复杂。

我们常见的公司交换机,家用路由器都是NAT设备。

NAT为什么需要穿透呢?最主要的原因是nat阻碍了外部网络主动向NAT设备之后的端发起的连接。更详细的介绍请看维基百科的NAT介绍。 同时不同的NAT类型穿透的难度也不同,甚至无法穿透。从编码实现上看,最常见的NAT穿透技术是UDP打洞 。 给大家引用一幅图进行一下举例说明,稍微复杂些的穿透必须要使用到中继服务器。

wKiom1RD1OSTogOgAAJZQ9rijPo515.jpg

请注意并不是所有的NAT情况都能穿透:分别部署在端口限制型——对称型NAT之后的两端采用编码手段很难穿透,对称型——对称型NAT之后的两端采用编码手段根本无法穿透。请参见我在知乎上的回答:

正好,我们已经对UDP打洞问题研究了近一个月,对于两方都是对称nat的情况,至少从可以了解的途径上(比如google,相关论坛)都没找到解决方案,我们自己也进行过测试,不行。

但是对于一端是对称nat,一端是端口限制Cone nat的情况是可以打洞成功的,特别是我们实验的对称nat的端口变化还是有规律的(加1),我们使用端口猜测的方法进行打洞成功率还是非常高的。对于端口变化无规律的对称nat,这个猜测还是靠算法的设计,你可以看看文章A New Method for Symmetric NAT Traversal in UDP and TCP

另外如果你是做应用的话建议不要始终把自己局限于一定要打洞成功的思路上,对于一些路由器是可以通过配置支持穿透的,比如upnp;对于实在打洞不成功的情况你可以通过设计一个中转服务器来完成自己的应用;

解决了point-to-point直连的这个技术点,就是其他领域的技术了,在这就不多说了。

参考资料:我收集的部分NAT资料

第二部分:peer-to-peer

这部分内容联系到工作中的场景是很多人要看一个摄像头,要知道很多安防设备的硬件资源是很吃紧的,大伙一股脑都连上去,设备直接就挂了;另外对安防设备这一端的带宽要求太大,不合实际。于是我们就想到了采用对等网络中利用用户的资源去服务用户,比如数个用户连接上了这个摄像头,其他更多的用户就不用直接连接摄像头了,从这几个已经拥有摄像头影像的用户端获取视频流即可。

关于对等网络的知识很多也着实很复杂,我以后有时间会专门写一篇文章进行讲解,今天我们先简单讲讲对等网络对流媒体传输的影响。

对等网络媒体直播的挑战

  • 可扩展性:节点规模的增大不影响性能;

  • 带宽利用率和吞吐率:如何有效的利用上行和下行带宽;

  • 丢包和拥塞:如何保证服务质量(Quality of Service);

  • 延迟:对等网络的高度动态性,无法保证延迟;

  • 异构性:DSL, Wireless LAN, NAT

P2P直播技术几种类型

单播树,多播树,网状。

单播树是一种最不稳定的传输结构,一旦位于顶端的传输节点失效,所有其他节点均失效。而多播树结构有较好的适应性。网状结构的适应性最好,但是也最复杂,我给出一个网状结构的示意图

wKiom1RD1RmRkAxVAAEGWcZ0zCs683.jpg

大家看见由于视频源把内容传输给了多个终端节点,这些终端节点再利用对等网络的相关技术形成复杂的网状结构,在这个庞大的传输网内大多数节点既是客户端又是服务端,负担着自己的责任,贡献着自己的能力。

这里有个图表对这几种网络结构的特点进行了比较,大家可以参看一下

wKioL1RD1XPS4ApjAAHtCXm3ZGo772.jpg

参考资料:《对等网络:结构、应用与设计》

多看这方面的优秀开源代码和论文

本文转自永远的朋友博客51CTO博客,原文链接http://blog.51cto.com/yaocoder/1565740如需转载请自行联系原作者


yaocoder

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
8月前
|
网络协议 安全 网络性能优化
|
分布式计算 Java 测试技术
Java网络编程实战:P2P文件共享详解
Java网络编程是现代软件开发中不可或缺的一部分,因为它允许不同计算机之间的数据传输和通信。在本篇博客中,我们将深入探讨Java中的P2P文件共享,包括什么是P2P文件共享、如何实现它以及一些相关的重要概念。
377 0
|
PHP 数据库 数据安全/隐私保护
|
4月前
|
分布式计算 负载均衡 监控
p2p网络架构模型
P2P(Peer-to-Peer)模式是一种网络架构模型,在这种模型中,每个节点(peer)既是服务的提供者也是服务的消费者。这意味着每个参与的节点都可以直接与其他节点通信,并且可以相互提供资源和服务,例如文件共享、流媒体传输等。
134 6
|
8月前
|
负载均衡 搜索推荐 区块链
P2P网络中中央服务器的作用
P2P网络中中央服务器的作用
|
8月前
|
存储 负载均衡 搜索推荐
|
8月前
|
存储 移动开发 算法
SPSS用KMEANS(K均值)、两阶段聚类、RFM模型在P2P网络金融研究借款人、出款人行为数据规律
SPSS用KMEANS(K均值)、两阶段聚类、RFM模型在P2P网络金融研究借款人、出款人行为数据规律
|
8月前
|
存储 测试技术 C++
P2P网络下分布式文件共享场景的测试
P2P网络下分布式文件共享场景的测试
307 6
|
存储 JSON 安全
使用Go语言编写区块链P2P网络(译)
使用Go语言编写区块链P2P网络(译)
992 0
使用Go语言编写区块链P2P网络(译)
|
存储 算法 网络协议

热门文章

最新文章