P2P原理以及如何实现(整理)

2023-11-13

前言     

   这几天看了p2p的原理以及实现的demo,整理一下。一共分为三部分,第一是概念原理,第二是demo实现,第三是p2p协议相关以及分类。 

一、概念原理 

比较全面的理解:  https://zhuanlan.zhihu.com/p/30351943

                               http://www.cnblogs.com/pannengzhi/p/4800526.html推荐

                              http://www.52im.net/thread-50-1-1.html推荐

                              https://cloud.tencent.com/developer/article/1005974(推荐)

以下(通俗理解)转载来自:https://my.oschina.net/gal/blog/141396           

        最近对p2p(peer to peer)技术十分感兴趣,以前用VB的时候曾尝试过学习穿透NAT方面的知识,很可惜那时候并没有成功(由于我当时的兴趣并不大),现在大学开始教 C++,突然间对p2p技术产生兴趣,这有很多方面的原因

        现在基本上很多网络应用的软件都涉及p2p技术(QQ,PPS,对战平台...),p2p技术旨在于摒弃以前只能从服务器获得资源的观念,每台电脑都是一个peer,都可以从其他peer上获取自己想要的资源,而同时自己也在向他人共享自己的资源.这里有一个很大的优势就是可以极大程度节省服务器的带宽.
        打个比喻,优酷和pps,一个是基于服务器->客户端的模式,一个是p2p技术,优酷要想为用户提供高清视频只能通过优化视频压缩(例如最新的H.264)和增大自身服务器带宽.而pps完全不用担心带宽问题,只要用户数量多的话基本上可以满速观看视频. 在这里在停停,pps采用的是rmvb压缩封装,体积比h264flv大上十倍,但是pps依然可以流畅观看.这就是p2p技术的优势.
        当然,我感兴趣的不是p2p在网络视频方面的应用,而是他的穿透NAT的技术,只需要提供一个服务器(当然在p2p下服务端本身可以是客户端)就能令两台或多台处于不同局域网内的电脑通信.另一方面这也算是我学习C++网络编程的入门口.
        在中国大部分用户都使用路由器或交换器之类的其他NAT设备来共享网络,这使得不同内网的用户之间的交流变得十分困难,p2p技术的出现确实另其变得可行和简便.

第二篇:

        首先,在写这第二篇文章时我对现今的p2p技术的成熟度仍不完全了解,基于udp协议的p2p技术可以很确定的说已经完全成熟了,但基于tcp协议的p2p技术是否成熟在我这几天的搜索资料中仍然未能得知.虽然最近得到了一份通过p2p使用tcp协议传输文件的源码,但其真实性仍然未检测,由于有许多可能会影响实验成败的干扰因素(例如NAT设备类型的不同,其结果可能不同),我想我会在接下来的时间主要去验证tcp应用于p2p的可行性.

        可能有很多人问,现在不是有很多软件采用p2p技术传输文件么.这说明tcp用于p2p是可以的.但至少我搜索的资料中很少这方面的消息.我想现在用于文件可靠传输有两个方法(就我知道而言,听说还有raw等其他方法),一个或许就是tcp,这是传输协议上实现的,另一个就是利用udp模仿tcp的确保文件准确完整传输的功能(大概是什么滑动窗口?).

        当然这是我日后的工作,现在我要探讨的是我目前的成果,就是基于udp协议的穿透nat的方法. 

        或许还有人不知道NAT是什么,NAT是英文Network Address Translators的缩写,翻译过来就是网络地址转化器,为什么会出现NAT呢?主要是因为ipv4提供的全球唯一ip已经日渐枯竭,也就是ipv4提供的(x.x.x.x)的地址已经不足以让全球每一台电脑都拥有唯一的ip地址,所以就有NAT的出现(当然,是先出现了NAT才开始慢慢枯竭,因为人们已经预料到ip迟早会用完),NAT可使多台电脑使用同一个全球唯一ip,(当然最近ipv6就要出了).

        而且,类似路由等NAT设备还可以防止内网主机受到外网的攻击,这也就是我们需要穿透NAT的原因,,因为路由只允许内网用户主动连接外网用户,而不允许外网用户主动连接内网用户

        现在按顺序讲下内网于外网连接的步骤(这是理解穿透NAT的阻碍因素的重要部分!!):

        1.内网用户(192.168.1.100)(端口:123)向外网用户(123.123.123.123)(端口:321)发送数据包

        2.数据包经过NAT,NAT将数据包的ip地址改为外网地址(55.55.55.55),并修改端口为另一个数,例如:6000

        3,此时的数据包变成这样: 55.55.55.55: 6000-> 123.123.123.123:321

        4.最后NAT会留下一条记录,表明如下指向 123.123.123.123:123 -> 55.55.55.55:6000 ->192.168.1.100:321

        需注意的是只有留下记录后外网特定方向的数据包(上面第四条的方向)才可以传给内网机器,而且这条记录只能由内网用户先向外网发送第一个数据包才可以产生.最重要的是这条记录只能用于123.123.123.123:123,其他地址发来的数据包NAT是会抛弃掉的! 

        还有一点:就是这条记录具有生命周期,过了一定时间会自动删除!

        了解到这点就可以知道外网和内网的通讯的十分简单的,只要内网用户事先知道服务器的地址,而且先向服务器请求服务就可以建立连接了!

        但是内网与内网的用户该如何实现通讯??? 试想一下,就算你事先知道对方的外网ip,但是你发过去的消息会被对方NAT抛弃掉,好吧,你说可以两个人同时向对方发包,但你画出图来看看会发现也是实现不了的!

         试想一下,如果clientA和clientB都同时向对方的 520端口发送数据包(当然,两边的NAT都会抛弃掉他),虽然两边都会留下记录,但是由于NAT修改了端口号为某个数,这样导致下面两条记录:

        clientA的NAT: 44.44.44.44:520 -> 55.55.55.55:62000 -> 192.168.1.47:520

        clientB的NAT: 55.55.55.55:520 -> 44.44.44.44:75000 -> 192.168.1.5:520

        这两条记录明显不能使clientA和clientB建立起连接,因为双方的NAT都将只接收对方来自520端口的数据包,而对方发送数据包时NAT都会将原始的端口改为62000,75000(这两个数是随机的),这样当然不会建立起连接!

        再回过来想想,如果有一个处在外网的服务器可以同时记录下双方的端口号的话,这样A与B的通讯不是可以建立了么!!!!


二、Demo实现

P2P之UDP穿透(C++)基于windows平台:https://blog.csdn.net/jlccwss/article/details/7180676

P2P之UDP穿透(C++)基于Linux平台:https://github.com/pannzh/P2P-Over-MiddleBoxes-Demo

三、现有p2p协议分类与简介

http://www.cnblogs.com/pannengzhi/tag/P2P/

四、应用

BT和磁力链接下载原理

详解什么是BT种子、迅雷下载链接、磁力链接、电骡等及使用教程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

P2P原理以及如何实现(整理) 的相关文章

  • stata--异方差检验

    异方差检验有两种方法 1 残差图 2 white检验 1 残差图 一般不用这个 这个只是粗略 代码 reg y fdi rvfplot yline 0 rvpplot fdi yline 0 1 对y和fdi回归 2 画出残差与拟合值 y
  • Windows7旗舰版和10 创建原始套接字失败,代码10013

    笔记本重装系统后 以前能运行的程序中的Ping程序不能运行了 查看代码 创建套接字失败 RawSock socket AF INET SOCK RAW IPPROTO ICMP RawSock INVALID SOCKET 用DWORD d
  • llvm 介绍有用的网站

    LLVM笔记 7 指令的side effect LLVM笔记 7 指令的side effect Five100Miles 博客园 LLVM每日谈之十八 GEP Instruction的几点总结 LLVM每日谈之十八 GEP Instruct
  • springboot多模块打包配置问题

    工程案例结构 baidu 聚合过程 baidu web 子模块web工程 baidu service 子模块 baidu config 子模块配置工程 注意事项 配置步骤 1 baidu 聚合工程 工程下的 pom xml 文件案列如下
  • 虚拟计算技术

    虚拟计算的本质是资源共享 P2P计算 云计算 网格计算 普适计算都属于虚拟计算 一 概述 虚拟计算 Virtual Computing 的本质是资源共享 虚拟计算技术不仅能使人们更有效地共享现有的资源 而且能通过重组等手段 为人们提供更多
  • 通过python程序调取摄像头画面

    目录 1 方法 2 演示代码 3 总结 1 方法 想要调取摄像头画面有这么几个前提 需要使用网络摄像头并且支持RTSP协议 摄像头要和你的电脑在同一个局域网下 需要知道摄像头的账号 密码 IP地址 RTSP协议是一种网络传输协议 不同的摄像
  • TCP P2P 无需服务器

    是否可以编写没有服务器的TCP P2P程序 当我在谷歌上搜索这个问题时 我发现了一些关于 NAT 穿越 UPnP 的内容 我可以以某种方式使用它们吗 是的 你可以 正如 GrandmasterB 指出的那样 每个对等点都有服务器和客户端套接
  • 是否可以连接两个或多个 WiFi Direct 组?

    我目前正在为我正在进行的一个项目尝试 WiFi Direct WiFiP2p 并想知道是否可以在组之间创建桥梁 从而将它们连接在一起 基于白皮书由 WiFi 联盟发布 这应该是可能的 尽管 P2P 规范没有描述此功能的机制 实施是特定于供应
  • 使用epoll时需要将socket设为非阻塞吗?

    本文是回答一位知友的提问 在APUE中介绍select和poll中说 一个描述阻塞与否并不影响select是否阻塞 也就是说 如果希望读一个非阻塞描述符 并且以超时值5s调用select 则select最多阻塞5s 我看到有些程序使用epo
  • 安卓和iPhone之间的距离

    我正在寻找一种当两部手机靠近时传输数据的方法 这需要跨平台 因此我无法使用 NFC 或 iBeacon 我计划使用 allJoyn 发送信息 我只想将数据发送给距离我几英尺的其他人 有什么方法可以在其他手机上准确读取距离吗 或者我可以通过放
  • 如何用C#实现P2P?

    最近 我想使用c 和Winform开发一个简单的聊天程序 主要功能是聊天和文件传输 但是我找不到使用dotnet实现p2p的示例 谁可以帮助我 查看WCF
  • 通过多点连接发送和接收邀请

    我知道这个问题之前已经被问过 但我只是想知道为什么它在我的特定情况下不起作用 我正在尝试从一个视图控制器的多点连接发送邀请 并在另一个视图控制器上接收它 我的发送代码是 self invitePeer selectedPeerID toSe
  • NAT后的两个节点如何通信?

    我有一些节点 每个节点都属于其他网络 每个节点都有私有IP 例如192 168 0 2并保持在 NAT 之后 节点之间是否有可能进行通信 实际上 我需要在这些独立节点之间传输文件 我尝试使用这个项目 https github com lib
  • HTML5 Websockets 可以在不使用服务器的情况下直接连接 2 个客户端(浏览器)吗? (P2P)[重复]

    这个问题在这里已经有答案了 使用 HTML5 Websockets 我可以直接在 2 个客户端 浏览器 之间打开套接字 假设我知道它们的 IP 地址并且不存在 NAT 遍历问题 我想将一些数据直接从一个浏览器发送到另一个浏览器 本质上是创建
  • “dat”协议能否有效支持视频直播?

    我希望能够通过以下方式实时流式传输视频 或任何其他大型且不断修改 附加的文件 dat Here https github com beakerbrowser webdb performance它说 dat 协议不支持文件级别的部分更新 这意
  • WCF 是否支持点对点实现?

    我正在尝试在 LAN 内实现点对点消息传递和文件共享实用程序 那么 WCF 支持 p2p 吗 有人尝试过通过 WCF 进行文件共享吗 是的 它确实 请参见如何在对等网络中设计状态共享 http msdn microsoft com en u
  • 自动启用从 Internet 访问端口 4900 的方法

    我正在编写一个在端口 4900 上运行的自定义 p2p 程序 在某些情况下 当用户位于路由器后面时 无法从互联网访问该端口 是否有一种自动方式可以从互联网访问该端口 我不太确定其他 p2p 应用程序是如何工作的 有人能解释一下吗 简而言之
  • 结束两个对等方之间的 WebRTC 视频通话

    我已经使用以下命令在两个同伴之间建立了视频聊天WebRTC 我想让一个对等方结束聊天 并让另一个对等方知道聊天已结束 聊天结束后 需要为双方执行一些代码 这PeerConnection对象有一个removeStream 应该触发的方法onr
  • 是否可以通过互联网在两个移动设备 (iPhone) 之间连接套接字?

    是否可以通过互联网在两个移动设备 iPhone 之间连接套接字 我正在尝试发现每个设备的IP并直接连接 我知道可以使用 Bonjour 来完成 但这只适用于本地网络 我需要通过互联网在两个设备之间建立高速连接 Thanks 如果你有两个 I
  • P2P网络游戏/应用程序:类似“战网”匹配服务器的不错选择

    我正在制作一个网络游戏 1v1 游戏中是 p2p 不需要游戏服务器 然而 为了让玩家能够 找到彼此 而不需要在另一种媒介中协调并输入IP地址 类似于网络游戏的现代时代 我需要有一个协调 匹配服务器 我无法使用常规网络托管 因为 客户端将使用

随机推荐

  • 【面试总结】设计思想解读开源框架:(1)

    12 策略模式 Strategy Pattern 13 适配器模式 Adapter Pattern 14 迭代器模式 Iterator Pattern 15 组合模式 Composite Pattern 16 观察者模式 Observer
  • gcc- -O 优化选项

    查查gcc手册就知道了 每个编译选项都控制着不同的优化选项 下面从网络上copy过来的 真要用到这些还是推荐查阅手册 O设置一共有五种 O0 O1 O2 O3和 Os 除了 O0以外 每一个 O设置都会多启用几个选项 请查阅gcc手册的优化
  • json文件中数据类别个数统计与类别信息可视化

    将json文件保存的数据信息利用URL下载数据以后 希望将统计出数据集中每一类图片个数 且进行可视化 看数据分布是否均匀 然后在进行相应的操作 数据还是kaggle比赛中提供的数据集 json文件内容如下 python实现上述要求 导入相应
  • Mac创建定时任务

    Mac 有两种方式可以添加定时任务 crontab 命令 launchctl 定时任务 crontab 命令 通过crontab 命令 我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本 时间间隔的单位可以是分钟 小
  • 观察者模式 & 发布-订阅模式(设计模式与开发实践 P8)

    文章目录 观察者模式 运用 实现 观察者模式 定义 他用来定义对象之间一种一对多的依赖关系 当一个对象状态发生改变时 所有依赖他的对象都会得到通知 运用 如果我们使用过 DOM 上的事件函数 那就接触过观察者模式 document body
  • (亲测好用)idea提示内存不足( ran out of available memory)

    idea提示内存不足 ran out of available memory 错误提示 The IDE ran out of available memory Please consider increasing the value of
  • 【LeetCode】3. 无重复字符的最长子串 给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。

    3 无重复字符的最长子串 给定一个字符串s 请你找出其中不含有重复字符的最长子串的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 s bbbbb 输出 1 解
  • webpack打包优化和打包上线

    通过 npm run serve 启动本地 执行 development 通过 npm run test 打包测试 执行 testing 通过 npm run build 打包正式 执行 production 图片优化 使用 url loa
  • Uniapp低功耗蓝牙操作实例

    uniapp低功耗蓝牙在移动端使用较为平常 本文相较于官方文档介绍一下低功耗蓝牙的操作案例 即取即用 低功耗蓝牙虽工作原理与经典蓝牙类似 但是有着独特的架构体系 所以LE独立出来成为一种蓝牙形态 不过LE和经典蓝牙使用相同的2 4G无线电频
  • 机器学习好伙伴之scikit-learn的使用——datasets获得数据集

    机器学习好伙伴之scikit learn的使用 datasets获得数据集 载入sklearn中自带的datesets 利用sklearn的函数生成数据 应用示例 利用sklearn中自带的datesets进行训练 利用sklearn中生成
  • 使用ASMD 来描述硬件电路并辅助verilog 代码的编写

    TOC 使用ASMD 来描述硬件电路并辅助verilog 代码的编写 ASMD 的定义 ASM 算法状态机 图是描述时序状态机的一种抽象 类似于软件流程图 描述状态机的动作 但是ASM 图只显示控制信号和行为动作 控制状态 不显示存储元件所
  • 详谈redis之有序集合(ZSET)

    一 前言 有序集合存储着成员 member 和分值 score 的键值对 按照分值从小到大自动排序 具体细节在第一篇blog 详谈redis数据结构 中 不太熟悉的同学可以回去查看 对Java不太熟悉的同学可关注文章末尾的公众号 里面满满干
  • uniapp小程序的苹果 ios页面左右或上下滑动问题的解决方法效果damo(整理)

    一般来说 微信小程序的页面是不需要左右滑动的 甚至说是不允许左右滑动的 事实上 安卓手机在默认情况下就是左右不滑动的 但苹果IOS手机默认是左右可滑动的 其解决方法如下 在具体页面的顶级view元素设置class page 其CSS样式如下
  • eclipse中建动态web项目

    1 eclipse环境下配置tomcat 2 建项目 这就是一个建好的项目 3 将项目部署在tomcat服务器中 这个时候你的项目就部署在服务器上了
  • k8s 控制器:Replicaset 和 Deployment

    Deployment 官方文档 https kubernetes io docs concepts workloads controllers deployment k8s 在定义 pod 资源时 可以直接创建一个 kind Pod 类型的
  • 漫画告诉你:区块链到底是什么?

    区块链到底是什么 一幅漫画让你秒懂 区块链技术是指一种全民参与记账的方式 所有的系统背后都有一个数据库 你可以把数据库看成是就是一个大账本 目前是各自记各自的账 由于没有中心化的中介机构存在 让所有的东西都通过预先设定的程序自动运行 不仅能
  • JAVA垃圾分类网站计算机毕业设计Mybatis+系统+数据库+调试部署

    JAVA垃圾分类网站计算机毕业设计Mybatis 系统 数据库 调试部署 JAVA垃圾分类网站计算机毕业设计Mybatis 系统 数据库 调试部署 本源码技术栈 项目架构 B S架构 开发语言 Java语言 开发软件 idea eclips
  • 第一篇 香橙派刷机和开发环境准备(ubuntu20.04版)

    目录 一 香橙派刷ubuntu系统和SSH登录 1 Ubuntu有趣的Codename 2 刷机步骤 ubuntu20 04 格式化TF卡 烧写系统到TF卡 调试串口登陆系统 SSH登陆系统 二 开发环境准备 1 香橙派ubuntu20 0
  • “宝藏”,实用网站整理 - 持续更新ing

    文章目录 一 编程类 1 在线编程工具 1 ideone com 2 Octave Online 3 Anycodes 在线编程 2 编程刷题网站 1 LeetCode 2 牛客网 二 在线工具类 1 菜鸟工具 2 在线工具 程序员的工具箱
  • P2P原理以及如何实现(整理)

    前言 这几天看了p2p的原理以及实现的demo 整理一下 一共分为三部分 第一是概念原理 第二是demo实现 第三是p2p协议相关以及分类 一 概念原理 比较全面的理解 https zhuanlan zhihu com p 30351943