NAT穿透解决方案介绍

2023-11-12

最近公司要实现在各种网络环境下面的多屏互动(机顶盒、android phone、iphone及PC端)的需求;由于IP地址资源有限的原因,目前我们使用的各种终端设备都位于局域网后面也就是多台设备共享同一个公网IP;例如:如果位于局域网里面的一个终端Agent A要与互联网上的另一个终端Agent B通信,当A发送的data packet经过局域网出口处的NAT设备时,NAT会将data packet里面的source address字段替换成相应的公网IP和Port,然后再发送data packet到Agent B。Agent B看到的source address就是经过转换后的IP和Port并不知道Agent A的局域网地址;当Agent B的响应到达Agent A的NAT设备后,NAT设备查找内存中保存的和这个外网地址相对应的内网地址,如果找到后就将这个data packet转发到这个地址,这样就实现了通信。

然而由于目前存在着各种不同类型的NAT设备对NAT有着不同的实现方式(将内外地址映射成外网地址的时候有着不同的行为方式),这就给NAT的穿透带来了麻烦;目前主要的NAT类型有如下几种:

1)Full-cone NAT, also known as one-to-one NAT

  • 一旦一个内网地址 (iAddr:iPort) 被映射到一个外部地址 (eAddr:ePort), 来自 iAddr:iPort 的任何数据包将通过 eAddr:ePort 发送.
  • 任何外部主机能够通过eAddr:ePort这个地址发送数据包到iAddr:iPort.

2)Address-restricted-cone NAT

  • 一旦一个内网地址 (iAddr:iPort) 被映射到一个外部地址 (eAddr:ePort), 来自 iAddr:iPort 的任何数据包将通过 eAddr:ePort 发送.
  • 仅只有接收到主机(iAddr:iPort)通过eAddr:ePort发送的数据包的外部主机通过该主机的任何端口发送到eAddr:ePort的数据包才能够被正确的转发到iAddr:iPort.也就是说主机有关端口无关.

3)Port-restricted cone NAT

类似于address restricted cone NAT, 但是端口号有限制.

  • 一旦一个内网地址 (iAddr:iPort) 被映射到一个外部地址 (eAddr:ePort), 来自 iAddr:iPort 的任何数据包将通过 eAddr:ePort 发送.
  • 仅只有接收到主机(iAddr:iPort)通过eAddr:ePort发送的数据包的外部主机通过该主机的相同端口发送到eAddr:ePort的数据包才能够被正确的转发到iAddr:iPort.

4)Symmetric NAT

  • 来自相同内部ip和port发送到相同目的地ip和port的请求被映射到唯一的外部ip和port地址;如果相同的内部主机采用相同的ip和port地址发送到不同的目的地,那么重新分配映射地址。
  • 只有先前收到内部主机发送的包的外部主机才能够发送返回包到内部主机。

针对前面三种NAT类型(即cone NAT)只要通信双方彼此知道对方的内部地址和外部地址的映射关系,然后通过UDP打洞的方式就可以建立相互连接的通信;但是第四种也就是Symmetric NAT的话由于每次向不同目的地发送数据包时采用不同的外部地址,也就没办法通过直接的方式建立P2P连接。

 

1.各种网络环境下的P2P通信解决方法:

(1)如果通信双方在同一个局域网内,这种情况下可以不借助任何外力直接通过内网地址通信即可;
 
(2)如果通信双方都在有独立的公网地址,这种情况下当然可以不借助任何外力直接通信即可;

(3)如果通信双方一方拥有独立的公网地址另一方在NAT后面,那么可以由位于NAT后面的一方主动发起通信请求;

(4)如果通信双方都位于NAT后面,且双方的NAT类型都是cone NAT,那么可以通过一个STUN服务器发现自己的NAT类型以及内网和外网传输地址映射信息,然后通过Signaling(信令服务器,实现了SIP协议的主机)交换彼此的NAT类型及内网和外网传输地址映射信息,然后通过UDP打洞的方式建立通信连接;

4>如果通信双方有一方的NAT类型是Symmetric NAT,则无法直接建立P2P连接,这个时候就需要借助TURN(Traversal Using Relay NAT)服务器即转发服务器来实现间接的通信;
 

2.协议及用到的相关技术介绍:

SDP:  也就是Session Description Protocol的缩写,当初始化多媒体电视会议、IP电话、视频流等会话的时候,参与者之间会要求传送媒介的详细、传输地址和其他会话描述元数据等信息;SDP为这些信息提供一种和传输方式无关的标准的表现形式。也就是说SDP仅仅只是一种描述会话信息的格式。它主要被各种不同的传输协议作为一种信息交换的格式使用列如:HTTP、RTSP、SIP、Email等各种协议。
如ICE里面的SDP内容为:
v=0
o=ice4j.org 0 0 IN IP4 192.168.106.215
s=-
t=0 0
a=ice-options:trickle
a=ice-ufrag:bc01a
a=ice-pwd:1boove7ehnpo1lqho7unefni36
m=audio 3030 RTP/AVP 0
c=IN 192.168.106.215 IP4
a=mid:audio
a=candidate:1 1 udp 2130706431 192.168.106.215 3030 typ host
a=candidate:2 1 udp 1694498815 121.15.130.xxx 64923 typ srflx raddr 192.168.106.215 rport 3030

STUN:也就是Session Traversal Utilities for NAT的缩写,NAT会话穿透工具;STUN提供了一种方式使一个端点能够确定NAT分配给它的和本地私有IP地址和端口相对应的公网IP地址和端口以及NAT的类型信息。它也为端点提供了一种方式保持一个NAT绑定不过期。NAT绑定过期则表示为相同的内网地址重新分配外网地址也就是端口号。

TURN:也就是Traversal Using Relay NAT的缩写,TURN是STUN协议的扩展,在实际应用中他也可以充当STUN的角色;如果一个位于NAT后面的设备想要和另外一个位于NAT后面的设备建立通信,当采用UDP打洞技术不能改实现的时候就必须要一台中间服务器扮演数据包转发的角色,这台TURN服务器需要拥有公网的IP地址;

SIP: 也就是Session Initiation Protocol的缩写,是一种Signaling(信令)通信协议;有许多互联网应用需要创建有多个参与者的会话和管理参与者之间相互的数据交换,然而如果这些工作让应用的参与者来实现是比较复杂的如:用户也许在端点之间移动、通过多个名称寻址和也许同时使用几种不同的媒介通信。有许多协议能够实现各种形式的多媒体会话进行数据传送例如声音、视频或者文本消息。SIP能够和这些协议一同合作,使一个客服端能够发现参与这个会话的其他客服端并共享同一会话。为了定位后面加入会话的参与者等功能,SIP能够为代理服务器创建基础设施,客服端可以通过这个代理服务器实现会话注册、邀请参与会话等功能。SIP是一个创建、修改和终止会话的灵活的多种用途的工具,不依赖于底层的传输协议并且不依赖于被创建的会话类型。

ICE:也就是Interactive Connectivity Establishment的缩写,是实现NAT穿透的一种技术方案;ICE是一种NAT穿透技术,通过offer/answer模型建立基于UDP的媒介流。ICE是offer/answer模型的扩展,通过在offer和answer的SDP里面包含多种IP地址和端口,然后对本地SDP和远程SDP里面的IP地址进行配对,然后通过P2P连通性检查进行连通性测试工作,如果测试通过即表明该传输地址对可以建立连接。其中IP地址和端口(也就是地址)有以下几种:本机地址、通过STUN服务器反射后获取的server-reflexive地址(内网地址被NAT映射后的地址)、relayed地址(和TURN转发服务器相对应的地址)及Peer reflexive地址等。

 
3.ICE进行NAT穿透的基本过程:
 
在通常的ICE部署环境中,我们有两个客服端想要建立通信连接,他们可以直接通过signaling服务器(如SIP服务器)执行offer/answer过程来交换SDP消息。
在ICE过程开始的时候,客服端忽略他们各自的网络拓扑结构,不管是不是在NAT设备后面或者多个NAT后面,ICE允许客服端发现他们的所在网络的拓扑结构的信息,然后找出一个或者更多的可以建立通信连接的路径。
下图显示了一个典型的ICE部署环境,客服端L和R都在各自的NAT设备后面,下面简单描述下ICE建立通信的过程:
(1)L和R先分别通过STUN和TURN服务器获取自己的host address,server-reflexive address、relayed address(和TURN转发服务器相对应的地址),其中server-reflexive address和relayed address通过定时刷新保证地址不过期。这些地址通常叫做candinate地址。
(2)给这些candinate地址分配优先级排序并格式化成SDP格式,通过SIP服务器交换彼此的SDP;
(3)交换完成后根据一定的原则把本地的候选和远程的候选进行配对,每一对都有自己的优先级并根据优先级进行排序后放入Check列表里面(两边都会有相同的Check列表)。
(4)然后进行连接性测试,测试前会选择一个客服端扮演Controlled角色和另一个扮演Controling角色,连通性检查完成后扮演Controling角色的客服端负责在有效的Candinate对列表里面选择一个作为一个被选中的传输通道并通知Controlled的客服端。
(5)利用被选中的candinate地址对进行通信。
 
4.ICE JAVA实现代码
 
我这里的样例代码采用ICE4J来实现,ICE4J的API文档可以参考http://bluejimp.com/jitsi/ice4j/javadoc/,在这个实现里面没有利用SIP服务器进行SDP信息的交换而是采用手动输入的方式,在生产环境中可以部署一台WebRTC服务器(NodeJS有很多开源的WebRTC实现模块)
 
  View Code

 

 
5.参考资料
 
ICE4J:http://code.google.com/p/ice4j/
STUN:http://tools.ietf.org/html/rfc5389
TURN:http://tools.ietf.org/html/rfc5766
ICE:https://tools.ietf.org/html/rfc5245
SDP:http://tools.ietf.org/html/rfc4566
SIP:http://tools.ietf.org/html/rfc3261
NAT:http://en.wikipedia.org/wiki/Network_address_translation
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NAT穿透解决方案介绍 的相关文章

  • 动态修改布局

    在代码中设置控件大小的方法 private Button mbtn mbtn Button findViewById R id btn test LayoutParams lp lp mbtn getLayoutParams lp widt
  • nginx配置多个前端项目

    最近一台服务器要配置多个前端项目 当然前后端分离就需要nginx来配置了 单个项目还好说 如下 修改nginx的nginx conf配置文件 user nobody worker processes 1 error log logs err
  • (十四)用StatsModels模块建立线性回归模型

    使用StatsModels中的api子模块 主要使用的函数有 注意大小写 OLS 普通最小二乘法 GLS 广义最小二乘法 WLS 加权最小二乘法 GLM 广义线性模型 mixed 混合效应模型 以OLS为例 函数格式为OLS endog e
  • Docker查看本地所有的镜像命令(docker images)

    查看本地所有的镜像 查看本地所有的镜像 docker images 非root用户使用 查看本地所有的镜像 sudo docker images 查看所用镜像的id 查看所用镜像的id docker images q
  • 第17届开源中国开源世界高峰论坛文集出版

    第17届开源中国开源世界高峰论坛文集将于近日出版刊出 附文集部分内容 1 文集目录 2 陆主席主旨报告 众所周知 1970年是UNIX元年 这一年也是开源在全球实质上的诞生之日 开源在全球流行至今已有52年了 自从1991年我国引进UNIX
  • 【C语言】归并排序

    一 算法描述 用递归算法把一个数组拆成两份 直到拆成一份一份的 在递归算法里添加一个函数 能把两个有序数组合并成为一个有序数组 直到完成递归 二 归并排序代码 三 测试代码 include
  • 微信小游戏_China_Fighting——player类(hero、button)

    目录 微信小游戏 China Fighting 前言 微信小游戏 China Fighting 基础支撑类 sprite animation pool 微信小游戏 China Fighting npc类 enemy mask sars 微信
  • Java图书管理系统 -- 基于Socket实现客户端服务端拆分

    图书管理系统小Demo又又又升级了 本图书管理系统已经经历了三个阶段 通过操作数组来实现图书的增删改查方法 用控制台获取用户输入来实现人机交互 通过集合容器存储对象 使用序列化在管理系统开启关闭时 加载 存储数据到本地 使用TCP协议实现客
  • Vue3生命周期了解

    Vue3生命周期 在 setup 中 可以通过 onX 的方式注册 生命周期钩子 1 beforeCreate gt 使用 setup 2 created gt 使用 setup 3 beforeMount gt onBeforeMount
  • Sentinel服务流控、熔断和降级

    谷粒商城 分布式基础篇 环境准备 谷粒商城 分布式基础 业务编写 谷粒商城 分布式高级篇 业务编写 持续更新 谷粒商城 分布式高级篇 ElasticSearch 谷粒商城 分布式高级篇 分布式锁与缓存 项目托管于gitee 一 Sentin
  • hrnetv2训练自己的数据集(cityscapes格式)

    简单记录利用hrnetv2训练自有数据时 遇到的问题 1 下载github代码 配置环境 2 假设已有原始8位图像和8位label图像 3 修改root lib datasets cityscapes py中的部分 self label m
  • vtk教程第三章 计算机图形学入门

    计算机图形学是数据可视化的基础 实际上 可视化是将数据转换为一组图形原语的过程 然后使用计算机图形学的方法将这些原语转换成图片或动画 本章讨论计算机图形学的基本原理 我们从描述光和物理物体如何相互作用形成我们所看到的开始 接下来 我们将研究
  • 2023年纳米材料和纳米技术前沿国际会议(NanoMT 2023)

    会议简介 Brief Introduction 2023年纳米材料和纳米技术前沿国际会议 NanoMT 2023 会议时间 2023年9月22日 24日 召开地点 中国武汉 大会官网 NanoMT 2023 2023 4rd Interna
  • Redis五大数据类型使用——zset

    1 Sorted Set数据类型概述 有序集合 元素类型为Sting 元素具有唯一性 不能重复 每个元素都会关联 个double类型的分数score 表示权重 可以通过权重的大小排序 元素的score可以相同 2 Sorted Set数据类
  • numpy.load和numpy.save

    http old sebug net paper books scipydoc numpy intro html id9 numpy load和numpy save函数以NumPy专用的二进制类型保存数据 这两个函数会自动处理元素类型和sh
  • 面试类链表题目汇总

    注意 红色区域为错误点 黄色区域为注意点 重点 1 链表末未添加尾节点 因为插入一个尾节点 如果为空的话就需要修改头结点 多以 void AddToTail ListNode pHead int value ListNode pAdd ne
  • Visual studio 2015 C# 快速using,快捷键修改

    最近开始学习Unity3D引擎 使用的是c 开发 经常要引用其他程序集 但是每次手动打using感觉很麻烦 VS 有个功能是显示可能的修补程序 快捷键是 ctrl 在实际使用的时候大概这个快捷键被占用了 一直没效果 就尝试着自己改 方法如下
  • 思科模拟器DHCP snooping和DAI [动态ARP绑定]

    在设备上开启dhcp中snopping功能 可以有效的防止dhcp非信任端口来的欺骗 使内部网络被攻击到 配置受信任端口是为了防止攻击者在局域网内伪装成一台DHCP服务器 对合法客户的DHCP请求做出响应 为客户提供虚假的IP地址和网关 在
  • Ubuntu 换源

    Ubuntu 换源 我真的是计算机纯小白 如果有啥不对的地方 请各位大佬指出 我一定改正 我是在 VM ware 上运行的虚拟机 用的是 Ubuntu 22 04 操作系统 要换源主要是因为我的 apt get install 命令啥都下不
  • Linux 5.13版本发布,准备支持Apple M1

    在6月27日 Linus Torvalds宣布Linux5 13版本内核发布 新版本在一些著名的平台上 如ARM MIPS RISC V上有显著更新 同时也包括了一些准备工作 为支持苹果的M1芯片所做的更新 详细特性可以参考 https w

随机推荐

  • 测试工具Jmeter下载安装(WIN10)

    1 前往Jmeter官网下载压缩包 其实这一个zip压缩包就足够了 其他的一些tgz后缀的压缩包都不用理会 没有影响 2 解压下载的压缩包 重点知识 解压时千万记好解压路径 后边会涉及到 这个压缩包应该是50MB左右 解压后会出现bin文件
  • 【算法与数据结构】关于排序的问题思考

    文章目录 引言 不断的插入值 并保证序列是递增的 Python中sort 和sorted 的区别是啥 sorted 函数如何使用 问题 如何返回排序之后的索引 问题 排序的稳定性 问题 寻找第K大的元素的算法 引出一个算法题 参考资料 引言
  • Cannot assign requested address出现的原因及解决方案(转)

    Cannot assign requested address出现的原因及解决方案 今天使用python多线程请求服务时 出现Cannot assign requested address错误 网上找了下原因 大致上是由于客户端频繁的连服务
  • 深度学习——day8 读论文(2022 硕士毕业论文)大规模车辆路径问题的深度强化学习算法研究

    大规模车辆路径问题的深度强化学习算法研究 思维导图 算法设计 预训练模型设计 Transformer模型设计 编码器 编码器原理图 第一层 扩维嵌入操作 第二层 线性回归扩维 第三层 注意力层 由两部分组成 KQV模型 注意力层机制最重要的
  • Python内置对象(字符串)

    字符串 定义 在Python中 在单引号或者双引号之间的字符集合 如果字符串中需要出现单引号或双引号 可以使用转义符号 对字符串中的符号进行转义 原始字符串只需要在字符串前边加一个英文字母 r 即可 print r C Program Fi
  • unity 代码动态加载材质求 (Material)

    首先新建一个shader 在progect面板中右键Create gt Shader gt Standard Surface Shader 右键刚才新建的shader 选择Create gt Material unity会自动创建一个名称格
  • 密码学系列之:bcrypt加密算法详解

    简介 今天要给大家介绍的一种加密算法叫做bcrypt bcrypt是由Niels Provos和David Mazi res设计的密码哈希函数 他是基于Blowfish密码而来的 并于1999年在USENIX上提出 除了加盐来抵御rainb
  • 【论文笔记】Ground Manipulator Primitive Tasks to Executable Actions using Large Language Models

    论文笔记 Ground Manipulator Primitive Tasks to Executable Actions using Large Language Models Abstract 研究目标 解决从高层任务到低层机器人执行指
  • OSPF、BGP、RIP工作原理快速理解

    目录 一 OSPF工作原理 二 BGP工作原理 三 RIP工作原理 一 OSPF工作原理 开放式最短路径优先OSPF Open Shortest Path First 协议是一种基于链路状态的内部网关协议 它封装在IP报文中 协议号是89
  • [经验技巧] 路由mini安装OpenWRT源的Transmission插件,实现PT下载(需SSH)

    原文链接 http www miui com thread 2093928 1 1 html 经过研究发现 基于OpenWRT的小米路由器系统是支持OpenWRT源中的ipk插件包的 通过opkg命令来安装 前提是找到对应CPU架构的源 硬
  • 【目标检测】《DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection》论文阅读笔记

    论文地址 https arxiv org pdf 2203 03605v1 pdf 代码地址 https github com IDEACVR DINO 计划 这周阅读本论文 1 摘要 DINO是DETR with Improved deN
  • python3--hashlib模块

    hashlib提供的摘要算法md5 sha1 sha224 sha256 sha384 sha512 blake2b blake2s sha3 224 sha3 256 sha3 384 sha3 512 shake 128 shake 2
  • 几个Linux实用快捷键分享

    1 ctrl c 强制停止 Linux某些程序的运行 如果想要强制停止它 可以使用快捷键ctrl c 命令输入错误 也可以通过快捷键ctrl c 退出当前输入 重新输入 2 ctrl d 退出或登出 可以通过快捷键 ctrl d 退出账户的
  • Vue 学习路线

    今天福州突然降温 然后跟一位学弟 我原来实验室带的师弟 问我vue学习路线怎么样 这里简单总结下 因为我也是突然被问到去年做的几款软件内容 从 0版本到现3 x版本 es6语法一定要去认真学习一遍 这是有js基础的 如果没有基础或者基础不牢
  • C语言课程设计猜数字流程图,(C语言课程设计猜数字游戏姚成.doc

    C语言课程设计猜数字游戏姚成 课 程 设 计 报 告 课程名称 C语言程序设计报告 课题名称 猜数字游戏 专 业 电气工程及其自动化 班 级 1104 学 号 23 姓 名 姚成 指导教师 黄晓宇 丁敬忠 谭小兰 2012年 6月 24 日
  • MIPI入门——D-PHY介绍(二)

    前面的文章中提到了 MIPI D PHY协议中规定了两种模式 LP模式和HS模式 其中HS模式只在高速数据传输中使用 而LP模式则同时包含控制模式 Control Mode 低功耗数据传输模式 LPDT 和极低功耗模式 ULPS 为了方便描
  • 使用python的aligo库实现阿里云盘多端同步

    借助aligo库 写了两个函数 第一个本地文件上传同步 并删除云端不同的文件 第二个下载同步函数 将云端文件下载 并删除 云端没有的文件 这里面的逻辑是 每台机器在工作前都需要执行一遍下载同步 保证本地最新文件和网盘内容相同 工作结束以后
  • 字符串(kmp匹配 ;马拉车回文串;多串字典树)

    目录 1 KMP 自匹配 且只与开头比较 2 kmp 两个字符串匹配 来找出最长公共字符串 3 马拉车算法 给定一个字符串 尽可能的少添加字符使其整体构成一个回文串 有多少个回文子串 输出以其为开头的最长即可 4 多个字符串匹配 字典树 1
  • Vue项目打包部署总结配合nginx部署

    你可能还想了解 https blog csdn net weixin 52901235 article details 129437990 spm 1001 2014 3001 5502 使用Vue做前后端分离项目时 通常前端是单独部署 用
  • NAT穿透解决方案介绍

    最近公司要实现在各种网络环境下面的多屏互动 机顶盒 android phone iphone及PC端 的需求 由于IP地址资源有限的原因 目前我们使用的各种终端设备都位于局域网后面也就是多台设备共享同一个公网IP 例如 如果位于局域网里面的