P2P穿透NAT的原理

P2P穿透NAT的原理,第1张

NAT 俗称网络地址转换,基本 NAT 都部署在路由器或者交换机上。

主要还是IP地址的不足,使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用的IP地址空间的枯竭。用大白话:比如你有一个路由器(家用的那种就可以)这个路由器本身链接了公网(被分配到了一个公网的IP地址)。路由器后面有接了N多个设备,每个设备都分配到了一个私有的地址(内网地址),这些地址可以通过这个路由器和外网交互(并非是代理的中继方式)。

1 基本NAT: 这种NAT下的私有IP只有少部分(并不是全部)可以和外网通讯。每次这些私有地址向外网发送数据的时候,NAT就会把这个数据报的 源地址IP 修改成NAT的 公网地址 (这样接收方以为这个数据报是从NAT发给我的,我后面数据报在会给这个NAT就好了),并在NAT内存下对应的 映射关系 (端口和内网私有IP的映射)。当NAT收外网的数据报的时候,根据数据报的端口号找到内网的私有IP地址,将这个数据报的目的IP地址修改成内网私有IP地址(整个过程NAT负责了IP地址来回替换,辅助完成了内网机器和外网设备通讯,这里的外网设备有可能也是一个NAT)。如果收到的数据报在映射表中找不到对应映射,这个数据报就会被丢弃。

存在问题: 基本的NAT由于不会改动端口信息,当内部2个不同机器(2个不同的私有IP)使用同样的端口会出现映射错误了。

2 NPAT: 这类的NAT是在基本NAT基础上演化而来,它不仅修改 IP地址 还有 端口号 。基本可以满足NAT内全部的网络访问要求。NAT内的私有IP地址第一次向外网发送数据,NAT会选一个 映射表 里面还没有被使用过的 端口号 ,然后修改 发送数据报 的 源IP地址 和 源端口号 并发送出去,并把 私有IP地址 和 源端口号 ,和修改后的 端口号 映射关系记录下来。之后这个私有IP地址发送数据会首先判别之前是不是已经有这个映射关系,如果有就继续按照映射关系修改数据报。当NAT收到外部的数据,会从映射表找到对应关系。修改数据报的 目的IP地址 和 目的端口号 ,如果映射表中没有记录这个数据报就会被丢弃了。

解决了基础NAT的端口问题: 通过修改端口的可以让NAT内的多个私有IP地址可以使用相同的端口进行通信。因为NPAT更加灵活所以现在基本的NAT技术就是指的NPAT技术。

如果2台机器在同一个NAT下,那么他们可以直接通信了。

情况 1: 如果2台机器有一台在NAT下另一个在外网,那么只能NAT内的私有机器主动链接外网机器,因为外网的机器主动链接内网的机器,NAT映射表并不存在这个数据转发项,这个数据报就被丢弃了。

情况 2: 如果2台机器都在不同的NAT下,那么不管哪一方发起链接请求数据报都不会到达对应的机器。这种情况非常常见。

那么最简单的方式解决上面2个问题:就是在公网部署一台 中继服务器 ,双方机器都链接这台服务器。然后 中继服务器 帮助这2台服务器转发数据。这种方式最简单也是效率最低的。

到这里P2P正式登场了: 比如有下面这样的网络拓扑结构(就是上面情况2)

如果 NAT-A, IP:40325125 和 NAT-B, IP:2341238 需要直接通信的话,基本不可能,所以需要做些手段。

假设需要 手机 (图中)建立TCP链接到 电脑 (图中)需要如下手续:

1 由被链接方发送数据报(可以是UDP甚至是TCP的SYNC握手包)

[上传失败(image-4b61ae-1528199423593)]
绿色线表示了数据报流动的方向

图中 电脑 给 NAT-A IP:40325125 / 端口:4553 发出了一个数据报,这个数据报在经过 NAT-B 的时候 源IP地址 被修改成了 NAT-B的IP地址2341238 , 源端口 被修改成了 678 。这个数据报在到达 NAT-A 的时候,在映射表中找不到 678 端口对应的内部私有IP的映射。所以这个数据报一定会被 NAT-A 丢弃掉。但是经过这次数据报发送,在 NAT-B 的映射表里面就会标记 40325125:4553 我已经发送过数据过去了,那么后面只要从这个地址发送来的数据报,我就可以转发到内网正确的设备上面。

2 完成第一步后,链接方可以发起数据请求

p2p可以合理的利用互联网的资源,比如两个人视频聊天。完全可以通过p2p打穿NAT后互发数据(QQ就是这么办的)。但是有的时候设备之间的直连性能很差,比如:电信的用户和移动的用户视频。这个问题是ISP厂商之间的过渡带宽太窄,就算是设备直连但是依旧速度不快。所以这里情况下需要自己搭建服务器中继(中继也不是完全无作用)。这个服务器就是网关的作用,一般有多个网卡。不同的网卡对接不同的ISP厂商,然后互相转发。

邮件中继指在不改变用户邮件地址(发件人)的前提下,将用户邮件先到达多链路SMTP邮件转发服务器,再经转发服务器安全投递到收件人目标邮件服务器的过程。

而邮件退信的问题可以通常有:

1邮件账号经常被利用发送垃圾邮件,导致邮件服务器IP地址反复被列入RBL;

2国际网络出口不稳定,海外TCP连接失败概率高;

3邮件服务器设置和域名解析记录设置未按RFC国际标准。

邮件中继外发服务是可以解决因邮件服务器IP被列入RBL黑名单等原因导致外发邮件退信问题的,除了解决邮件退信问题,如靠谱邮件中继服务通过DNS智能解析技术,选择快速的中继通道进行邮件投递和接收,还能起到加速海外邮件收发速度,解决邮件延迟等问题。

希望我的回答可以帮助您,如有疑问,可追问。

项目中需要做远程控制,可以传输指令和音频,领导说用前端做,整合到h5中,于是研究了一下webRTC,基本能解决需求就把项目简化写了一个demo分享出来

核心就是两端通过内网nat穿透建立p2p连接,这里我将peerB作为主控端,初始化时,连接本机获取本地icecandidate,这里icecandidate可以理解为内网nat对外网的映射,可以直接在公网访问的地址,可以是一个公网域名,也可以是服务器ip+端口,获取之后,通过>靠谱邮件问题全放位解决方案,解决全球很简单,当你的邮件发送不出去,不管是国内的还是国外的。绞尽脑汁,使劲办法都还是不行。什么IP黑名单,GFW,国际带宽不稳定。等等原因。用了IP反向解析,多个IP,换服务商,换邮件系统。但是还是不行。这时我们会考虑中继转发。
顾名思义,利用别人中转,致使邮件成功发送出去。靠谱邮件中继转发即可完成。只要使用靠谱,那就相当于,你有了很多道路到罗马。只要保证自己的邮件服务器在公网上且运行正常,就OK。
中继转发就是通过别人的邮件服务器(中继服务器)将你的邮件系统的邮件递送到目标地址。
为什么要使用中继转发?
一般架设邮件系统并不需要使用中继转发, 在出现以下几种情况时可能需要使用中继转发:
1 有些邮件服务器(例如: sina, aol)拒绝接受使用动态IP的邮件服务器的来信,还有一些国外的邮件服务器使用 rbl 过滤,过滤掉很多国内的地址,可以使用中继转发,将邮件通过没有被过滤得中继服务器成功递送出去。
2 你的邮件服务器连接到国外的网络速度很慢,有时连不上的,可以选一台国外的中继服务器(推荐使用美国的,因为中国到美国的网速比较快)。
3 你的邮件服务器软件本身连接到 Internet 的速度比较慢,而连接到某一台 SMTP 服务器速度相对比较快。如普通拨号上网的用户,可以将中继服务器的地址设为当地的电信的 SMTP 主机。这样会加快递送速度,减少递送过程中的出错。
4 你的域名不是internet上有效的,仅在内部使用,而又需要发信到外域,可以使用中继服务器将邮件递送到外域。当然外域的用户收到你的邮件后无法直接回复给你。
联系靠谱邮件中继解决方案技术总监 朱浩


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/12663835.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存