什么是 NAT 协议

我们的计算机要想访问互联网上的信息,就需要一个地址,而且这个地址是大家(其他主机)所认可的,是公共的,这个地址也叫做公有 IP 地址

与之相对的,除了公有 IP 地址外,还有私有 IP 地址,私有 IP 地址就是我们在私有网络中使用的地址,比如局域网或者公司内部的网络。不知道你没有观察过自己家路由器所分配的 IP 地址,当你登上路由器的网关 192.168.1.1 时,在分配的网络下面一般会看到一些 IP 地址,都是 192.168.1.x ,这种地址就是私有 IP 地址。

所以现在就会产生一个问题,比如 cxuan 的私有 IP 地址是 192.168.1.3 ,而隔壁 cuanxi 哥的 IP 地址也是 192.168.1.3 ,那么他俩同时在网上冲浪的时候,不会产生 IP 冲突吗?或者是把 cxuan 浏览的内容告诉给了 cxuanxi 哥?

这种问题远不用担心,因为我们有一个很靠谱的兄弟 --- NAT(Network Address Translator),当我们的计算机连接到 Internet 的同时,NAT 就会把我们的私有地址直接转换成互联网上的公有 IP 地址,那么下面我们就来了解一下这个协议和它的工作机制。

我们现在就可以给 NAT 协议下一个定义,即 NAT 协议是将在本地网络中使用的私有地址,在连接互联网的同时转换成为公共 IP 地址的技术。实际上,转换的不仅仅只有 IP 地址,还有 TCP 、UDP 端口号,不过这种协议叫做 NAPT 协议。通常情况下,我们所说的 NAT 其实指的就是 NAPT。

NAT 的工作机制

下面我们来聊一下 NAT 具体的工作机制,如下图所示。

私有网络中的客户端 A (IP 192.168.1.6)想向公共网络中的服务器(IP 122.122.122.122)发送数据包,当这个数据包经过 NAT 路由器的时候,就会把它的私有 IP 192.168.1.6 转换为公有的 IP 12.34.56.78,然后这个数据包的源地址就变为 12.34.56.78 ,它经由 Internet 发送给 IP 为 122.122.122.122 的目标服务器。

NAT 路由器其实就是相当于在路由器上安装的 NAT 软件,装有 NAT 软件的路由器就叫做 NAT 路由器。

NAT 路由器不仅可以把私有 IP 转换为公有 IP ,还可以把公有 IP 转换为私有 IP ,这种转换是双向的。

拿上图来说,意思就是服务器 122.122.122.122 发送一个数据包,这个数据包通过 Internet 发送给 NAT 路由器,NAT 路由器把它转换为目标地址是 192.168.1.6 的数据包,然后再发送给客户端 A。

这里有个问题,服务器是发送的数据包,是如何把目标地址的公有 IP 地址转换为私有 IP 地址的呢?

我们上面在引用中说到,NAT 路由器其实就是在路由器上装的 NAT 软件,所以 NAT 路由器它本身就是一台路由器设备,而路由器是有路由表的,路由表中记录一些源地址和目标地址项,数据包根据这些项来进行路由转发。

(我们可以使用 netstat -nr 来显示路由表的信息)

所以,NAT 路由器内部有一张用来记录转换地址的表,也就是一件可以解释的事情了,所以 NAT 路由器在进行地址转换时,会按照其内部的映射关系来进行处理。

上面只是一台客户端进行 NAT 转换的情形,但是现实生活中我们私有网络中不可能只有一台客户端进行通信,所以当私有网络中所有的客户端都需要上网,进行 NAT 转换的时候,是不是 NAT 路由器会为每一个客户端生成一个 IP 地址呢?如果全世界范围内的私有网络都这么转换的话,那么公有 IP 地址的数量势必会承受非常大的压力。

针对这种情况,提出了使用 IP 地址和端口号一起转换的方式(NAPT),如下图所示。

这个大致过程和上面 NAT 的转换模式相同,不一样的是,使用 NAPT 会把客户端 A 和客户端 B 的数据包源地址 192.168.1.6:80、192.168.1.7:80 转换为 12.34.56.78:80 和 12.34.56.78:90 ,然后再发送给目标服务器。在转换的过程中,NAT 路由器会生成转换表,通过转换表就可以正确地转换地址和端口的组合,使客户端 A 和客户端 B 与服务器之间进行通信。

转换表是在 NAT 路由器上自动生成的,当 TCP 开始建立连接的时候,就会生成对应的映射,断开连接时,会删除对应的映射。

什么是 NAT - PT

现在互联网情况是一部分 IPv4 的主机和 IPv6 的主机共存的情况,IPv6 作为 IPv4 的替代者,已经越来越多的主机选择升级到了 IPv6 协议,但是罗马不是一日建成的,也不可能全世界范围的计算机都在某几天停机进行升级,这是不现实的,而且很多服务是基于 IPv4 协议建立的,如果升级到 IPv6 不兼容的话,使用 IPv6 的优势也就无从谈起,所以为了解决这个问题,就产生了 NAT-PT 规范。

NAT-PT 是一种将 IPv6 首部转换为 IPv4 首部的一种技术,通过 NAT-PT ,IPv6 的主机能够和 IPv4 主机进行通信,同时某些 IPv4 的服务也能够让 IPv6 的主机使用。

注意这里的 IPv6 只能转换为 IPv4 ,不能反向转换,那么要实现双向通信,该如何做呢?

支持 NAT-PT 的路由器要 DNS-ALG 的支持来实现 IPv4 向 IPv6 的转换。

NAT-PT 机制定义了以下 3 种不同类型的操作:

静态 NAT - PT

静态 NAT - PT 模式主要是一对一映射的。IPv6 网络内的节点要访问的 IPv4 网络内都必须在 NAT-PT 设备中设置。每一个目的 IPv4 地址在 NAT-PT 设备中被映射为一个具有预定义 NAT-PT 前缀的 IPv6 地址。

动态 NAT - PT

动态模式也提供了一对一映射,只不过这种动态模式是有一个 IPv4 地址池的,池中的 IPv4 地址数量决定了并发IPv6 到 IPv4 转换的最大数目。

NAPT - PT

网络地址端口转换--协议转换模式提供多个有 NAT-PT 前缀的 IPv6 地址和一个源 IPv4 地址间的多对一动态映射。

NAT 的潜在问题

聊到现在,我们可以推断出,NAT(NAPT)其实最关键的也是路由器中的转换表,过度依赖转换表会造成下面这些问题

  • NAT 无法从外部向内部服务器建立连接。
  • 生成转换表存在一定的开销。
  • NAT 路由一旦遇到异常情况需要重启,所有的 TCP 连接都会丢失。
  • 即使做了灾备,TCP 连接还是会断开。

那么针对这些问题,该如何解决呢?

第一种是直接升级到 IPv6,因为在 IPv6 的环境中可用的 IP 地址的数量有了极大的扩展,现在看来,怎么造都没事儿。还有一种解决办法是一种叫做 NAT 穿越的技术。

NAT 的应用

NAT 主要可以实现以下几个功能:数据包伪装、负载均衡、端口转发和透明代理

  • 数据伪装:可以将内网数据包中的地址信息更改成统一的对外地址信息,不让内网主机直接暴露在因特网上,保证内网主机的安全。同时,该功能也常用来实现共享上网。例如,内网主机访问外网时,为了隐藏内网拓扑结构,使用全局地址替换私有地址。
  • 负载均衡:目的地址转换 NAT 可以重定向一些服务器的连接到其他随机选定的服务器。
  • 端口转发:当内网主机对外提供服务时,由于使用的是内部私有 IP 地址,外网无法直接访问。因此,需要在网关上进行端口转发,将特定服务的数据包转发给内网主机。
  • 透明代理:例如自己架设的服务器空间不足,需要将某些链接指向存在另外一台服务器的空间;或者某台计算机上没有安装 IIS 服务,但是却想让网友访问该台计算机上的内容,这个时候利用 IIS 的 Web 站点重定向即可轻松的帮助我们搞定。

使用 NAT 的意义

NAT(NAPT)实际上是为了解决 IPv4 枯竭而开发的技术,不过,现在随着 IPv6 的开发,在 IPv6 中为了提高网络安全也在使用 NAT,在 IPv4 和 IPv6 的通信中经常使用 NAT-PT。然而在安全机制上 IPv4 也潜在着威胁,在配置和管理上也是一个挑战。如果要从根本上解决 IP 地址资源的问题,IPv6 才是最根本之路。

原文链接:NAT 协议???

如果对你有帮助,还希望读者朋友能够一键三连!

另外,我自己汇总了一本网络的 PDF ,现在分享给你

图文并茂详解 NAT 协议!的更多相关文章

  1. VMware虚拟网络连接模式详解(NAT,Bridged,Host-only)

    序言 如果你使用VMware安装虚拟机,那么你必定会选择网络连接,那么vmware提供主要的3种网络连接方式,我们该如何抉择呢?他们有什么不同呢?这篇我们就做一个深入. 首先打开虚拟机设置里面的网络适 ...

  2. http协议报头详解HTTP协议结构

    http协议 请求报文和响应报文都是由以下4部分组成 1.请求行 2.请求头 3.空行 4.消息主体 下图为http请求的报文结构 下图为http响应报文结构 请求行 格式为: Method Requ ...

  3. 虚拟机网络配置详解(NAT、桥接、Hostonly)

    VirtualBox中有四种网络连接方式: NAT Bridged Adapter Internal Host-only Adapter VMWare中有三种,其实它跟VMWare的网络连接方式都是一 ...

  4. iOS 详解NSObject协议

      协议就是一组接口的集合,遵守一个协议之后就拥有的该协议中所有方法的声明.NSObject这个类遵守了NSObject协议,并且实现了NSObject协议里的所有方法,所以NSObject类及其子类 ...

  5. 一:详解 HTTP 协议

    本篇文章篇幅比较长,先来个思维导图预览一下. 一张图带你看完本篇文章 一.概述 1.计算机网络体系结构分层 计算机网络体系结构分层 2.TCP/IP 通信传输流 利用 TCP/IP 协议族进行网络通信 ...

  6. HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端

    协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...

  7. 详解HTTP协议

    一 什么是HTTP协议 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议.HTTP 是基于 TCP/ ...

  8. 虚拟机网络配置详解(NAT、桥接、Hostonly) z

    http://www.cnblogs.com/beginmind/p/6379881.html VirtualBox中有四种网络连接方式: NAT Bridged Adapter Internal H ...

  9. rtp协议详解/rtcp协议详解

    转自:http://www.cnblogs.com/li0803/archive/2010/11/20/1882792.html 1.简介 目前,在IP网络中实现实时语音.视频通信和应用已经成为网络应 ...

随机推荐

  1. 闯祸了,生成环境执行了DDL操作《死磕MySQL系列 十四》

    由于业务随着时间不停的改变,起初的表结构设计已经满足不了如今的需求,这时你是不是想那就加字段呗!加字段也是个艺术活,接下来由本文的主人咔咔给你吹. 试想一下这个场景 事务A在执行一个非常大的查询 事务 ...

  2. 【Java】抽象类与抽象方法

    文章目录 抽象类与抽象方法 abstract关键字的使用 abstract修饰类:抽象类 abstract修饰方法:抽象方法 abstract使用上的注意点: 抽象类的匿名子类 模板方法设计模式 抽象 ...

  3. 使用 Json Schema 定义 API

    本文地址:使用 Json Schema 定义 API 前面我们介绍了 Json Schema 的基本内容,这篇文章我们结合 jsonschema2pojo 工具深入分析如何使用 Json Schema ...

  4. 校招面试之——Java容器

    最近校招季,特把自己面试中遇到的问题整理整理,以巩固自己的知识. Java中对于容器有两大类存储方式,一种是单元素存放,还有一种就是key-value这种有关联的双元素存放了.对于Java中的容器,有 ...

  5. leeetcode 20. 有效的括号

    20. 有效的括号 问题描述 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的 ...

  6. T-SQL的存储过程

    1.简介 存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时 ...

  7. Python webargs 模块

    一.安装 python3 -m pip install webargs 文档 二.基础特性 # encoding=utf-8 from flask import Flask from webargs ...

  8. ubuntu16.04同时使用 pyhton2.7和3.5,并随意切换

    ubuntu16.04中默认已经安装了python2.7和python3.5 hanli@ubuntu:/usr/bin$ ls |grep python dh_python2 dh_python3 ...

  9. poj_3190

    首先把所有的牛排个序,优先按照起始时间 其次建立一个堆,重载小于号(只可以重载小于号),优先按照右端点的时间排序,大的放下面(sort的时候会放后面),堆顶是结束时间最快的 #include < ...

  10. 火爆的文字游戏你玩了吗?「GitHub 热点速览 v.22.06」

    不知道你有没有被 Wordle 这款游戏刷屏,在本期热点速览的特推部分选了一个 React 编写的开源版本同你分享,而本次公众号摘要也是一个提示, 只不过这个只能盲猜了.别小瞧 Wordle 这个游戏 ...