前言

这几天看了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协议分类与简介

https://www.cnblogs.com/cgli/archive/2012/05/11/2496027.html

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

四、应用

BT和磁力链接下载原理

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

P2P原理以及如何实现(整理)相关推荐

  1. 《教育学原理》知识框架整理

    <教育学原理>知识框架整理 一.教育学概述 (一)教育学的概念:教育学是研究教育现象和教育问题,揭示教育规律的科学. (二)教育学的研究对象:教育学以教育现象.教育问题为其研究对象,通过对 ...

  2. 真香定律!Android动态换肤实现原理解析,吐血整理

    自己项目中一直都是用的开源的xUtils框架,包括BitmapUtils.DbUtils.ViewUtils和HttpUtils四大模块,这四大模块都是项目中比较常用的.最近决定研究一下xUtils的 ...

  3. P2P原理及UDP穿透简单说明

    本文章出自cnntec.com的AZ猫著,如需要转发,请注明来自cnntec.com Peer-To-Peer缩写P2P 中文称之为对等联网. 用途于交流,比如QQ,MSN等等. 文件传输.分布式数据 ...

  4. IIS Web 服务器/ASP.NET 运行原理基本知识概念整理

    前言: 记录 IIS 相关的笔记还是从公司笔试考核题开始的,问 Application Pool 与 AppDomain 的区别? 促使我对进程池进了知识的学习,所以记录一下学习的笔记. 我们知道现在 ...

  5. WIFI P2P原理深入解析

    目录 前言 1.原理及架构 2.实例及应用 3.常见的问题 前言 对Wi-Fi Direct即wifi直连,在物联,中短距离的传输稳定性明显比蓝牙具有优势,本文主要介绍两个方面:一是原理及架构,二是实 ...

  6. P2P原理的解释与实现

    关于采用UDP协议进行打洞以进行P2P会话的原理,我本来想写一篇文章作说明,但是现在已经有一篇文章把原理性的东西解释清楚了,我在这里不再作这部分的重复,可以参见这里: P2P 之 UDP穿透NAT的原 ...

  7. P2P原理 和技术演变(概念性质)

    P2P是peer-to-peer的缩写,peer在英语里有"(地位.能力等)同等者"."同事"和"伙伴"等意义. 这样一来,P2P也就可以理 ...

  8. 计算机网络原理知识点及考点整理(谢希仁第七版)

    在这里插入图片描述 计网是计算机类学生的必修课,是一门针对网络协议的科目,以下是我所总结的重要知识点(我认为),希望对正在为考试发愁的你有所帮助,有问题及时评论哦-好的话就请为我点赞吧--欢迎讨论- ...

  9. IPSEC的原理及配置步骤整理(一)

    1.概念理清 IPSEC封装模式:封装模式是指将AH或ESP相关的字段插入到原始IP报文中,以实现对报文的认证和加密,封装模式有传输模式和隧道模式两种. 2.传输模式和隧道模式比较 安生性:隧道模式高 ...

最新文章

  1. SQL_Case When 嵌套
  2. input js 离开事件_听说你熟练使用Vue.js,这9种Vue技术你掌握了吗?
  3. django中路由匹配规则
  4. 关于STM32系统构架的一点见解
  5. JAVA复习(CharSequence接口、RunTime类、System类、object类中的finalize())
  6. Asp.Net Core轻量级Aop解决方案:AspectCore
  7. C++(STL):19---deque之删除和emplace用法
  8. c 读取mysql另一个窗体中显示出来_二级ACCESS数据库4窗体的笔试题考点分析
  9. html5 websocket插件,html5实现的WebSocket一个小例子(附代码)
  10. Introduction to Latent Dirichlet Allocation
  11. idea重写接口没有@override_【自学C#】|| 笔记 19 接口
  12. python 通用数据库类型_Python开发基础之Python常用的数据类型
  13. 扒一扒微信后台架构.....
  14. 班级抽签小程序——项目总结
  15. 百度知道1000指数的关键词留链接排名到第一的实战案例
  16. AUTOCAD——多段线命令
  17. ora-20011 ora-01555
  18. 按下鼠标滚轮c语言,C++检测鼠标某键是否按下
  19. 为什么挤破头进大厂,大厂如何设置薪资职级体系?
  20. 买天猫网店转让怎么变更资料

热门文章

  1. 基于数据安全的风险评估-脆弱性识别
  2. 关于idea配置方法注释问题——完美注释
  3. 网易企业邮箱优势功能
  4. 计算机网口百兆改千兆,家里是千兆网,但是网口是百兆怎么办?
  5. 我没去BAT,用了8年时间,从乙方变成了甲方
  6. HTML学生作业网页:使用HTML+CSS技术实现非遗文化网页设计题材【汉服文化—共12个页面】
  7. Fedora17下的hadoop-1.0.4系统配置
  8. 湖南省第六届大学生计算机程序设计竞赛---弟弟的作业
  9. java版商城之一件代发设置 Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务
  10. android 点击按钮来回切换图片