在网络中,经常有这样的场景,如果两个网卡位于同一物理局域网络上,那么它们就可以直接在MAC层互相通信。
此时,就有一个问题,运行在底层的通信软件,“如何”知道两个网卡是位于同一网络中?关键就是在子网掩码(Subnet Mast),这是一种特殊的位模式,在目前的IPv4网络中,任何使用TCP/IP协议的网卡,都必须定义子网掩码。
子网掩码是一个特殊的位模式,其IPv4地址的网络号全部为1。
我们常用的IPv4地址有三类—A、B、C类,都有其自己的默认子网掩码。n表示网络部分,h表示地址部分。
三类地址的默认子网掩码可以看到,子网掩码识别的是IP地址中的网络部分。
一般来讲,一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网(subnet)。因为划分子网是一个单位内部的事,因此本单位以外的网络看不见这个网络具体是由多少个子网组成,该单位对外部仍是表现为一个网络。
划分子网的方法是从网络的主机号借用若干位作为子网号(subnet-id),同时主机号也会相应的减少同样的位数,于是原本两级的IP地址在划分子网的单位内部就变为三级IP地址:网络号、子网号和主机号。
对于划分了子网的网络,外部其他网络发送给本单位某个主机的IP数据报后,首先还是根据IP数据报的目的网络号找到连接在本单位网络上的路由器。路由器接收到IP数据报以后,再按照网络号和子网号找到目的子网,进而再把IP数据报交给目的主机。
我们举个例子,假设某家公司拥有一个B类的IP地址,网络地址是145.13.0.0,其网络号是145.13。
那么,根据网络协议,凡目的地址为145.13.x.x的IP数据报都会被发送到该网络上的路由器。
B类网络现把B类网络145.13.0.0划分为3个子网,子网号占用8位,那么主机号就剩下8位。该网络所划分的三个子网分别为145.13.3.0、145.13.7.0和145.13.21.0。
划分子网后,该网络对外部表现仍为一个网络,其网络地址依旧是145.13.0.0,但网络145.13.0.0上的路由器接收到外来的数据报后,会根据数据包的目的地址把它转发到相应的子网。
划分三个子网的B类网络那么,对于该网络的路由器,在接收到带有目的IP地址的数据报,是如何判断出目的主机所在的子网的?
IP数据报和IP地址本身,其携带的信息里并不包含数据报源主机或目的主机所连接的网络是否进行了子网划分。对于路由器来说,为了找到目的主机所在的子网,也要使用子网掩码。
以IP地址145.13.7.35为目的主机地址,按照三级IP地址去理解,目的主机的网络位为145.13,子网位为7,主机位为35。
两级IP地址和三级IP地址可以看出,子网号为145.13.7。路由器要使用子网掩码,根据三级IP地址的结构和子网掩码的使用规范,子网掩码中的1对应目的IP的子网号,0对应主机位,也就是说,32位IPv4,前24位都是1,后8位是0,用二进制表示就是11111111111111111111111100000000,换算成十进制为255.255.255.0。
路由器会把子网掩码和目的主机地址进行与(AND)运算,然后便能得出目的主机所在的子网的网络地址。
与(AND)运算是一种逻辑运算,符号为&。在二进制中,运算规则为1&0=0,0&0=0,1&1=1。
路由器计算子网地址路由器是根据路由表来工作的,按照因特网的标准规定,路由器的路由表中必须有子网掩码这一栏。路由器在和相邻路由器交换路由信息时,必须要把自己所在网络或子网的子网掩码传递到相邻路由器。
在路由器的路由表中的每一个项目,除了要给出目的网络地址,还必须同时给出网络的子网掩码。若一个路由器连接在两个子网上,就拥有两个网络地址和两个子网掩码。
若是网络没有专门划分子网,路由器的路由表中子网掩码那一栏使用的就是前文说过的默认子网掩码。
但是,由于IPv4地址空间日益消耗,并且路由表中的项目数随着网络的增多也越来越长,在IPv6没有出来的那段时间,在原先子网掩码的概念上引出了新的办法。
一个是变长子网掩码VLSM(Variable Length Subnet Mask),在一个划分了子网的网络中可同时使用几个不同的子网掩码。
另外一个是无分类域间路由选择CIDR(Class Inter-Domain Routing),CIDR消除了传统的A类、B类和C类地址以及子网划分的概念,可以在IP地址的网络部分和主机部分的任何边界设置边界,大大拓展了IPv4地址的使用效率。
目前的网络中,特别是对IPv4地址的使用上,CIDR占据了主要地位。
网友评论