NAT分为四种类型:

(1)完全透明NAT(Full Cone NAT):

从内部主机      (IN IP ipa) +端口(IN PORT porta)

发送的数据映射为    IP(OUT IP IPA)和端口(OUT PORT PORTA) 发送到外网

从服务器直连到映射的  IP(OUT IP IPA)和端口(OUT PORT PORTA)上,数据将会被转发到内部主机(IN IP ipa), (IN PORT porta)上。

举例来说:内部的机器Client1(ipa:porta)连接Server1,经过NAT后,NAT会打开一个端口(IPA:PORTA)。

外网任何发到这个打开的端口(IPA:PORTA)的UDP数据包都可到达Client1(ipa:porta),不管是不是Server1发过来的。

(2)IP受限NAT(Restricted Cone):

从相同内部主机    (IN IP ipa) +端口(IN PORT porta) 发送的数据经过NAT后,映射为相同的IP(OUTIP IPA)和端口(OUT PORT PORTA)发送到外网设备Y。

和完全NAT不同的是,只有从外部机器Y发过来的请求可以被转发到内部主机(IN IP ipa) +端口(IN PORT porta) ,其他机器发过来的数据不能转发到内部机器。

也就是说进内部网的数据包的PORT不受限制, IP受限制。

举例来说:这种NAT内部的机器Client1(ipa:porta)连接Server1,经过NAT后,NAT会打开一个端口(IPA:PORTA)。

然后Server1可以用任何端口和Client1(ipa:porta)通信,其他的外网IP不行。

(3)端口(和IP)受限NAT(Port Restricted Cone)

与IP受限NAT不同的是,只有当外部主动请求的的源IP和端口 和 内部网发送请求的目的IP和端口相同时才能通信。

举例:这种NAT内部的机器Client1(ipa:porta)连接Server1,经过NAT后,NAT会打开一个端口(IPA:PORTA)。

然后Server1可以用原来的端口和Client1(ipa:porta)通信。其它端口和外网IP发送给(IPA:PORTA)的数据包会被NAT丢弃。

(4)对称NAT

如果发送的包的目的IP 和 PORT相同,那么映射 IP 和 PORT将相同。内部的同一台机器,同一个端口如果目的地址不同,那么映射的端口也不同,所以只有他主动连的服务器才可能知道他的映射后端口,别的服务器如果想连他只能靠猜测端口。

对于这种NAT,连接不同的外部目标(IP或端口不同),原来NAT打开的映射端口会变化。

举例:这种NAT内部的机器Client1(ipa:porta)连接Server1,经过NAT后,NAT会打开一个端口(IPA:PORTA)。

然后Server1只有在当前连接上才能与Client1(ipa:porta)通信。因为内部机器Client1(ipa:porta)再次连接Server1时,经过NAT后,NAT会打开另一个端口(IPA:PORTB),导致其它外部IP发给(IPA:PORTA)的数据包被NAT丢弃。

总结:前面3种NAT,映射 PORT 和 IP,是根据发送包的的内部网的IP和端口决定的。如果内网IP和端口相同,那么映射后的端口和地址是固定。这个功能为我们的穿透NAT提供了条件,可以实现P2P。

对于对称型NAT,打洞后的映射 地址和端口变得不可靠,难穿透。需借助TURN服务进行转发。

NAT穿越(一) NAT类型的更多相关文章

  1. NAT原理与NAT穿越

    最近在看东西的时候发现很多网络程序中都需要NAT穿越,特意在此总结一下. 先做一个约定: 内网A中有:A1(192.168.0.8).A2(192.168.0.9)两用户 网关X1(一个NAT设备)有 ...

  2. IPFS: NAT traversal(NAT穿越)

    IPFS是一个p2p网络,那么一定绕不开的一个问题就是NAT穿越.之前的文章里面也提到过IPFS网络连通性使用的ICE NAT穿越框架,本文简单介绍一下什么是NAT.   为什么有NAT技术? NAT ...

  3. VOIP NAT穿越之SIP信令穿越

    本文原创自 http://blog.csdn.net/voipmaker  转载注明出处. 本文是VOIP通信NAT系列专题的第三篇, 本文论述NAT对SIP协议穿越的影响.SIP协议是基于文本的,而 ...

  4. P2P网络穿越 NAT穿越

    http://blog.csdn.net/mazidao2008/article/details/4933730 ——————————————————————————————————————————— ...

  5. 转:WebRTC技术及应用2 – NAT穿越技术的使用

    评:webrtc自带的打洞,穿透协议. 转: http://www.unclekevin.org/?p=924 959 views WebRTC技术及应用2 – NAT穿越技术的使用 发表回复 (题图 ...

  6. ICE协议下NAT穿越的实现(STUN&TURN)

    正文: 一. 首先来简单讲讲什么是NAT? 原来这是因为IPV4引起的,我们上网很可能会处在一个NAT设备(无线路由器之类)之后.NAT设备会在IP封包通过设备时修改源/目的IP地址. 对于家用路由器 ...

  7. [ipsec] 特别硬核的ike/ipsec NAT穿越机制分析

    〇 前言 这怕是最后一篇关于IKE,IPSEC的文字了,因为不能没完没了. 所以,我一直在想这个标题该叫什么.总的来说可以将其概括为:IKE NAT穿越机制的分析. 但是,同时它也回答了以下问题: ( ...

  8. (转)NAT与NAT穿越学习总结--ICE过程讲的不错

    转:http://cgs1999.iteye.com/blog/1994072 1.引言网络地址转换(Network Address Translation,简称NAT)是一种在IP分组通过路由器或防 ...

  9. SOCKET 实现NAT 穿越

    在当前IPv4NAT盛行的网络环境下,两个用户要直接进行P2P连接是非常困难的.较好的解决办法是借助含公网的用户或是服务器中介实现P2P连接. NAT:Network Address Translat ...

随机推荐

  1. Android自动化测试之MonkeyRunner使用

    MonkeyRunner工具是使用Jython(使用Java编程语言实现的Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Python的程序来模拟操作控制A ...

  2. Lua IUP 环境搭建

    1.从sourceforge.net下载Luabinaries.IUP.CD.IM.LuaGL的源码 2.编译CD 2.1.用cd\mak.vc12中的lua_version53.props替换lua ...

  3. C++版 - 剑指offer 面试题63:二叉搜索树的第k个结点(二叉树中序遍历的应用) 题解

    面试题 63:二叉搜索树的第k个结点 题目:给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 (见下面的图1) 中,按结点数值大小顺序第三个结点的值 ...

  4. [NewLife.XCode]脏数据

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...

  5. SpringMVC跨域问题排查以及源码实现

    SpringMVC跨域问题排查以及源码实现 最近一次项目中,将SpringMVC版本从4.1.1升级到4.3.10,出现跨域失败的情况.关于同源策略和跨域解决方案,网上有很多资料. 项目采用的方式是通 ...

  6. 翻译:XtraDB/InnoDB中的AUTO_INCREMENT处理方式(已提交到MariaDB官方手册)

    本文为mariadb官方手册:XtraDB/InnoDB中的AUTO_INCREMENT处理方式的译文. 原文:https://mariadb.com/kb/en/auto_increment-han ...

  7. #if 与 #ifdef 之间的区别

    先来看个例子: #define TARGET_LITTLE_ENDINA 1 #define TARGET_BIG_ENDINA 0 #ifdef TARGET_LITTLE_ENDINA call ...

  8. MyBatis3-配置使用log4j输出日志

    配置步骤: 1.POM的依赖引入 <!-- log4j --> <!-- https://mvnrepository.com/artifact/log4j/log4j --> ...

  9. 分页Sql语句

    第一种 Top剔除法.去除Top (pageIndex-1)*PageSize * FROM dbo.SBD_EXCHANGE_BILL ) EB_ID FROM dbo.SBD_EXCHANGE_B ...

  10. Java 学习笔记 反射与迭代器

    反射 使用反射获得类 Class cls = Class.forName("全类名") //包括包名 Class cls = xx.Class;//xx代表类名 使用反射获得构造方 ...