Introduction to Computer Networking学习笔记(二十五):NATs

原贴地址:https://blog.csdn.net/djl806943371/article/details/89577965

Yahoo!终于看完了第四单元拥塞控制,现在开始第五单元Applications and NATs。首先第一节从NATs开始。

NATs全称 Network Address Translator,即网络地址转换器。NATs拥有一个公网地址,并允许有许多私有局域网络地址在NATs后面,不同的NAT后面可能有相同的私有IP地址。而NATs有两端,一侧面向公网,一侧面向局域网,NATs就负责在公网与局域网之间传递信息。

NATs具体是如何实现的有多种方式,下面进行介绍,下面所列前三种为非对称NAT,即只要是同一个client的IP及port,数据都通过NAT的同一个端口发出,而第四种为对称型NAT,同一个client的IP及port跟不同的server连接时都分配不同的port:

1. full cone NAT:如下图所示,它在建立映射关系时仅仅建立A的ip:port与NAT的IP:port的映射,因此当NAT接收到所有目的IP:port为128.34.22.8:6641的数据包时全部转发给A。也就是说,本来服务器S端口号80发出来的数据是A想要的,但是S其他端口发送的数据如果目标ip及端口匹配NAT也会被转发给A,并且除S以外的其他服务器发送的数据包也可以被转发给A,当A接收到错误的服务器或者正确的服务器错误端口号发来的数据的时候,会发送ICMP error或者其他方式通告并丢弃这个数据包。之所以叫 full cone 就是因为NAT可以转发任意服务器或端口发来的数据包,只要目标IP和port匹配。

2.restricted cone NAT:如下图所示,当NAT建立映射关系时,同时将目标服务器的IP地址包含进来,即只有目标服务器发送来的数据包才有可能被转发。而这种情况下,不对端口号加以限制,也就是说只要是服务器S发来的数据,不管是哪个端口发出的数据,只要目的IP即port能与NAT映射中对应,则会转发给A。A收到数据,发现端口号不对时则会丢弃数据,发送ICMP error。显而易见,为什么叫 restricted cone 是因为还是一对多,但是与 full cone 相比已经不会转发其他服务器的数据包。

3.port restricted cone NAT:如下图所示,即建立映射关系时将目标IP及port都包含进来,这种情况下NAT只会转发目标服务器目标端口号发送来的数据也就是A所需要的数据,这种情况下,如果NAT接收到其他服务器或者其他端口号发送来的数据包,则会由NAT发送ICMP error。

4. symmetric NAT:如下图所示,同一个IP:port发送到不同server,将被NAT分配不同的端口。这样有个坏处就是比如同一款游戏有多个服务器,当玩家切换一个服务器时,端口号发生了变化,但是游戏系统并不知道这个新的端口对应的还是原先的玩家A。

缺点:

其实NAT带来了很多要进行特殊处理的边界情况。比如下面这个例子:当一个NAT后面有两个host A跟B。NAT在10.0.0.101:4512与NAT端口 128.34.22.8:6641之间建立了映射关系。在这种情况下,如果B发送数据包到128.34.22.8:6641会发生什么呢。我们假设NAT采用full cone,并进行常规处理,即只改写收到的数据包中的DA就发送给A,则A收到SA:10.0.0.99:X,DA:10.0.0.101:4512,在这种情况下,A回复时的DA为10.0.0.99:X,此时根据子网掩码发现是同一个局域网内的host,将直接通过交换机将数据发送到B,而不是发送给NAT,此时B收到包会发现收到的数据包的SA与自己发送包时的DA不一致,因此这个包会被丢弃。可以看到靠常规处理方式是没办法处理的。只能进行特殊处理。即B发送数据包到NAT,NAT不仅要对DA进行改变还要修改SA为128.34.22.8:X'。这样A会将数据包发回给NAT,NAT再修改SA,DA发送给B。而这一个特殊情况只是NAT带来的众多特殊情况中的一种。对于这些特殊情况的处理,RFC中进行了规定。

NATs的影响:

1. incoming connections:分为以下几种情况:

  a. 一个host处于NAT后,一个有公网IP:可以通过一个中转站R,两者都与中转站建立连接,当B想与A直接建立连接时,B先通过R告知A自己的公网IP,A则可以申请与B建立连接。也就是所谓的反向连接

 b. 两个host分别处于一个NAT后:也通过一个中转站R,当A与B之间想建立直接联系,只有cone NAT可以实现。即B通过R告知A自己NAT外侧的公网IP及端口号,A亦通过R告知B,A主动与B的NAT的公网IP及端口建立连接,B主动与A的NAT的公网IP及端口建立连接,如此可以实现直接连接。但是如果是对称型NAT,则无法建立直接连接。因为当A尝试与B的NAT建立连接时,A的NAT会重新分配端口号,B亦如此,无法在两个端口之间建立连接。这也是为什么现在网络上很少使用对称型NAT

2. No New Transport:

我们可以发现,NAT的出现是违背了分层原则的,因为NAT需要修改IP地址甚至是端口号,也就是传输层与网络层的首部,这导致没法完全解耦,也就是说如果想用NAT,NAT必须知道他在转发的是什么包,以根据包的种类去对应位置进行修改。因此当你自己重写一个传输协议的时候,NAT根本不知道你的协议结构也不知道如何修改。因此除非你的协议流传十分广泛,NAT做出适配,但是NAT不适配,这个协议又不可能流传广泛,这就成了先有鸡还是先有蛋的问题。因此应用基本只能使用TCP、UDP、ICMP作为传输层协议。现在往往通过对UDP进行修改实现新的协议,因为UDP几乎只提供了一个数据容器,可以自己在里面实现更多功能。

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值