P2P穿透&四种NAT类型

以下对四种NAT类型分别予以说明:

1.全锥形NAT

IP、端口都不受限。只要客户端由内到外打通一个洞之后(NatIP:NatPort -> A:P1),其他IP的主机(B)或端口(A:P2)都可以使用这个洞发送数据到客户端。

映射关系为:Client->NatIP:NatPort->Any,即任何外部主机都可通过NatIP:NatPort发送数据到Clietn上。

2.受限锥形NAT

IP受限,端口不受限。当客户端由内到外打通一个洞之后(NatIP:NatPort -> A:P1),A机器可以使用他的其他端口(P2)主动连接客户端,但B机器则不被允许。

映射关系为:Client-> NatIP:NatPort->A,即只有来自A的数据包才能通过NatIP:NatPort发送到Client上。

3.端口受限锥型

IP、端口都受限。返回的数据只接受曾经打洞成功的对象(A:P1),由A:P2、B:P1发起的数据将不被NatIP:NatPort接收。

映射关系为:Client->NatIP:NatPort->A:P1,即只有来自A:P1的数据才可通过NatIP:NatPort发送到Client上。

4.对称型NAT

对称型NAT具有端口受限锥型的受限特性。但更重要的是,他对每个外部主机或端口的会话都会映射为不同的端口(洞)。只有来自相同的内部地址(IP:PORT)并且发送到相同外部地址(X:x)的请求,在NAT上才映射为相同的外网端口,即相同的映射。一个外部地址(X:x)对应一个NAT上的映射,如上图红色三角,每个映射仅接收来自他绑定的外部地址的数据。注:X在这里意为任意一台外部主机,x为这台主机上的任意一个端口。

映射关系为:Client->NatIP:Pa1->A:P1,当Client访问B:P1时,映射关系变为:

Client->NatIP:Pb->B:P1,同理,NatIP:Pa2也就是Client访问A:P2时的映射。

以上我们只是说了一点基本的理论。接下来我们要实现不同内网通过internet网进行通迅
再来,我们举个图例

A<----------->NatA<---------->NatB<---------->B
A的地址是:192.168.1.100端口4000
B的地址是:192.168.1.100端口4000
它们两个都是内网的地址。及局域网内部地址。并不是全球唯一地址。
两个路由:
NatA的地址是:222.182.100.1
NatB的地址是:222.182.100.2
这两个路由是外网的地址,及全球唯一地址。

现在我们要实现A与B的通迅。
因为A与B都不是外网地址。所以A不可能向192.168.1.100发送消息。这消息只会它自己收到,因为这个IP是它自己的。同样B也不可以。
那么A向NatB发送消息,B能收到吗?答案是否定的,不能收到。刚才我们提到过。因为路由没有映射B的地址。A并不知道这个Session就连NatB也不知道这个Session因为B没有向A发送消息,并不产生这个Session。
就算B和A同时向双方的路由发送消息,产生的Session,A和B也得不到。因为在路由上就把这个消息当做为无用包给丢弃掉了。

那么这样的情况我们要进行通迅怎么办呢?
对,就是刚才我们提到的第三方。第三方是个什么方呢?
第三方必须是一个拥有固定外网IP的服务方。及一个外网服务器。全唯一IP地址。

图例:
假定我们这个第三方为C
C  IP:222.182.100.3端口4001
A<----------->NatA<--------------->C<-------------------->NatB<------------->B
                    ↑______________________________↑

原理如下
A通过路由向C发送消息,C获取A的在路由上的Session地址,映射的IP和端口
B同样。
这时候C就有了A和B的地址。
C可以和A、B进行通迅,但是A和B还不行。
现在C需要通知A方B的映射IP和端口。也要通知B方A的映射IP和端口。
这样A就有了B的映射地址,B也有了A的。但是现在还不能进行通迅。
因为在路由上A和B都只有对C的穿透。并没有相互之前的穿透。
那么A要向B发送消息怎么办呢?需要C向B发送一个消息告诉B方A的地址让B向这个地址发送一个消息,对A进行一个穿透。
这样A就可以向B发送消息了。在A向B发送消息的同时,A也在向B进行穿透。
这样就可以实现相互的通迅了。如果有多个端点,也就以此类推了。
宗上所述就是P2P的UDP实现原理了。TCP也是一样的。提示一点。Session在路由上是有时限的,一分钟到几小时不定。不同的路由不同的时间,为了保持这个Session的存在,你需要在固定时间点进行通迅,保持这个穿透,否则就得重新穿透。

值得注意的一点。
路由上的映射有两种情况
第一种情况是:Cone NAT
第二种情况是:Symmetric NAT
我们以上的实现是以Cone Nat为基础的。为什么呢?因为Cone Nat在映射的时候端口是不变的。无论你内网有多少台机器,向外网发送消息在路由上映射的端口都是不变的。

而Symmetric Nat则相反,一个映射一个端口。如果碰到这种情况只有祝你好运了,最好不要猜

P2P穿透四种NAT类型相关推荐

  1. ospf的四种网络类型

    原文链接:https://blog.csdn.net/weixin_37945631/article/details/79498334 https://blog.csdn.net/qq_3921960 ...

  2. OSPF的四种网络类型详解

    OSPF的四种网络类型 BMA网络 P2P网络 NBMA网络 P2MP网络 不同网络类型是否可以建立邻居 OSPF链路认证 注意:loopback接口默认OSPF网络类型为P2P,但是生成路由的网络掩 ...

  3. python中内置的四种数值类型为_浅谈python语言四种数值类型

    Python语言支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下.希望对 ...

  4. 卷积神经网络四种卷积类型

    卷积神经网络四种卷积类型 https://www.toutiao.com/a6631333810287936013/ 一般卷积 首先,我们需要就定义卷积层的一些参数达成一致. 卷积核大小(Kernel ...

  5. VMware vSphere四种迁移类型的区别与适应场景

    最近一直刚开始接触VMware vSphere这款虚拟化软件,每天的过程都是上午学新知识不理解,痛苦:下午实验各种出错,折磨:晚上回顾一天所学,五味陈杂,不过相比上午,下午已经好很多了.然后第二天依旧 ...

  6. python中long类型_浅谈python 四种数值类型(int,long,float,complex)

    Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下. 数字数据 ...

  7. python数字类型floatcomplexint_浅谈python 四种数值类型(int,long,float,complex)

    Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下. 数字数据 ...

  8. 四种依恋类型_依恋关系的研究

    说到依恋关系,大家都会想到安全型.焦虑型.回避型,以及这些类型会影响到成年后的人际关系.本文具体罗列一下心理学家研究依恋关系的都做出了怎样的努力. 第一:哈罗做的恒河猴验. 实验情境:把小猴放在一个笼 ...

  9. 四种依恋类型_“我值得被爱吗?”| 如何在亲密关系中培养安全型依恋

    缺爱的人最后会和什么样的人在一起?文 | 徐非儿(简单心理认证·实习咨询师) 如果我们尝试给"缺爱"下一个笼统的定义,那可能是:在成长过程中缺乏被关爱的经历,例如总是遭到主要养育者 ...

最新文章

  1. 记一次 react 15.3.1 老项目升级到 react 16.7.0 之路
  2. UVa 1639 (期望) Candy
  3. php怎么分割页面,用html如何把页面分割成多个文件,由多个文件拼接而成?
  4. 多平台聚合直播PHP源码
  5. Shell自动备份部署新项目
  6. Linux下GNOME桌面的安装
  7. c语言单片机当型编程,手把手教你学单片机的C语言程序设计(十四).pdf
  8. matlab停止运行命令_matlab终止运行命令
  9. win10安装visio2010出错_win10系统安装Office2010提示错误1935的解决方案
  10. Win10有哪些方便快捷的操作小技巧?
  11. 网友抽中淘宝大奖,怎料小丑竟是自己
  12. mysql1026_PAT Basic 1026(示例代码)
  13. 科研第二步:远程在服务器上跑程序jupyter使用
  14. [网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登录加密入门笔记
  15. 怎么把ppt文字大小设置一致_学会这个方法,轻松制作海报级别的霓虹灯PPT!
  16. vue按钮10S秒后禁用
  17. 【GoogLeNet】海洋生物识别
  18. 网页更新提醒官方教程(插件安装)
  19. 基于TCP的安卓与服务器交互开发
  20. Win10 系统无法用自带的照片编辑器查看照片的原因

热门文章

  1. linux多线程学习(七)——实现“生产者和消费者”
  2. 从程序员到项目经理(11):每个人都是管理者
  3. VMware、Ubuntu和apt
  4. 山东大学2020计算机考研学硕,2020山东大学考研学硕复试分数线
  5. java并发之CopyOnWirteArrayList
  6. Java开发岗位面试题
  7. Linux服务器SSH免密登录
  8. 001.常见监控简介
  9. 【NOIP2016提高A组模拟10.15】打膈膜
  10. 日常(关于游泳之列的真理问题讨论)