图文并茂详解 NAT 协议!
什么是 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 协议!的更多相关文章
- VMware虚拟网络连接模式详解(NAT,Bridged,Host-only)
序言 如果你使用VMware安装虚拟机,那么你必定会选择网络连接,那么vmware提供主要的3种网络连接方式,我们该如何抉择呢?他们有什么不同呢?这篇我们就做一个深入. 首先打开虚拟机设置里面的网络适 ...
- http协议报头详解HTTP协议结构
http协议 请求报文和响应报文都是由以下4部分组成 1.请求行 2.请求头 3.空行 4.消息主体 下图为http请求的报文结构 下图为http响应报文结构 请求行 格式为: Method Requ ...
- 虚拟机网络配置详解(NAT、桥接、Hostonly)
VirtualBox中有四种网络连接方式: NAT Bridged Adapter Internal Host-only Adapter VMWare中有三种,其实它跟VMWare的网络连接方式都是一 ...
- iOS 详解NSObject协议
协议就是一组接口的集合,遵守一个协议之后就拥有的该协议中所有方法的声明.NSObject这个类遵守了NSObject协议,并且实现了NSObject协议里的所有方法,所以NSObject类及其子类 ...
- 一:详解 HTTP 协议
本篇文章篇幅比较长,先来个思维导图预览一下. 一张图带你看完本篇文章 一.概述 1.计算机网络体系结构分层 计算机网络体系结构分层 2.TCP/IP 通信传输流 利用 TCP/IP 协议族进行网络通信 ...
- HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...
- 详解HTTP协议
一 什么是HTTP协议 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议.HTTP 是基于 TCP/ ...
- 虚拟机网络配置详解(NAT、桥接、Hostonly) z
http://www.cnblogs.com/beginmind/p/6379881.html VirtualBox中有四种网络连接方式: NAT Bridged Adapter Internal H ...
- rtp协议详解/rtcp协议详解
转自:http://www.cnblogs.com/li0803/archive/2010/11/20/1882792.html 1.简介 目前,在IP网络中实现实时语音.视频通信和应用已经成为网络应 ...
随机推荐
- 使用.NET 6开发TodoList应用(26)——实现Configuration和Option的强类型绑定
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在上一篇文章使用.NET 6开发TodoList应用(25)--实现RefreshToken中,我们通过使用Configura ...
- 【C语言】将文本中汉字读入字符数组输出乱码
输出中文字符乱码 今天从文件中将中文读入字符数组后输出发现其中文变成了乱码,,令人头大. 解决办法 将文本编码格式改成ANSI即可. 打开记事本->文件->另存为->更改编码格式-& ...
- X-Forwarded-for漏洞解析
首先了解X-Forwarded-for(简称:XFF) X-Forwarded-for:简称XFF,它代表客户端,也就是HTTP的请求真实的IP,只有在通过了HTTP代理或者负载均衡器时才会添加该项. ...
- hdfs文件导入到hive(带资源)
前言 hive是基于Hadoop的一个数据仓库工具,用来进行数据提取.转化.加载,这是一种可以存储.查询和分析存储在Hadoop中的大规模数据的机制.hive数据仓库工具能将结构化的数据文件映射为一张 ...
- Jquery操作文本内容(三个方法:html()、text()、var())
Jquery操作文本内容(三个方法:html().text().var()) 一.html()获取和设置文本内容和标签 1.获取标签里的结构和内容 $("ul").html() / ...
- Autofac实现拦截器和切面编程
Autofac.Annotation框架是我用.netcore写的一个注解式DI框架,基于Autofac参考 Spring注解方式所有容器的注册和装配,切面,拦截器等都是依赖标签来完成. 开源地址:h ...
- golang中channel
1. Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication). 2. select package main im ...
- 【转载】Systemd 入门教程:实战篇
作者: 阮一峰 日期: 2016年3月 8日 上一篇文章,我介绍了 Systemd 的主要命令,今天介绍如何使用它完成一些基本的任务. 一.开机启动 对于那些支持 Systemd 的软件,安装的时候, ...
- JavaWeb后端工程师技能图
- HTML(前端web)
目录 一:HTML前端 1.什么是前端? 2.什么是后端? 3.什么是HTML? 4.HTML不是什么? 5.前端的学习流程 6.BS架构 7.搭建服务器 简易(浏览器访问) 8.浏览器访问报错原因 ...