NAT技术和NAT穿透的应用

基于上篇文章,遇到不同网段互相访问的一些问题的总结我理解了要想在真实网络环境中,实现跨局域网的ndn通信(非同一内网下;例如联通和移动下的网络设备进行ndn通信),必须考虑NAT技术。那么现有的如QQ这样的通信方式,有用到NAT穿透吗,它是如何跨局域网通信的呢?NAT穿透究竟用在了哪些领域?我认为我还需要粗略了解NAT技术的特点;NAT穿透的应用;QQ的通信模式。总结如下:

1.NAT的特点

1.网络被分为公网、私网两部分,NAT网关设置私网到公网的路由出口。
2.通信只能由私网侧发起,公网无法主动访问私网主机(但是可以通过打洞)。
3.NAT网关在两个访问方向上完成两次地址的转换,出口替换源地址,入口替换目的地址。
4.NAT网关的存在对通信双方保持透明。
5.NAT网关为了实现双向翻译,需要维持一张关联表,将会话信息保存。

2.NAT的副作用

1.NAT表的淘汰:当NAT表对应的记录在一段时间内没有通信时,网络运营商就会将其淘汰掉,若此时外网还通过原来记录的外网IP地址和内网设备进行通讯则会不通。
2.NAT墙:当外界对内网的请求到达NAT设备时,若不符合NAT设备和NAT表的要求,则会被丢弃,这样若想实现ip地址不固定客户端间通讯则需要额外的打洞操作。

3.NAT穿透的应用

1.实现外网对内网的访问。
2.通过UDP打洞技术实现p2p通信。
参考:NAT穿透技术原理及应用

4.NAT类型

1.基本的NAT
基本的NAT
其核心是替换IP地址而不是端口。这种NAT设备很少见了。

2.NAPT(是我们平时说的NAT)
在这里插入图片描述
NAPT的特点是在网关时,会使用网关的 IP,但端口会选择一个和临时会话对应的临时端口。
网关上建立保持了一个1.2.3.4:62000的会话,用于192.168.0.8:4000与6.7.8.9:8000之间的通讯。
对于NAPT,又分了两个大的类型,差别在于,当两个内网用户同时与8000端口通信的处理方式不同:
(1)Symmetric NAT型(对称型)
在这里插入图片描述
这种形式会让很多p2p软件失灵。(不适用于p2p通信)
(2)Cone NAT型(圆锥型)
在这里插入图片描述

5.NAT穿透过程

在这里插入图片描述
1.客户机A1、B1顺利通过格子网关访问服务器C ,均没有问题。
2.服务器C保存了 A1、B1各自在其网关的信息(1.2.3.4:62000、1.2.3.5:31000)没有问题。并可将该信息告知A1、B2。
3.此时A1发送给B1网关的1.2.3.5:31000是否会被B1收到?
答案是基本上不行(除非Y1设置为完全圆锥型,但这种设置非常少),因为Y1上检测到其存活的会话中没有一个的目的IP或端口于1.2.3.4:62000有关而将数据包全部丢弃。(Y1只能收有B1子网发出的消息所返回的信息,可以根据发出的映射,原路将信息返回,若X1访问到Y1,则找不到映射。)
4.此时要实现A1、B1通过X1、Y1来互访,需要服务器C告诉它们各自在自己的网关上建立“UDP隧道”,即命令A1发送一个 192.168.0.8:4000——1.2.3.5:31000的数据报,B1发送一个192.168.1.8:4000——1.2.3.4:62000的数据报,UDP形式,这样X1、Y1上均存在了IP端口相同的两个不同会话(很显然,这要求网关为Cone NAT型,否则,对称型Symmetric NAT设置网关将导致对不同会话开启了不同端口,而该端口无法为服务器和对方所知,也就没有意义)。

参考:NAT原理及NAT穿透

6.QQ的通信原理

QQ是一个基于TCP/UDP协议的通讯软件
发送消息的时候是UDP打洞,登陆时使用HTTP,登录的服务器就是一个腾讯自行开发的HTTP服务器。

1.登录
QQ客户端在局域网内,当你打开QQ登录到QQ服务器时,通过外网,你的客户端与QQ服务器建立了一个长连接。不管UDP还是TCP,最终登陆成功之后,QQ都会有一个TCP连接来保持在线状态。这个TCP连接的远程端口一般是80,采用UDP方式登陆的时候,端口是8000。

2.聊天消息通信
采用UDP协议,通过服务器中转方式。因为用户一般都是在局域网内,地址都为私有IP,腾讯服务器是如何将信息转发到用户的?
基本的NAT实现的功能很简单,在子网内使用一个保留的IP子网段,这些IP对外是不可见的。如果这些节点需要访问外部网络,那么基本NAT就负责将这个节点的子网内IP转化为一个全球唯一的IP然后发送出去。
另一种NAT叫做NAPT,不但会改变NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。我们一般用到的设备都是NAPT。
根据一些知识储备,我们知道通过NAT,子网内的计算机向外连接是很容易的,但如果外网计算机想访问子网内的计算机就比较困难了。(这是p2p所需要的)。

那么我们如果想从外部发送一个数据报给内网的计算机有什么办法呢?

首先,我们必须在内网的NAT上打上一个“洞”(也就是前面我们说的在NAT上建立一个Session),这个洞不能由外部来打,只能由内网内的主机来打。而且这个洞是有方向的,比如从内部某台主机(比如:192.168.0.10)向外部的某个IP(比如:219.237.60.1)发送一个UDP包,那么就在这个内网的NAT设备上打了一个方向为219.237.60.1的“洞”,(这就是称为UDP HolePunching的技术)以后219.237.60.1就可以通过这个洞与内网的192.168.0.10联系了。(但是其他的IP不能利用这个洞)。

有了上述理论,实现两个内网的主机通讯(p2p)就差最后一步了:两边都无法主动发出连接请求,谁也不知道谁的公网地址,那我们如何来打这个洞呢?我们需要一个中间人来联系这两个内网主机。
在这里插入图片描述
首先,Client A登录服务器,NAT A为这次的Session分配了一个端口60000,那么ServerS收到的Client A的地址是202.187.45.3:60000,这就是Client A的外网地址了。同样,ClientB登录Server S,NAT B给此次Session分配的端口是40000,那么ServerS收到的B的地址是187.34.1.56:40000。

此时,Client A与Client B都可以与ServerS通信了。如果Client A此时想直接发送信息给Client B,那么他可以从ServerS那儿获得B的公网地址187.34.1.56:40000,是不是Client A向这个地址发送信息ClientB就能收到了呢?

答案是不行,因为如果这样发送信息,NATB会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。那该怎么办呢?

首先我们假设Server S是219.237.60.1:7000,当Clinet A(202.187.45.3:60000)向Server S(219.237.60.1:7000)发送数据包,Server S是可以正常接收到数据,因为它是属于外型开放的服务器端口。当Server S收到数据包后可以获知Clinet A(202.187.45.3:60000)对外通信的临时session信息(这个叫临时的端口,假设是60000会过期,具体时间不同,一般是每30S发送一个keep住连接以保证端口维持通信连接不断)Server S此时应将次信息保存起来。

而同时,Client B(192.168.0.10:40000)也在时刻向Server S发送心跳包,Server S就向Client B (192.168.0.10:40000)发送一个通知,让Client B (192.168.0.10:4000) 发送探测包(这个数据包最好发几个),Client B (192.168.0.10:4000)在收到通知后在向Server S发送反馈包,说明自己已向Client A (192.168.0.20:60000)发送了探测包,Server S在收到反馈之后再向Client A (192.168.0.20:60000)转发反馈包,Client A (192.168.0.20:60000)在收到数据包之后在向原本要求请求的Client B (192.168.0.10:4000)发送数据包,此时连接已经打通,实现穿透。Client B (192.168.0.10:4000)会将数据包转发给Client A (192.168.0.20:60000)从而在转发给内网内网IP:192.168.0.1。

参考:QQ通信原理及QQ是怎么穿透的

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值