一 NAT的类型

NAT可以分为很多种,但是最为普遍的是传统NAT,或者称为向外NAT。向外NAT在默认情况下只允许向外的Session穿越NAT,这就是我们最为常见的情况。

这种向外NAT又可以分为基本NAT(Basic NAT)和NAPT(Network Address/Port Translation)。

1.  基本NAT

基本NAT只转换IP地址,而不转换端口。一个基本NAT往往需要具有多个公网IP来满足多个内网节点中具有相同端口的应用程序的同时访问。由于这种类型的NAT设备限制大,现在已不常见。

2.    NAPT

(注:Endpoint表示一个IP地址和端口对)

与基本NAT只转换IP地址不同,NAPT转换整个Endpoint。由于NAPT允许内网内的多个节点通过共享的方式使用同一个IP地址,因此,如今NAPT类型的NAT设备已经越来越多。

NAPT又可以进一步分为以下四种类型:

(1)   完全锥型NAT(FULL CONE NAT)

完全锥型NAT在内网用户A(Private Endpoint)首次向外部主机发送数据包时创建地址映射会话,并为A分配一个公网地址和端口(Public Endpoint),以后任何A向外部发送的数据都将使用这个Public Endpoint。此后,任何外部主机想要与A通信,只要将数据包发送到Public Endpoint上,A就能够顺利的进行接收。

(2)   限制锥型NAT (RESTRICT CONE NAT)

限制锥型NAT在内网用户A(Private Endpoint)首次向外部主机发送数据包时创建地址映射会话,并为A分配一个公网地址和端口(Public Endpoint),以后任何A向外部发送的数据包都将使用这个Public Endpoint。此后,如果某个外部主机(Endpoint IP:PORT)想要与A通信,只要将数据包发送到Public Endpoint并且保证A曾用当前与NAT的会话向该外部主机的IP地址发送过数据,A就能够正常收到外部主机(Endpoint IP:PORT)发送来的数据包。

(3)   端口限制锥型NAT(PORT RESTRICT CONE NAT)

端口限制锥型在内网用户A(Private Endpoint)首次向外部主机发送数据包时创建地址映射会话,并为A分配一个公网地址和端口(Public Endpoint),以后任何A向外部发送的数据都将使用这个Public Endpoint。此后,如果某个外部主机(Endpoint IP:PORT)想要与A通信,只要将数据包发送到Public Endpoint并且保证A曾用当前与NAT的会话向该外部主机的Endpoint发送过数据,A就能够正常收到外部主机(Endpoint IP:PORT)发送来的数据包。

(4)   对称型NAT(SYMMETRIC NAT)

对称型NAT是一种比较特殊的NAT。内网用户A(Private Endpoint)首次向外部主机S1发送数据包时创建地址映射会话Session1,并为A分配一个公网地址和端口(Public Endpoint1),以后A所有发向S1的数据包都使用这个Public Endpoint1。如果之后A用同一个Socket向外部主机S2发送数据包,这时对称型NAT又为其分配一个地址映射会话,并为A分配一个新的公网地址和端口对(Public Endpoint2),以后A所有发向S2的数据包都使用这个Public Endpoint2。对称型NAT规定Public Endpoint1和Public Endpoint2一定不相同。此外,如果任何外部主机想要发送数据给A,那么它首先应该收到A发给他的数据,然后才能往回发送,否则即使他知道内网主机的Public Endpoint也不能发送数据给A。这种NAT可以通过端口猜测等方法进行穿透,但是效果并不是很好,很难实现UDP-P2P通信。

二 NAT类型的检测

前提条件:一个提供两个公网地址(通信地址分别设为:Endpoint1与Endpoint2)的服务器S进行UDP端口数据监听并根据客户的要求给出响应;待检测的用户可以正常进行UDP通信。

步骤1.    检测主机是否位于NAT后

为了检测IP地址是不是公网地址,主机A首先发送任意一个UDP数据包给服务器S(Endpoint1),S收到包之后,用Endpoint1将接收到数据包头的IP地址和端口打成一个UDP反馈包发送给用户A。A在收到反馈包之后,比较自身的Endpoint和反馈包中的Endpoint,如果一样则说明A不位于任何NAT之后,否则,就是位于NAT之后,这里并不能判断NAT的具体属于哪一种类型。

步骤2.    检测NAT是否是完全锥型

为了检测所处的NAT是否是完全锥型的,主机A向服务器S(Endpoint1)发送UDP数据包后,服务器用Endpoint2将接收到数据包头的IP地址和端口打成一个UDP反馈包发送给用户A。另外,A在发送UDP数据包后,立即开始端口侦听,设定一个等待时间上限,防止无限堵塞(因为接收是一个While循环)。这样进行若干次,如果A每次都没有收到数据包,说明A所处的NAT类型不是完全锥型的;相反,在这整个过程中只要收到一次服务的包,就说明A所处的NAT类型是完全限制型的。

步骤3.    检测NAT是否是对称型

为了检测所处的NAT是否是对称型的,主机A向服务器S(Endpoint1)发送UDP数据包,服务器S(Endpoint1)在收到数据包后,用Endpoint1将接收到数据包头的IP地址和端口打成一个UDP反馈包发送给用户A。另外,A在发送数据包后,开始侦听端口并接收数据,设定一个等待时间上限,防止无限堵塞(因为接收是一个While循环)。与此同时,主机A用同一个套接字向服务器S (Endpoint2)发送UDP数据,Endpoint2发送与上面类似的UDP回馈包。在A的整个数据接收过程中,如果收到的服务器反馈数据包中标识自身的IP地址和端口存在不相同的情况,就说明NAT是对称型的,否则就不是。

步骤4.    检测NAT是限制锥型的还是端口限制锥型

最后,为了检测所处的NAT是限制锥型的还是端口限制锥型的,主机A向服务S的Endpoint1发送UDP数据包,服务器用与Endpoint1相同的IP地址和不同的端号将带有A的Public Endpoint的UDP反馈包发送给A。另外,A在发送数据包后,立即侦听端口和并进行数据接收,设定一个等待时间上限,防止无限堵塞(因为接收是一个While循环)。重复若干次。如过在整个过程中,用户A收到S发来的数据包,就说明NAT是限制型的;否则就说明NAT是端口限制型的。

NAT类型及检测方法相关推荐

  1. NAT 类型及检测方法

    NAT 类型及检测方法 STUN协议是一个客户机/服务器协议,在公网上存在着大量的STUN服务器,用户可以通过在自己主机上运行STUN客户端远程连接STUN服务器来确认自身的网络状况. 客户端主机所在 ...

  2. [转]NAT类型与检测

    NAT类型与检测 一.NAT分类 Full Cone NAT(完全圆锥型) Address Restricted Cone NAT(地址限制圆锥型) Port Restricted Cone NA ...

  3. NAT类型与验证方法

    概念 内部Tuple:(源)内网IP+PORT(例如:192.168.1.5:50007) 外部Tuple:(源)公网IP+PORT 目标Tuple:(目标)公网IP+PORT NAT类型介绍 Sym ...

  4. Linux怎么检测nat类型,STUN(RFC3489)的NAT类型检测方法

    在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet.很多时候,我们希望网络中的两台主机能够直接进行通信(即所谓的P2P通信),而不需 ...

  5. Nature子刊:三代Nanopore测序检测细菌和菌群多种DNA甲基化类型的新方法

    人类基因组中最广泛的 DNA 甲基化为5-methylcytosine (5mC),而细菌中有三种常见的 DNA 甲基化: N6-methyladenie (6mA), N4-methylcytosi ...

  6. P2P内网穿透之Nat类型介绍及Nat类型检测16种NAT组合穿透操作指南整理

    目录 根据RFC 3489规定 Nat共分以下类型: 第一部分: NAT类型介绍 Full Cone NAT: Restricted Cone NAT: Port Restricted Cone NA ...

  7. 路由器NAT类型检测

    考虑到UDP的无状态特性,目前针对其的NAT实现大致可分为Full Cone.Restricted Cone.Port Restricted Cone和Symmetric NAT四种.值得指出的是,对 ...

  8. Linux设备检测外部网络NAT类型

    Linux设备检测外部网络NAT类型 在异地组网的过程中发现,对称型NAT(Symmetric NAT)对P2P穿透的支持很不好,因此在搭建P2P穿透个人使用的客户端或服务器之前有必要搞清楚自己所在网 ...

  9. openwrt上用stun实现NAT类型检测

    一.安装stun: 相关组件下载参照:https://github.com/awe1p/stun cd到openwrt源代码路径 git glone https://github.com/awe1p/ ...

最新文章

  1. python语言有什么用-python语言为什么好呢?它有什么特点?
  2. 机器学习算法基础——朴素贝叶斯算法
  3. C++ 普通函数与函数模板 区别以及调用规则01
  4. 聊聊RocksDB Compact
  5. 理工男最该死的十二个瞬间
  6. (58)UART外设驱动用户发送模块(三)(第12天)
  7. netcore5开发Android,那些鼓吹国内首个.NET 5框架的,该醒醒了!
  8. 多模块Struts应用程序的几个问题(及部分解决方法)
  9. DevExpress控件学习之GridControl的Row拖拽
  10. 华为机试HJ3:明明的随机数
  11. 机器学习入门——详解主成分分析
  12. NYOJ题目79-拦截导弹(最长递减子序列)
  13. Unity3D 2D贴图 与 帧动画
  14. Java验证身份证号
  15. html在页面显示一个正方形,CSS实现一个自适应的正方形的方法示例
  16. MultiMC的离线模式启动
  17. 高效的学习方法(几个小技巧)
  18. uni-app 使用 Uview2.x 搭建自定义tabbar组件
  19. 泰国证券交易所预计将在本月批准5个ICO项目
  20. 英文表格如何快速转换为中文?

热门文章

  1. 基于注解的AOP实现事务控制及问题分析
  2. Spring AOP源码解析(二)—— AOP引入
  3. 我什么计算机作文600字,我家的电脑作文600字
  4. 搜索专题:bfs和dfs
  5. 【报错笔记】关于tomcat启动不了,闪退问题。
  6. exit()函数学习
  7. Session执行机制与原理
  8. 『原创』+『参考』使用C#在PPC的Today界面上的任务栏加入应用程序图标
  9. Saltstack-6:模块
  10. UEFI Shell 常用命令