子网对外部路由器来说隐藏了内部网络组织,只需一台路由器来提供Internet的接入,不用为每一个主机指定路由表目。例如
子网对于外部路由器是透明的,因此要到达IP地址开始部分为140.252的主机,外部路由器只需要知道通往IP地址140.252.104.1(gateway)的路径。
子网对于内部路由器是不透明的,因此数据报到达gateway后,假设它的目的地址是140.252.57.1,gateway需要知道子网号是57,然后把它送到kpno,kpno也需要知道子网号是57,然后把它送到R55,最后由R55把它送到R57。
多少比特用于子网号及多少比特用于主机号是由子网掩码来确定的,子网掩码是一个32bit的值,其中值为1的比特留给网络号和子网号,为0的比特留给主机号。如下图:
子网掩码的例子:
子网13中有两个分离的网络:以太网和slip子网,为了区分他们要分配不同的子网号,解决方法是把子网号从8bit扩充到11bit(剩下的3bit用于将子网再细分),把主机号从8bit减为5bit 。这就叫作变长子网(variable-length subnets):
11位子网号中的前8bit始终是13。剩下的3bit中,用001(即.32)表示以太网,010(即.64)表示点对点SLIP链路。因此主机号加上子网号中主机号才是IP地址中的主机号。
表中的最后一行是广播地址140.252.13.63:它是根据以太网子网号(140.252.13.32)和主机号(低5位)置1(16+8+4+2+1=31)得来的。
在上述子网的sun主机执行ifconfig命令:
le0,sl0,lo0是网络接口的设备名,分别代表以太网,串行线路,环回接口。
flags是网络接口状态,由7个十六进制数组成。
下面是各个bit值代表的意义
0x00000001 /* interface is up */
0x00000002 /* broadcast address valid */
0x00000004 /* turn on debugging */
0x00000008 /* is a loopback net */
0x00000010 /* interface is point-to-point link */
0x00000020 /* avoid use of trailers */
0x00000040 /* resources allocated */
0x00000080 /* no address resolution protocol */
0x00000100 /* receive all packets */
0x00000200 /* receive all multicast packets */
0x00000400 /* protocol code on board */
0x00000800 /* supports multicast */
0x00001000 /* multicast using broadcast address */
0x00002000 /* non-unique address */
0x00004000 /* DHCP controls this interface */
0x00008000 /* do not advertise */
0x00010000 /* Do not transmit packets */
0x00020000 /* No address - just on-link su bnet */
0x00040000 /* interface address deprecated */
0x00080000 /* address from stateless addrconf */
0x00100000 /* router on this interface */
0x00200000 /* No NUD on this interface */
0x00400000 /* Anycast address */
0x00800000 /* Do not exchange routing info */
0x01000000 /* IPv4 interface */
0x02000000 /* IPv6 interface */
0x04000000 /* Mobile IP controls this interface */
0x08000000 /* Don't failover on NIC failure */
0x10000000 /* NIC has failed */
0x20000000 /* Standby NIC to be used on failures */
0x40000000 /* Standby active or not ? */
0x80000000 /* NIC has been offlined */
我们以flags=63为例,对应0x00000001,0x00000002,0x00000020,0x00000040,可知这4个值分别代表接口是开放的,是一个有效的广播地址,未采用尾部封装,占用资源。这4个值正好和紧跟后面的尖括号对应,尖括号内的内容是状态段,各状态段的定义如下:
UP——这个标志指出这个接口是开放的,可以发送和接收数据。
DOWN——相反的,这个标志指出这个接口是关闭的,也就是说,此时不能为主机发送和转发包
NOTRAILERS——这个标志指出了一个报文尾不包括以太帧的尾部。报文尾是在Berkerley Unix系统中使用的把信息头加到包尾的一种方式。
RUNNING——这个标志指出,该接口已经被系统识别。
MULTICAST——这表示接口支持多播。
BROADCAST——这表示接口支持广播。
SLIP接口的标志LINK0是一个允许压缩slip的数据(CSLIP)的配置选项。其他的选项有LINK1(如果从另一端收到一份压缩报文,就允许采用CSLIP)和LINK2(所有外出的ICMP报文都被丢弃)。
下面一行是ip地址和子网掩码。