CIDR与NAT
今天看到有人说我以前写的博客的案例太黄了,好吧,我曾经纯洁过.
IPv4由于最初的设计原因,长度只有32位,所以只提供了大约40亿个地址.这造成了IPv4地址耗尽的危机.随后,IPV6被设计出来了,并可以提供足够多了IP地址.但是IPV4和IPV6不兼容啊,所以IPV4向IPV6的迁移并不容易.一些技术,比如说这里要说的CINR和NAT,相继推广.这些技术可以缓解IPV4的稀缺状态,成就了IPV4一时的逆袭.
CIDR(Class Inter Domain Routing )改进了传统的IPV4地址分类.传统的IP分类地址将直接对应为默认的分类,从而将Internet分割为网络.CIDR在路由表中增加了子网掩码(subnet masking),从而可以更细分网络.利用CIDR,我们可以灵活的将某个范围的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 |
这是最初的IPV4地址分类设计.一个IPV4地址总共有32位,可以分为网络(network)和主机(host)两部分.子网掩码(subnet mask)是用来标识哪些位代表了网络部分.比如subnet mask 255.0.0.0的二进制表示:
11111111 00000000 00000000 00000000
它的前八位为1,所以表示IP地址的前八位为网络部分.而后面的24位代指该网络的各个主机.一个A类网络可以有2^24台主机,也就是16777216.由于IPV4地址已经分好了类,所以当我们看到一个IP地址后,就可以通过上面查到它的子网掩码.(B类,2^16;C类,2^8)
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代表了主机.
然而,由于默认分类,造成了网络只能按照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地址.
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 |
私有IP地址只用于局域网内部.理论上,我们不应该在互联网上看到来自或者发送私有IP地址的IP包.与私有IP地址对应的是全球IP地址(global IP address).
NAT是为私有网络(private network)服务的.该网络中的主机使用私用IP地址.当私有网络内部主机和外部Internet通信时,网关(gateway)路由器负责将私有IP地址转换为全球IP地址,这个地址转换过程就是Network Address Translation.网关路由器的NAT功能.最极端的情况下,我们可以只分配一个全球IP地址给网关路由器,而私有网络中的设备都是用私有IP地址.由于私有IP地址可以在不同私有网络中重复使用,所以就大大减小了设备对IP地址的需求.
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地址的需求.
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也是.