NAT 那些事儿

这篇文章并不是会讲解太多很高深的 NAT 知识,因为想要知道那些知识大可以直接去阅读 《TCP/IP 协议详解:卷一》。相对的,我只是在这里记录一些自己在了解到 NAT 这种技术后的一些思考。


Q1: 我们为什么需要 NAT 这项技术?

为了缓解 IPv4 地址将要枯竭的问题。


Q2: NAT 的工作原理,以及它所带来的的效果?

NAT 实现了 IP 地址从局域网络中的私有地址到公网的 IP 的映射。
依据 NAT 机制,我们可以在不需要全球唯一的公网 IP 的情况下,直接使用私有网络中的私有 IP 地址,通过 NAT 路由的转发来实现对互联网上的资源和服务发起访问。


对于 NAT 机制的实现:

  1. User Host 的网关路由在转发数据包(数据帧)时,记录下包中所包含的:“源地址” - “目的地址”借此形成 “源” 到 “目的”的映射关系
  2. 拆解数据包,将 IP 数据报报头中所记录的源地址修改为,当前路由器的网关地址。
  3. 封装数据包,效验检查数据包是否正确
  4. 转发数据包

A1

以常见的 HTTP 协议为例:
当我打开浏览器进入 Bilibili 网站的过程中,

  1. 我的主机会通过检索 local host 或者 DNS Server 请求查询 Bilibili 望着那的 IP 地址,最终得到目的地址为 “119.3.231.166” (PS:IP 我修改过)
  2. 浏览器生成访问请求数据包通过网卡发送出去
  3. NAT 路由转发后,再进过 N 个路由转发到 Bilibili Server
  4. Server 传回一个数据包,经过 N 个路由转发后到达我主机所在网段的网关路由 —— NAT 路由
  5. NAT 在收到包后:
    • 拆包 - 获取其中的 "源地址” 与 “目的地之”
    • 比对自己所记录的映射表中,存在的映射关系
    • 找到一条 “出 - 192.1.1.33 - 119.3.231.166” 的记录,其中的目的地址符合这次收到的数据包中的 “源地址”
    • NAT 便重写了数据包中的目标 IP 地址 —— 更改为表中的 ”192.1.1.33“
    • 数据包效验通过后,将数据包转发入内部网络(局域网),交由底层交换机或三层交换机进行再转发
  6. 我的主机收到数据包,交给浏览器进行解析。

实现原理中重点在于 User Host 所在的局域网的网关路由要能够在转发数据包时,记录下 ”源“ 与 “目的”的映射关系!


(世纪性的问题 😂)
Q3: NAT 机制能做到不出错的映射 Host 吗?

在 Q2 中我们已经简单的介绍了 NAT 的工作原理,这里我们开始试着着手解决这个问题。

首先,必须要清楚的认识到 NAT 转发机制的本质:
“就是 Host 到 NAT 路由的映射”。

NAT -> IP 映射;
NAPT -> IP + Port 映射

其次就是,Host 到 NAT 路由的映射一旦建立完成,NAT 路由其实就已经相当于我们的 Host 了(只是数据包转发与接收上的)。

那么,NAT 路由是怎么跟公网服务器发送数据的呢?
当然是,利用从 NAT 路由的逻辑端口和物理端口(网卡)发出。

再接着,我们来看下,区分不同的 TCP 连接是通过四元组来完成的,即:
源地址 + 源端口 —— 目的地址 + 目的端口。


(PS:下面为了数据易于计算,将会把部分 全部 数据转化为简单的大小)
现在我们试着将 NAT 路由的映射和 TCP 联系起来:

  1. NAT 路由转发后的数据包,其 “源地址” 都是 NAT 路由网关 IP 地址。
  2. NAT 路由也是小型计算机内有操作系统,那么,其最多支持的端口号肯定不会超过 2^32 个,除去 0 ~ 1023 个已经被声明专用的,剩余的都可以用于端口转发数据包。大概的估算,也就是 6000 (6 w)个端口
  3. 默认当前的 NAT 路由只有绑定了一个公网 IP
  4. 这里我先假设 NAT 路由记录映射的关系是针对单个端口进行的记录。(虽然确实就是这样的😁)
  5. 根据 TCP 四元组论,假如 NAT 路由所建立其的 60000 个 TCP 连接都是对同一 IP::Port 的连接,则此时 NAT 无法在继续创建这样的连接

现在我们来看下,NAT 路由如何向公网的一服务器的固定端口建立起 6000 个 TCP 连接:
场景:家里蹲大学 1W 名学生集体从校内网络访问公网一网课网站。
学生 Host 启动浏览器,浏览器随机绑定到本机一个端口号(1024 ~ 65535),向 网课IP::网课Port 发起连接。

这里我们人为的操纵下概率:
访问这个网课网站的前 60000 名同学都非常的幸运的通过了 NAT 路由的映射。
如果后面继续有人想要访问这个网站,
幸运的路人甲熟练的打开笔记本、打开浏览器、帅气的输入网址,回车。

Ta 浏览器绑定到 9527 端口。
数据包发送,到达 NAT 路由,此时 NAT 路由所有端口都被占用。
结果,NAT 路由检索到这个包是 9527 端口,所以找到专门 9527 端口映射关系记录表,添加进入这对新的映射关系。
然后,转发。

这里再假设,目标 Server 也很好的没有发现什么异常,很自然的发了一个包回来。到达了 NAT 路由处:
好家伙儿,NAT 路由直接懵逼。。。
9527 端口上的记录 IP 映射关系表中有两组关系都符合,那这数据包我要转给谁????

OK,NAT 路由直接崩溃,除非有错误处理程序。

到这里 Q3 问题,我们就可以回答了:
在 NAT 路由只绑定了 1 个公网 IP 地址的情况下,如果此局域网络下的用户,当他们因为某些人类迷惑行为同时访问到同一 IP 的网站的 同一 port 时,
当 0 < user < 6w,数据包冲突概率从 0% 不断上升到 100%;
当 user >= 6w 时,100% 会出现 NAT 失败的情况。

回看 NAPT,它比 NAT 具有更强的映射能力,
因为 NAPT 的映射关系,不仅仅包含 IP ,还包含 了 Port !

简单点分析:
如果 NAPT 采用每个 IP 为其分配一个端口的模式工作,
那 NAPT 路由就算是在:

  1. 只绑定了一个公网 IP
  2. 局域网中的用户同时访问同一 IP 同一 Port 的情况下

只有当用户满 6w 才会发生数据包转发冲突的问题。
(未完待续 😛 )

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值