CIDR与NAT
2015-09-03 20:33
381 查看
CIDR与NAT
前言
今天看到有人说我以前写的博客的案例太黄了,好吧,我曾经纯洁过.IPv4由于最初的设计原因,长度只有32位,所以只提供了大约40亿个地址.这造成了IPv4地址耗尽的危机.随后,IPV6被设计出来了,并可以提供足够多了IP地址.但是IPV4和IPV6不兼容啊,所以IPV4向IPV6的迁移并不容易.一些技术,比如说这里要说的CINR和NAT,相继推广.这些技术可以缓解IPV4的稀缺状态,成就了IPV4一时的逆袭.
CIDR
CIDR(Class Inter Domain Routing )改进了传统的IPV4地址分类.传统的IP分类地址将直接对应为默认的分类,从而将Internet分割为网络.CIDR在路由表中增加了子网掩码(subnet masking),从而可以更细分网络.利用CIDR,我们可以灵活的将某个范围的IP地址分配给某个网络.(1) IP地址分类
在IP接力中,我提到,IP地址可以分为如下几类:IP类别 | 起始 | 终止 | 子网掩码 |
A | 1.0.0.0 | 126.255.255.255 | 255.0.0.0 |
B | 128.0.0.0 | 191.255.255.255 | 255.255.0.0 |
C | 192.0.0.0 | 223.255.255.255 | 255.255.255.0 |
11111111 00000000 00000000 00000000
它的前八位为1,所以表示IP地址的前八位为网络部分.而后面的24位代指该网络的各个主机.一个A类网络可以有2^24台主机,也就是16777216.由于IPV4地址已经分好了类,所以当我们看到一个IP地址后,就可以通过上面查到它的子网掩码.(B类,2^16;C类,2^8)
(2) 传统路由器
IP的分类方便了IP包的接力.IP包到达某个路由器后,会根据该路由器的路由表(routing table),来决定接力的下一站.一个传统的路由表看起来是这样的的:Destination(目的地) | Gateway(网关) | Iface(网卡) |
199.165.145.0 | 0.0.0.0 | eth0 |
199.165.146.0 | 0.0.0.0 | eth1 |
0.0.0.0 | 199.165.146.8 | eth1 |
由于IP分类,我们不需要记录subnet mask.当我们要前往199.146.17时,我们已经知道这台主机位于一个C类地址,所以它的子网掩码是255.255.255.0,也就是说199.165.146代表了网络,17代表了主机.
(3) CIDR路由表
然而,由于默认分类,造成了网络只能按照A,B,C的方式存在.假设一个网络(比如MIT的网络)分配了一个A类地址,那么该网络将容许16777216个主机.如果该网络无法用完这些IP地址,这些IP地址将无法被其他网络使用.再比如上面的网络,199.165.145必须作为一个整个的网络存在.如果我们只有10台主机,那么将会有200多个IP地址被浪费.CIDR的本质是在路由表中加入子网掩码,并根据该列信息对网络进行分割,而不是根据默认的A,B,C进行分割.比如:Destination | Gateway | Genmask | Iface |
199.165.145.254 | 0.0.0.0 | 255.255.255.254 | eth2 |
199.165.145.0 | 0.0.0.0 | 255.255.255.0 | eth0 |
199.165.146.0 | 0.0.0.0 | 255.255.255.0 | eth1 |
0.0.0.0 | 199.165.146.8 | 0.0.0.0 | erh1 |
199.165.145.254(IP address):11000111 10100101 10010001 11111110
255.255.255.254 (subnet mask): 11111111 11111111 11111111 11111110 (31个1,1个0)
通过子网掩码可以知道,前32位表示网络,最后一位表示主机.子网掩码总是有连续多个1组成,比如上面的32个1.所以也可记为199.165.145.254/31,来同时表示IP地址和子网掩码.
路由器将原来的199.165.145网络中的一部分分割出来.这一网络可以容纳两台电脑,也就是199.165.145.254和199.165.145.255.这个网络对应网卡是eth2.当有IP包通向这两个IP地址时,会前往eth2,而不是eth0.
网络拓扑如下:
利用CIDR,我们可以将IP地址根据需要进行分割,从而不浪费IP地址.
NAT
CIDR虽然可以更加节约IP地址,但它并不能创造新的IP地址.IP地址的耗尽危机并不能因此得到解决.我们来看IPV4的第二次逆袭----NAT(Network Address Translation).理论上,每个IP地址代表了Internet上的一个设备.但有一些IP地址被保留,用于一些特殊用途.下面三段IP地址被保留用作私有IP地址.
From | To |
10.0.0.0 | 10.255.255.255 |
172.16.0.0 | 172.31.255.255 |
192.168.0.0 | 192.168.255.255 |
NAT是为私有网络(private network)服务的.该网络中的主机使用私用IP地址.当私有网络内部主机和外部Internet通信时,网关(gateway)路由器负责将私有IP地址转换为全球IP地址,这个地址转换过程就是Network Address Translation.网关路由器的NAT功能.最极端的情况下,我们可以只分配一个全球IP地址给网关路由器,而私有网络中的设备都是用私有IP地址.由于私有IP地址可以在不同私有网络中重复使用,所以就大大减小了设备对IP地址的需求.
(1) 基础NAT
NAT的一种为基础NAT,也称为一对一(one-to-one)NAT.在基础NAT下,网关路由器----转换一个外部IP地址和一个私有IP地址.网关路由器保存有IP的NAT对应关系,比如:上面网络中,当有IP包要前往199.165.145.1时,网关路由器会将目的地改写为10.0.0.1,并接力给私有网络中的10.0.0.1的电脑.同样,当10.0.0.0.1的电脑想Internet发送IP包的时候,它的发送地为10.0.0.1.在到达网关路由器时,会将发送地更改为199.165.145.1.此外,IP头部的checksum,以及更高层的协议(比如UDP和TCP)中的校验IP的checksum也会更改.
基础NAT尽管是一对一转换IP地址,他还是可以减小内部网络对IP地址的需求.通常来说,一个局域网中只有少数的设备处于开机状态,并不需要给每个设备对应一个全球IP地址.NAT可以动态的管理全球IP地址,并将全球IP地址对应到开机设备,从而减小内部网络对IP地址的需求.
(2) NAPT
NAT还有一种,被称为NAPT(Network Address and Port Translation).在基础NAT中,高层协议的端口号并不会改动.NAPT下,IP地址和端口号可能同时改动.我们在UDP和TCP中提到端口(port)的概念.在建立UDP或者TCP通信时,我们实际上使用IP:Port来代表通信的一端(正如打电话时主机:分机号一样).NAPT就是在网关路由器处建立两个通信通道,一个通往内部网络,一个通往外部网络,然后将网关处的通道端口连接,从而让内部和外部通信.比如:
我们看到,通往IP 199.165.145.1 建立了三个端口的连接:8888,8889和8080.他们分别在NAPT处改为通往10.0.0.1:80,10.0.0.1:8080和10.0.0.3:6000.NAPT记录有外部IP:端口和内部IP:端口一一对应关系.在IP包经过时,网关路由器会更改IP地址,端口号以及相关的checksum.
利用NAPT我们可以使用一个(或者多个但少量的)外部IP和大量的端口号,来对应多个内部IP以及相应的端口号,从而大大减少了对全球IP地址的需求.
无论是基础NAT还是NAPT,他们的设置都比较复杂,并且从本质上违背了互联网最初的设计概念.但由于IPV4的使用惯例,NAT还是被广泛使用.由于NAT所处的网关服务器是理想的设置防火墙的位置,NAT还往往和防火墙共同建设,以提高私有网络的安全性.
总结
即使是CINR和NAT的广泛使用,IPV4还是不可避免存在耗尽的危机.IPV6正在加紧部署.但是,上述的两种技术,CIDR和NAT在IPV6中同样被采用,所以了解他们依然是有一定意义的,没有人能预见未来,但是咱们可以大胆的推测一下嘛,到底是IPV4将彻底淘汰啊,还是两种协议共存,还是出现能改善IPV4缺点的牛B算法,彻底淘汰IPV6呢?不好说啊.末尾备注
两个局域网内的主机是无法直接通信的,因为他们之间不可见,如果需要通信必须要有一个公网服务器中转.中转可以中转每次通话,即全程参与,也可以只牵个线两人接头后服务器退出,两台局域网内主机直接对话.QQ就是这种技术,p2p也是.相关文章推荐
- 指针之指针数组
- SDUTOJ------3306
- 类再生
- hibernate自动创建表结构的两种方式
- HDU 1569 方格取数(2)(最大点权独立集)
- QuickReport FastReport
- IP地址分类
- HDU 4919(Exclusive or-java的HashMap类)
- Servlet注册功能的实现
- 数字根(digital root)
- 牢骚 - 你代码写得丑,又不肯用好一点的IDE,这让我很为难啊。
- <转>四个重要属性——Action、Data、Category、Extras
- delphi数据库的备份及还原
- JS+Canvas实现的俄罗斯方块游戏完整实例
- SDUTOJ3252---Lowest Unique Price
- 【socket】有关socket的编程<一>
- 大悲咒
- Android界面动画初探之--探索侧边栏折叠效果的实现
- QNX驱动开发——SD卡SD模式开发实录
- Linux 内核编程之文件系统 VFS中的目录项对象和文件对象 http://www.linuxidc.com/Linux/2011-02/32127p2.htm