由于互联网的诞生,局域网内部的链路层地址无法充当设备的唯一性标识(链路层地址只在局域网内部有效),于是IP地址就站上了历史的舞台,用来唯一地标识接入互联网的设备的接口。如果一个设备具有多个接口,那么每个接口都会拥有一个IP地址,典型的例子是连接多个局域网的路由器,它的每一个接口都有一个独立的IP地址。但计算机通常只有一个接口,那它通常只有一个IP地址,除非特殊组网需要还会配置一些从地址。
IP地址是一个32位的二进制数,通常用“点分十进制”表示成“a.b.c.d”的形式。其中a,b,c,d各占用8位,是0~255之间的十进制整数。例如:IP地址192.168.1.10,实际上是32位二进制数11000000.10101000.00000001.00001010。
IP地址分为ABCDE五类:
A类:0.0.0.0~127.255.255.255;
B类:128.0.0.0~191.255.255.255;
C类:192.0.0.0~223.255.255.255;
D类:224.0.0.0~239.255.255.255;
E类:240.0.0.0~247.255.255.255。
A、B、C三类地址称为单播地址,用于标识一个接口,而目的地址为单播地址的报文称为单播报文;D类地址称为组播地址,目的地址为组播地址的报文称为组播报文,某些启用了特定功能的接口可以收到对应组播地址的组播报文;E类地址暂时不用;还有一个特别地址255.255.255.255,称为广播地址,广播报文可以被所有设备接收。
IP(IPv4)地址中,有三段地址专门用于内部专网(或称为“私网”)的规划,不能被传播到互联网(与“私网”相对应,可以称为“公网”)上:A类地址段中的10.0.0.0~10.255.255.255,B类地址段中的172.16.0.0~172.31.255.255,C类地址段中的192.168.0.0~192.168.255.255;或表示为10.0.0.0/8,172.16.0.0/12,192.168.0.0/16三个网段。
通过静态手工配置或应用层的协议互通,NVR和IPC可以获知对方的IP地址——关于协议互通的详细机制与具体的联网协议相关,我们在后续讲到互联互通时再仔细阐述。
以太局域网的内部通信需要知道链路层地址,即MAC地址。已经知道了对方的IP地址,怎么才能获取对方的MAC地址呢?
小时候父母和老师经常教导我们,鼻子下面是啥?嘴巴啊,不清楚问就行了。
“谁的IP地址是192.168.1.10(NVR的IP),告诉一下MAC地址?”IPC对着大伙喊,这叫广播。
“嗨,来了来了,是我是我,我的MAC是48:EA:63:0E:B7:BF。”NVR对着IPC应答,这叫单播。
规定这个交互过程的协议叫ARP(Address Resolution Protocol),这个过程称为地址解析。在讨论ARP协议之前,我们先了解下MAC地址的单播、组播、广播知识。
每个以太网设备都有一个唯一的属于自己的MAC地址,叫作单播MAC地址,例如48:EA:63:0E:B7:BF,目的MAC为该地址的以太帧只有它才会接收。有一个特别的MAC地址“FF:FF:FF:FF:FF:FF”,它对应于局域网上的所有设备,只要给这个MAC地址发送报文,局域网上的所有设备都会接收,这个MAC地址称为广播MAC地址。另外还有一类地址,对应于以太网上的一组特定的设备,这类MAC地址叫组播MAC地址,目的为组播MAC地址的以太帧,只有加入到这个组播组的设备才会接收。
说明
关于组播MAC地址的应用,我们在后面讨论组播时再深入介绍。
当IPC不知道NVR的MAC地址的时候,它会发送一个ARP请求报文,通常是一个广播以太帧。大意是“谁知道192.168.1.10的MAC地址是多少,告诉我192.168.1.100”,然后在发送者地址字段填上自己的MAC地址:48:EA:63:0E:00:01。既然不知道对方的MAC地址,目的MAC地址就填广播MAC地址“FF:FF:FF:FF:FF:FF”了。
当NVR收到这个报文后一看,哦,有人问我的MAC地址,那我就告诉他吧。然后发送一个ARP应答报文,通常是一个单播以太帧。大意就是“192.168.1.10的MAC地址是48:EA:63:0E:B7:BF”,然后填上自己的MAC地址48:EA:63:0E:B7:BF,目的MAC地址就是请求人的MAC地址了:48:EA:63:0E:00:01。对了,还要把对方的IP和MAC地址保存下来:“192.168.1.100 48:EA:63:0E:00:01”,下一次给IPC发送报文的时候就不用再次询问对方的MAC地址了——这个存下来的表项就叫ARP表项,如图1-7所示。
图1-7 ARP机制组网图
与此同时,同一局域网内的其他IPC也能收到该IPC发送给NVR的ARP请求,这些IPC虽然不会发送ARP响应,但也会把这个IPC的MAC地址和IP的对应关系保存下来。下次如果需要向这个IPC发送消息就不用再发送ARP请求了。
再回头看发送ARP请求的IPC,在收到NVR的ARP应答报文后,自然就得到了NVR的MAC地址,于是建立了一个关于NVR的ARP表项:“192.168.1.10 48:EA:63:0E:B7:BF”。
到此为止,双方的ARP表中都有关于彼此的MAC地址了。
上述的ARP学习过程是通过协议动态获取的,这种ARP表项叫作动态ARP。为了节省表项资源,ARP表项需要定期老化清除。相对动态ARP,也可以手工静态配置,这种手工配置的表项叫作静态ARP表项。
有一种特殊的ARP特性叫作免费ARP(Gratuitous ARP)。免费ARP的过程很简单,就是明知故问,发送一个ARP请求报文。比如NVR发送的免费ARP就是“谁知道192.168.1.10的MAC地址,请告诉我192.168.1.10”。这种明知故问的ARP有什么用呢?当设备获得了一个IP地址或刚开机时,为了确定自己的IP有没有被局域网内的其他设备占用,通常会发送一个免费ARP请求;如果局域网内有其他设备已用了这个地址,那个设备就会回应一个ARP应答,于是发送免费ARP的设备就会给予系统提示。例如,NVR收到其他设备关于它的免费ARP的应答,就会提示“IP地址冲突”,便于管理员进行故障排查。
免费ARP的另一个好处是,如果设备IP所对应的MAC地址发生了变化,发送免费ARP可以使得局域网内的其他IP设备立刻刷新该设备的ARP表项。
说明
MAC地址发生改变的场景比较多,可能是计算机更换了网卡,也可能是主备系统发生了切换。
通过ARP解析可以获取对方的MAC地址,原理比较简单。但是昨天老U碰到了一件费解的事情:开始的时候将NVR配成1.1.1.1,IPC配成2.2.2.2,死活不通,后来在BBS上请教了高人,分别改配成192.168.1.10和192.168.1.100才互通成功,这是为什么呢?
我们知道,以太帧用于局域网通信,同样MAC地址只有在局域网内有效,所以,只有当设备认为自己与对方处于同一个局域网时,才会通过ARP协议请求对方的MAC地址,然后将报文直接或通过二层交换机发送给对端设备,这个过程叫二层转发。否则,设备就不会将报文直接发送给对方,而是将报文发送给一个叫“网关”的设备,即前面提到的路由器,由网关转发给处于另一个局域网的目的设备,这个过程叫三层转发。
设备怎么判断对方是否与自己在同一个局域网呢?
一个IP地址可以分解为网络地址和主机地址,网络地址和主机地址的划分是由“地址掩码”决定的。地址掩码为32位,由一串1后面跟随一串0组成,其中1表示IP地址中的网络地址对应的位数,而0表示IP地址中主机地址对应的位数。掩码可以用点分十进制表示,例如点分十进制的掩码255.255.255.0,实际上是32位二进制数11111111.11111111.11111111.00000000;掩码也通常用长度值来表示,即值为1的位的数量,例如掩码255.255.255.0用掩码长度来表示就是24。
当我们配置计算机的IP地址时,除了配置IP地址本身,同时需要配置地址掩码。例如,配置主机地址为192.168.1.10,掩码为255.255.255.0,或这样表示为192.168.1.10/24。
网络地址相同的两个IP地址,称它们处于同一网段,即处于同一局域网。但由于报文的发送方并不知道对方的地址掩码,所以实际的处理方法是:将对方的IP和自己的掩码相与,若结果与自己的网络地址相同,就认为处于同一网段。例如,A主机的地址为192.168.1.10/16,B主机的地址为192.168.1.100/24,则A会认为B与自己在同一网段,因为192.168.1.100与A的16位掩码相与的结果为192.168.0.0,刚好是A的网络地址;B也会认为A与自己在同一网段,因为192.168.1.10与B的24位掩码相与的结果为192.168.1.0,刚好是B的网络地址。所以它们俩会进行二层转发。又比如,A主机的地址为1.1.1.1/24,B主机的地址为2.2.2.2/24,则A不会认为B与自己在同一网段,因为2.2.2.2与A的24位掩码相与的结果2.2.2.0不是A的网络地址;B也不会认为A与自己在同一网段,因为1.1.1.1与自己的24位掩码相与的结果1.1.1.0不是B的网络地址。所以它们不会去发送ARP报文解析对方的MAC地址,而是各自去寻找网关,去解析网关的MAC地址,走三层转发流程。
家园网友互动
Q:hurryliao 发表于 2015-8-13 17:24
1.1.1.1和1.1.1.5是同一网段的吗?
A:网语者 发表于 2015-8-13 17:38
不能确定。在早期的协议中,1.1.1.1是属于A类地址,A类地址的掩码长度是8位。因此这两个地址是属于同一网段。但是,现在的网络都实现了无类别域间路由(Classless Inter-Domain Routing,CIDR),这两个地址是否位于同一网段还需要依赖掩码长度来确定。如果掩码长度是30,那么这两个地址就不属于同一个网段了。
Q:westbuke 发表于 2015-8-13 17:39
一个接口只能有一个IP地址吗?
A:网语者 发表于 2015-8-13 18:28
取决于操作系统,一个物理接口完全可以有多个IP地址。
感觉学有所成的老U点了支雪茄,悠哉地坐到监控屏幕前面,看着客人们在各个茶房聊天喝茶。突然,图像上的人影跳动了起来,视频不像原先那么顺畅了;同时,办公室传来玩游戏的老婆的尖叫声:“电脑中病毒了……”