一、P2P打洞原理

1、打洞解决了什么问题?

我们平常使用的一般都为私有ip,但是私有ip之间是不能直接通信的,如果要进行通信只能通过公网上的服务器进行数据的转发,难道我们每次发送数据都要经过公网上的服务器转发吗?也不是不可以,但是服务器的承受能力就会大大增加。此时就需要我们的打洞技术的出现了,打洞的出现解决了私有ip之间直接通信的问题(还是需要经过一次公网服务器)
例如:QQ中的聊天就广泛的使用到了打洞技术,不然服务器的承受能力会大大增加,而且会影响聊天的效率。

2、打洞的实现过程与原理

私有ip的数据都要经过路由器的转发,路由器上有一张NAPT表(IP端口映射表),NAPT表记录的是【私有IP:端口】与【公有IP:端口】的映射关系(就是一一对应关系),本文讲到的路由均是以NAPT为工作模式,这并不影响对打洞。实际中的数据实际发送给的都是路由器的【公有IP:端口】,然后经过路由器进过查询路由表后再转发给【私有的IP:端口】的。

举个示例:
用户A
电脑IP:192.168.1.101
桌面上有个客户端程序采用的网络端口:10000
路由器的公有IP:120.78.201.201(实际中常常为多级路由,这里以最简单的一层路由举例)
NAPT路由器的NAPT表的其中一条记录为:【120.78.201.201:20202】-【192.168.1.101:10000】

用户B
电脑IP:192.168.2.202
桌面上有个客户端程序采用的网络端口:22222
路由器的公有IP:120.78.202.202
NAPT路由器的NAPT表的其中一条记录为:【120.78.202.202:20000】-【192.168.2.202:22222】

打洞服务器P2Pserver
IP:120.78.202.100
port:20000

此时用户A的电脑发给了服务器一条数据,服务器收到用户A的IP与端口是多少呢?当然为120.78.201.201:20202,数据包经过路由的时候进行了重新的封包。如果服务器此时发一条数据给用户A,发往的IP与端口是什么呢?当然为120.78.201.201:20202,此时路由器收到这个数据包后,进行查询NAPT表中120.78.201.201:20202对应的IP与端口信息,发现是192.168.1.101:10000,然后路由器就转发给IP为192.168.1.101:10000的电脑,然后电脑上的应用程序就收到这条信息了。

既然如此,我们私有IP虽然不能直接通信,但是我们能够发给公有IP!如果用户B需要给用户A发一条信息时,用户B直接将数据发往目的IP、端口为120.78.201.201:20202的地方不就行了?
这里有两个问题:
第一,用户B怎么知道用户A在路由上映射的IP与端口;
第二,用户B直接将数据包发往120.78.201.201:20202,路由器是会将用户B的数据包丢弃的,因为路由器里面没有关于用户B120.78.202.202的路由信息(路由器里面还有个路由表,用于路由),无法进行路由,所以将会进行丢弃。

如何解决第一个问题?
通过打洞服务器,将用户A映射的IP、端口信息告诉用户B即可。
如何解决第二个问题?
如果打洞服务器首先告诉用户A先发一条信息给用户B(用户A得知用户B的地址信息也是通过打洞服务器),注意此时用户B是收不到的,用户B的路由同样会进行丢弃,但是这并不要紧,因为用户A发了这条信息后,用户A的路由就会记录关于用户B的路由信息(该信息记录的是将用户B的IP信息路由到用户A电脑),然后此时用户B再发给用户A一条信息,就不会进行丢弃了,因为用户A的路由里面有用户B的路由信息。

通过解决上面的两个问题后,我们再通过图形示意图来具体了解下打洞的过程

整个过程就是我标的序号1->2->3->4->5->6->7->8>9
过程一:1->2
此过程为用户B向服务器请求向用户A打洞
过程二:3->4
此过程为服务器相应用户B的打洞请求,告诉用户A用户B想与你打洞(数据包中包含用户B的地址信息)。
过程三:5->6
用户A主动发一条信息给用户B,目的是为了使得路由器A中能够有一条关于路由B的IP的路由信息(注意不是用户B,用户B是私有IP),就如图所示,这条信息会被丢弃的,因为路由B的路由表中没有路由A的IP的信息。
过程四:7->8->9
用户B再发一条信息给用户A,因为此时路由A的路由表中有关于路由B的IP的路由信息,此时路由A就能路由给用户A了,至此,用户A就能直接收到用户B发的信息了。注意,此时用户A发给用户B不需要打洞,因为路由B中已经有关于路由A的IP的路由信息了。

P2P打洞原理(二十二)相关推荐

  1. 自然语言处理系列二十二》词性标注》词性标注原理》词性介绍

    注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书<分布式机器学习实战>(人工智能科学与技术丛书)[陈敬雷编著][清华大学出版社] 文章目录 自然语言处理系列二十二 词性 ...

  2. 数据库原理(十 二)- 逻辑结构设计

    数据库原理(十 二)- 逻辑结构设计 前言 E-R图向关系模型的转换 数据模型的优化 设计用户子模式 前言 概念结构是独立于任何一种数据模型的信息结构,逻辑结构设计的任务就是概念结构设计阶段设计好的基 ...

  3. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  4. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  5. OpenCV C++案例实战二十二《手势识别》

    OpenCV C++案例实战二十二<手势识别> 前言 一.手部关键点检测 1.1 功能源码 1.2 功能效果 二.手势识别 2.1算法原理 2.2功能源码 三.结果显示 3.1功能源码 3 ...

  6. 2021年大数据Hadoop(二十二):MapReduce的自定义分组

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...

  7. 一位中科院自动化所博士毕业论文的致谢:二十二载风雨求学路,他把自己活成了光.........

    4月18日,中国科学院官方微博发布消息,披露了这篇论文为<人机交互式机器翻译方法研究与实现>,作者是2017年毕业于中国科学院大学的工学博士黄国平. 这篇论文中情感真挚的<致谢> ...

  8. iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)

    iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2) 此时,当用户轻拍按钮后,一个叫tapButton()的方法就会被触发. 注意:以上这一种方式是动作声明和关联一起进行的,还有一种先 ...

  9. 实验二十二 SCVMM中的SQL Server配置文件

    实验二十二 SCVMM中的SQL Server配置文件 在VMM 2012中管理员可以使用 SQL Server 配置文件,在部署完成虚拟机之后,实现 SQL Server 数据库服务自动化部署并交付 ...

最新文章

  1. windows命令_用Windows恢复环境(WinRE)排除电脑故障,只需一条命令
  2. golang基础-chan的select操作、定时器操作、超时控制、goroutine中使用recover
  3. Golang + Goland环境配置 + Goland破解
  4. 两个list关联合并_算法分享---两个有序链表的合并(C语言)
  5. Mongodb 自动增长 自增id 实现
  6. mysql基础语法(常用)
  7. javaBean List Map json(转)
  8. 关联查询一张小表。对性能有影响吗(mysql)
  9. 基于单片机步进电机ppt答辩_基于单片机的步进电机式汽车仪表的设计(含电路原理图,程序)...
  10. elcipse 中利用maven创建web工程
  11. Ubuntu下VSCode使用等宽字体设置
  12. 图像检索:基于内容的图像检索技术
  13. 格力悄悄上架“大松5G手机”董明珠又杀回手机圈了?
  14. React路由官方网站
  15. Desmos图形计算器创建回归方程
  16. web前端面试总结(自认为还算全面哈哈哈哈哈!!!)
  17. 计算机网络协议(三)——UDP、TCP、Socket
  18. Linux常用的终端操作命令
  19. Termios 百科
  20. @lru_cache 内置 LRU 缓存

热门文章

  1. 一行命令获取当前JVM所有可设置的参数以及当前默认值
  2. HTML5矢量实现文件上传进度条
  3. 重定位代码Repair
  4. Vagrant虚拟化技术
  5. JAMStack-SSR/SSG 框架
  6. Quill – 可以灵活自定义的开源的富文本编辑器
  7. 【机器学习】竞争神经网络(Competitive Neural Network)的python实现
  8. 机器学习--支持向量机(六)径向基核函数(RBF)详解
  9. sql时间转换时分秒_SQL时分秒之间相互转换
  10. java执行db2命令_送你一份P6级Java面试题