在P2P实时音视频领域,NAT穿越是一个非常重要的技术。NAT穿越技术使得客户端和客户端直接进行通讯,从而减少了端到端的延迟,并大大减轻了服务器的压力,降低成本。

NAT是什么

NAT的全称Network Address Translation,通常指的是把内网地址转换成外网地址。一般家用的无线路由器就用到了NAT技术。NAT技术的出现是为了解决IPv4地址不够的问题,而且还能够避免来自网络外部的攻击,隐藏和保护网络内部的计算机。凡事有利必有弊,NAT同样带来了新的问题。

NAT工作原理

我们先看一下NAT的工作过程

  • NAT维护一个地址映射表,记录内容为内网主机地址iAddr、映射地址eAddr和外网主机地址hAddr,表初始为空
  • 内网主机主机A发送数据包给服务器A,10.0.1.10:1111 -> 203.22.22.22:6000;
  • NAT在映射表里没找到源地址等于10.0.1.10:1111的记录,于是新建一条记录1,分配外网端口2000
  • NAT修改数据包的源地址再发到外网,202.11.11.11:2000 -> 203.22.22.22:6000;
  • 后续所有源地址为10.0.1.10:1111,目标地址为203.22.22.22:6000都做同样的修改
  • 服务器A发送数据包回给内网主机A,203.22.22.22:6000 -> 202.11.11.11:2000
  • NAT发现外网地址202.11.11.11:2000映射的内网地址为10.0.1.10:1111
  • NAT修改数据包的目的地址再发到内网,203.22.22.22:6000 -> 10.0.1.10:1111
  • 内网主机B和服务器B通讯的过程也类似A,只是分配的外网端口是3000

从上面NAT的工作过程可以看出,NAT通过修改数据包的源地址或目的地址来实现地址映射的。NAT修改数据包对内网主机是透明的,不需要内网主机做任何配置,方便简单。
NAT工作原理可以总结为:

  1. 只有内网主机主动向外网发送数据,外网才有可能发送数据给内网主机
  2. 内网发送到外网的数据包会被修改源地址,外网发送给内网的数据包会被修改目的地址

很显然,第1条原理保护了内网主机免受外网的攻击,但却违背了网络端到端的设计原则。如果两台主机在不同的NAT后面,是没有办法穿越NAT直接端到端(P2P))通讯的。幸运的是,在大部分情况下,我们可以在服务器的协助下实现NAT穿越。

NAT类型

在讲NAT穿越之前,我们先来分析NAT的类型。由于没有强制性的NAT标准,在实际应用中NAT有多种类型。根据内网地址到外网地址的映射是1对1,还是1对多,NAT可以分成两大类:Cone NAT(锥型)和 Symmetric NAT(对称型)

从图中的淡紫色形状应该可以看出来它们名字的来历(呕心沥血独家原创图)。锥型NAT把一个内网地址固定的转换成一个外网地址,即1对1映射;对称型NAT的一个内网地址可以转换成多个外网地址,即1对多映射。从锥型NAT和对称型NAT的定义我们可以推测出他们的映射表内容。
锥型映射表应该是这样的:
对称型映射表应该是这样的:

Cone NAT子类型

锥型NAT还可以再继续细分类型。外网主机发送给内网主机的数据包在通过NAT时,NAT会根据映射表的外网主机地址限制条件来允许或限制数据包通过。根据这个限制条件,锥型NAT还可以分成三种子类型:

Full-cone NAT,全锥型
一旦某内网地址向外网发送过数据包,NAT允许任意外网地址发送数据给此内网地址。


(Address)-restricted-cone NAT,(地址)限制锥型
一旦某内网地址向某外网主机发送过数据包,NAT允许此外网主机发送数据给此内网地址。换句话说,只限制ip,不限制端口。
Port-restricted cone NAT,端口限制锥型
只有从内网地址发送过的外网地址,NAT才允许此外网地址发送数据给此内网地址。换句话说,同时限制ip和端口。

穿越NAT

通过上面对NAT的分析可以看出,在不同NAT后面的两个客户端A和B,如果知道对方的NAT映射后的外网地址,就有可能直接发送UDP包给对方外网地址进行通讯。但是这里有一个问题,客户端不能直接获取自身的NAT外网地址,解决的办法就是引入一个服务器S来协助客户端获取自身的外网地址。NAT的类型有多种,类型两两组合有很多种,不是每种组合都可以被穿越的,我们来分析两个典型的组合。

锥型 vs 锥型

  1. A发送数据包给S询问自身地址,S把A的外网地址eA返回给A
  2. B发送数据包给S询问自身地址,S把B的外网地址eB返回给B
  3. S把B的外网地址eB发送给A
  4. S把A的外网地址eA发送给B
  5. A发送数据包给eB,B发送数据包给eA,建立P2P通道

端口限制锥型 vs 对称型

  1. A发送数据包给S询问自身地址,S把A的外网地址eA返回给A
  2. B发送数据包给S询问自身地址,S把B的外网地址eB1返回给B
  3. S把B的外网地址eB1发送给A
  4. S把A的外网地址eA发送给B
  5. A发送数据包给eB1,因为eB1只接受来自S的数据,所以A的数据被NATB丢弃
  6. B通过发送数据包给eA,因为eA是新的目标地址,NATB 创建新的映射地址eB2,而eA只接受来自S和eB1的数据,所以B的数据被NATA丢弃,无法建立P2P通道

这里就不一一分析其他组合,各位看官可以自行分析,这里直接给出结论:

现实中的NAT

在穿越NAT的结论里,只有两种组合不能穿越,即对称型vs对称型、端口限制锥型vs对称型,占比并不高,看起来结论还不错。但是,理论是美好的,现实是残酷的,生活中对称型NAT的数量并不少。只要是大型组织的网络,一般都采用对称型NAT,因为这类NAT安全性最好。我们团队曾经对常用的网络做过调查研究,以下是调研结果:

  • 有公网IP的宽带:比如联通的ADSL,这类宽带会给每个用户分配一个公网IP,所以其NAT类型取决于用户所选用的路由器,大部分家用路由器都是端口限制锥型NAT;
  • 无公网IP的宽带:比如宽带通,这类宽带给用户分配的是局域网IP,连接公网的NAT是运营商的,一般都是对称型NAT;
  • 移动互联网:跟“无公网IP的宽带”类似,分配给手机的是局域网IP,出口基本都是对称型NAT;
  • 大公司路由器:大部分都把路由器配置成对称型NAT;

比较可惜的是移动互联网也是对称型NAT,也就是说,如果通讯双方都走3G或4G的话,是很难直接P2P通讯的。我们的产品可以穿越部分对称型NAT,当碰到无法穿越的NAT时,为用户提供relay服务,保证接通率。

奇葩的NAT

我们现在知道NAT分为1种对称型和3种锥型,那还有没有其他类型的NAT呢?答案是YES。这个NAT各位看官应该并不陌生,它就是大名鼎鼎的netfilter/iptables。大家接触最多的iptables,是运行在ring3层用户态的配置程序,而运行在ring0内核态的netfilter才是真正实现NAT功能的程序。在大部分情况下,netfilter表现出来的是人见人爱的锥型NAT,但是在某种条件刺激下,它就华丽丽地变身成高贵冷漠的对称型NAT!
先上图:


在穿越时,假如右边B发给A的包比左边A发给B的包先到达netfilter,netfilter会用之前的映射地址eB把B的包发出去,这时候netfilter表现出来的是锥型NAT,穿越成功。反过来,假如A发给B的包先到达netfilter,那么B发给A的包就会被netfilter映射成新的地址eB’,这时候netfilter表现出来的是对称型NAT,导致穿越失败。见下图。 netfilter不分内网和外网,它会跟踪内网和外网所有协议的连接(conntrack),包括tcp和udp。当外网的数据先到达netfilter时,netfilter创建一条conntrack,内网的数据后到达netfilter,netfilter发现conntrack1已经占用了端口,就会选择另外一个外网端口作为映射端口。看官如果想了解详细情况,请阅读博大精深的netfilter源码,这里提示一下,看get_unique_tuple函数就可以了。虽然netfilter很奇葩,但我们的产品依然能够轻松的穿越它。

环信即时通讯云技术博客——P2P实时音视频之NAT穿越相关推荐

  1. 环信即时通讯云技术博客——实时网络音视频通讯qos的一种解决方案

    一.前言 随着移动互联网的快速发展以及智能终端性能的逐步提高,智能终端间进行实时音视频通讯成为未来移动互联网 发展的一个重要方向.那么如何保证智能终端之间实时音视频通讯的服务质量成为一个必须加以重视的 ...

  2. 环信即时通讯云获得A轮融资 开启 “高品质更好用”IM时代

    国内首家专注即时通讯云服务的公司--环信即时通讯云今日在发布会上正式宣布完成来自SIG海纳亚洲的500万美元A轮融资. 在此轮融资成功后,环信会在应开发者要求开发更多新功能的同时,着重于保持稳定的系统 ...

  3. 环信即时通讯云iOS版V2.0.9.1服务评测

    集成测试 评测环境 2G/3G/WiFi网络下: 测评环境 MAC OS(10.9.2)+ XCode(5.1) + iPhone 测试对象 环信即时通讯云 IOS SDK Version 2.0.9 ...

  4. 大家有没有发现环信即时通讯云宕机严重,并且所使用的ejabberd违反了开源协议

    写这篇帖子前气的把鼠标摔了个坑,环信的断服问题太坑爹,从上午一直挂到晚上8点多,还没有彻底解决,眼看着开发周期快到了,boss跟周扒皮似的催我,我该咋办啊咋办啊!!! 早先看到环信的广告,说啥&quo ...

  5. 环信即时通讯SDK集成——如何使用Swift快速集成环信IM iOS SDK并实现单聊

    本文介绍如何使用swift快速集成环信即时通讯 IM iOS SDK 实现单聊. 前提条件 • Xcode (推荐最新版本). • 安装 iOS 10.0 或更高版本的 iOS 模拟器或 Apple ...

  6. ThinkPHP框架整合环信即时通讯DEMO

    环信成立于2013年4月,是一家全通讯能力云服务提供商.产品包括全球最大的即时通讯云 PaaS 平台--环信即时通讯云. 最近在工作中遇到要整合环信即时通讯,通过在网上搜索没有搜到特别全的案例,故此自 ...

  7. 【APICloud系列|25】 easeChat模块(环信-即时通讯)的实现

    导读:easeChat 模块封装了环信即时通讯云的开放SDK,封装的接口都是纯功能类接口, 主要分三大类: 1,注册.登录.退出.监听 2,创建群组.添加/删除好友.获取好友列表 3,消息.会话.聊天 ...

  8. 环信即时通讯SDK集成——实战:快速实现iOS应用中集成即时通讯IM和UI

    准备 熟练objective-c语言 有一台mac电脑,并安装了xcode 和 cocoapods 目标 手把手教大家在iOS应用中集成即时通讯IM 功能 内容篇幅较长,需要内心平和耐心看下去,务必戒 ...

  9. android 环信集成,Android Studio下的环信即时通讯简单集成

    环信即时通讯云是全球最大的即时通讯云 PaaS 平台,可以快速实现APP的即时通讯的功能,官方的DEMO是基于Eclipse开发的,对于新版本的Android Studio支持不太好,下面就简单说一下 ...

最新文章

  1. visio 画图工具
  2. RPC简介,及与web service的对比
  3. python学习之- 内置函数
  4. 怎样在vue单页面中引入其他组件
  5. v3s 全志_基于全志V3s的开源开发板,提供pcb和系统源码和资料
  6. 修改文件后git只用两步push文件
  7. Vista Dynamips模拟器安装
  8. LNMP环境SVN钩子脚本的使用
  9. 推荐系统:非个性化推荐Non-personalized recommendation
  10. 【优化求解】基于matlab生物地理算法求解MLP问题【含Matlab源码 1415期】
  11. markdownpad2渲染组件出错——Awesomium sdk组件下载
  12. 《电子商务安全》考试重点/学习重点
  13. 【海康威视】WPF客户端二次开发:【1】监控视频画面预览(SDK初始化、设备登录、监控画面预览)
  14. VRay 2.0 for SketchUp高级室内渲染教程锌
  15. 如果你读不完凯文凯利的《必然》,至少读完这120条书摘
  16. 网站出现403错误怎么办,为什么会出现403错误,要怎么解决
  17. HDOJ 5296 Annoying problem
  18. 酰肼PEG酰肼,HZ-PEG-HZ
  19. 英语单词记忆 词源法-思维导图(19)词源st/sist/stat/stin/stem-236
  20. 您的美团账户,美团互助未经客户同意自动扣费0.01元是什么情况

热门文章

  1. 镇三山在此!”三个 水浒传
  2. 2022KCTF春季赛看雪为什么读书
  3. Linux 下用命令行修改图片大小
  4. 模拟手机号码抽奖活动
  5. 谷粒商城vue模板生成代码
  6. js 树 没用的树,法克
  7. 软件架构-单一职责原则
  8. 日常用语--见面交谈
  9. 金字塔原理-演示的逻辑
  10. 阿尔茨海默病及其先兆分期的神经影像分类研究及相关特征提取