![3fbba6f23ed1a5b238bec37c02a2929d.png](https://img-blog.csdnimg.cn/img_convert/3fbba6f23ed1a5b238bec37c02a2929d.png)
提起“协议”,我们并不陌生,比如实习协议、租赁协议,等等。
所以,协议,其实就是双方或几方协商一致,需要共同遵守的约定。
网络中各种各样的协议,就是人们为了让电脑或网络设备(比如交换机)更好地协同工作,实现各种网络功能而制定的一些约定。
我们在讨论ARP协议前,先简单了解一下IP地址,以后再详细讨论。
前面我们曾经提到过,电脑有两个地址,一个是MAC地址,像电脑的“身份证号”;一个是IP地址,像电脑的“名字”。
通常,我们会通过IP地址来使用网络。MAC地址我们一般不会直接使用,但是电脑发送数据时要用它来封装,所以电脑需要,但这跟我们使用电脑的操作人员关系不大。
一台电脑要接入并使用网络,必须要有IP地址。打开电脑的网络属性,可以看到:
![3ea0531124b62d0fc91dfe82c10f87b8.png](https://img-blog.csdnimg.cn/img_convert/3ea0531124b62d0fc91dfe82c10f87b8.png)
IP地址,就是你的电脑在网络中的名字,别人用它来找你;
子网掩码,可以通过它和IP地址,知道你的电脑属于哪个子网(如果把网络看成一幢大楼,子网就是每个楼层或者每个房间,可大可小。去楼层或房间找你,比在整个大楼找要容易得多);
网关,你所在子网通往其他子网的出入口。
比如,你的电脑IP地址是192.168.1.20,子网掩码是255.255.255.0,通过“按位与”,可以计算出你的子网号。
什么是“按位与”?
“按位与”也叫“按位乘”,是一种逻辑运算:把参与运算的两个二进制数各对应位相乘,两个数都是1时,结果才是1。
比如,二进制数10110100和110010,先把它们右对齐,位数不够的前面补“0”,使它们对齐:
![fc3018573f6705e66b7548bee0a58f97.png](https://img-blog.csdnimg.cn/img_convert/fc3018573f6705e66b7548bee0a58f97.png)
然后,对应的位相乘,并得到结果:
![e4564b4a8b1bdbfb08e2cd26d36d1f16.png](https://img-blog.csdnimg.cn/img_convert/e4564b4a8b1bdbfb08e2cd26d36d1f16.png)
00110000就是二进制数10110100和110010 “按位与”的结果。
我们把IP地址和子网掩码换算成二进制(用电脑上的计算器,当然你也可以通过除2取余法手工算),然后“按位与”,再把结果换成十进制,就是你的子网号。如:
![0e82a58a1703f8a1331bd1bb5c77d480.png](https://img-blog.csdnimg.cn/img_convert/0e82a58a1703f8a1331bd1bb5c77d480.png)
计算出的192.168.1.0就是你的电脑所在的子网号。
Windows10的计算器有“按位AND”操作,就是“按位与”,计算子网号很方便。
![5f00a7c4b3cabd3c7891144f4efea4ff.png](https://img-blog.csdnimg.cn/img_convert/5f00a7c4b3cabd3c7891144f4efea4ff.png)
通常情况下,子网掩码也可以用它二进制中“1”的个数来表示。如子网掩码255.255.255.0换算成二进制后从左向右共有24个“1”,我们可以称为“24位掩码”。IP地址和子网掩码可以简写为:192.168.1.20/24。
当两台电脑的子网号相同,我们可以认为它俩在同一个网络,可以理解为同一个房间,直接互访就行,不用出门;如果子网号不相同,那它们要互访就需要通过网关这个出入口了。网关,就好像房间的门。
网关一般是一台有路由功能的设备,这个以后再讨论。
现在,我们来看看ARP这个协议。
我们假设电脑A的IP地址和子网掩码是192.168.1.20/24,网关是192.168.1.254。要访问的电脑B的IP地址是192.168.1.25。
如果是一般电脑操作人员,直接通过某个软件访问192.168.1.25就可以了,不必关心访问的细节。
但我们学网络的人,就需要知道电脑是怎么处理的。
电脑A在进行数据封装时(可以理解为寄快递,把要寄的东西打包,并填写快递单),计算自己的子网号和电脑B的子网号是否相同。
等等,我们要访问的电脑B只提供了IP地址,并没有告诉我们子网掩码呀?
是的,我们在网络中访问别人,只通过对方的IP地址就可以了。
那怎么计算它的子网号呢?
谁要访问别人,就用谁的掩码!也就是说,电脑A不管访问谁,都用自己的掩码计算双方的子网号!
你以为呢?不然用谁的,别人的我也不知道啊!
通过“噼里啪啦”一阵计算,我们得到电脑A和电脑B的子网号都是192.168.1.0。
既然大家都在一个子网,就好像都在一间屋子里一样,电脑A虽然不知道电脑B是谁,但它会大声问,保证房间里所有人都能听到:“请问,192.168.1.25,你的MAC地址是多少?”
这就是ARP协议的Request报文:
![ac15005c41c3bffbbd7a5541a6bbc328.png](https://img-blog.csdnimg.cn/img_convert/ac15005c41c3bffbbd7a5541a6bbc328.png)
这个报文简单点说,就是ARP的“快递单”,我们只看后面4行:
Sender MAC address:这是“发件人”的MAC地址,也就是电脑A的;
Sender IP address:这是“发件人”的IP地址;
Target MAC address:这是“收件人”的MAC地址,电脑A正在问,还不知道,填全0;
Target IP address:这是“收件人”的IP地址。
要把这个ARP Request询问报文发出去,还要用以太网格式把这个Request报文打包封装一下,填写以太网的“快递单”。因为电脑的网卡、交换机在传输数据时只认识以太网的“快递单”格式,不认识其他的东西,包括ARP。
![1c398922afe28aaa05898ee10c7817f5.png](https://img-blog.csdnimg.cn/img_convert/1c398922afe28aaa05898ee10c7817f5.png)
上面的EthernetII就是以太网的一种“快递单”格式,我们在前面曾经提到过以太网的封装格式:
![a07c1ab107d63df6b099592ccfac2815.png](https://img-blog.csdnimg.cn/img_convert/a07c1ab107d63df6b099592ccfac2815.png)
对照看一下:
DMAC:对应Destination,收件人地址。由于Request报文是“大声问”,需要房间里的所有人都听到,因此填写“广播地址”;
SMAC:对应Source,发件人地址,就是电脑A的MAC地址;
Type:收件人收到后把以太网包装拆除,要把里面封装的东西交给ARP协议处理;
Data:发送的数据,这里是Address Resolution Protocol(request),就是ARP Request请求报文;
CRC:校验数据没有列出,我们不必关心,知道作用就行了。
电脑A把ARP Request报文封装好后,广播发送出去。
其他电脑收到(非电脑B)后,发现收件人是广播地址,需要接收,于是“拆快递”,把以太网包装拆除后根据Type交给ARP协议,ARP协议发现Target IP address填写的并不是自己的IP地址,把报文丢弃。
为什么其他电脑的IP地址不会是192.168.1.25呢?
在一个子网中,IP地址不能重复!
一个房间里有多个“马冬梅”,你叫一声“马冬梅”,谁知道你叫谁呢!
IP地址是否重复有个检测机制,一会再说。
电脑B收到后,同样需要接收广播报文,拆除以太网包装并根据Type交给ARP协议处理。ARP发现Target IP address填写的正是自己的尊姓大名,需要进一步处理。仔细一看,发现是一个ARP Request请求报文,明白了这是电脑A在问自己的MAC地址呢,于是,写封回信:
![8229925afabef2d4699a0518b7b0738b.png](https://img-blog.csdnimg.cn/img_convert/8229925afabef2d4699a0518b7b0738b.png)
这是电脑B给电脑A的回复(Reply)报文,应该能看懂了。
需要注意的是,ARP Reply在以太网封装时,“收件人”不再是广播,而是单播,Destination填写的是电脑A的MAC地址,交换机只会把这个报文从连接电脑A的端口发出去,其他电脑收不到这个报文。
电脑A收到电脑B的MAC地址后,就可以把要发给电脑B的数据用以太网格式封装好发出去了(前面说过,必须要包装成以太网格式才能发出去)。
难道电脑A每次访问电脑B都要先用ARP问一下?
当然不是!电脑A收到Reply后,会把电脑B的IP地址和MAC地址对应关系写进自己的ARP表中,老化时间是20分钟。我们在电脑上打开“命令提示符”,用命令arp -a可以看自己电脑的ARP表。
![6d317fa150c0390b132e1e12728fcdbd.png](https://img-blog.csdnimg.cn/img_convert/6d317fa150c0390b132e1e12728fcdbd.png)
Internet地址就是IP地址,物理地址就是MAC地址,类型静态表示由系统或手工指定,动态表示由ARP Reply收到并记录。
如果,我们计算出来电脑A和电脑B的子网号不同怎么办?
那就是说,俩电脑不在同一个房间。
还能怎么办,走出门呗。对,就是找网关!
如果俩电脑的子网号不同,ARP就不会再去大声问电脑B的MAC地址了。为什么?因为人家跟你不在同一个房间,你并不知道它在哪,所以你喊破喉咙它也听不见!
这时,ARP会去大声问网关(192.168.1.254)的MAC地址,得到回复后把数据封装成以太网格式发给网关(收件人destination是网关的MAC地址)。后面的事情电脑就不管了,由网关去完成。
每台电脑要访问任意一个IP地址,都会先计算对方跟自己是不是在同一个子网:
如果是,则在ARP表中查找对方IP地址所对应的MAC地址;如果不是,则在ARP表中查找网关IP地址所对应的MAC地址。
不管是查找谁,如果能找到,就直接用以太网格式封装数据发走;如果没有找到,再用ARP去问,收到Reply后写进ARP表,再用以太网封装。
ARP就是这么工作的。它是由电脑自动完成,一般操作人员并不感知它的存在。
ARP其实就是一问一答:大声问,小声答;广播问,单播答。
我们注意到,电脑A收到ARP Reply后,并没有检查到底是不是电脑B回复的。当然,像我们这样单纯的人,不会怀疑:192.168.1.25不就是电脑B吗?难道还会是别人?
有可能!这就是ARP的漏洞:假如电脑X仿冒电脑B给你回复,这样,你得到的MAC地址就是电脑X而不是电脑B的,而你依然很天真地相信这个MAC地址是电脑B的,结果,把数据都发给了电脑X!
这就是以前很常见的ARP攻击手段!现在,由于人们安全意识增强,电脑上一般都会有安全软件,ARP攻击已经比较少见了。另外,小小透露一点,IPv6会检查,不存在这个漏洞了。
还有一种特殊的ARP,如下:
![ab340d136dd74cdef1a52e328f548d5c.png](https://img-blog.csdnimg.cn/img_convert/ab340d136dd74cdef1a52e328f548d5c.png)
细心的你已经发现了,Sender IP address和Target IP address是一样的!
这个意思是指,我要广播问一下房间里所有人,有没有人的IP地址跟我一样,也是192.168.1.20?如果没有,就不会有人理我;如果有,我就会收到Reply,那我就会提示“IP地址冲突”!
这个ARP,也叫“免费ARP”。一般当电脑的IP地址发生变化时,由电脑自动发出询问。
到现在为止,我们知道,电脑要发数据,封装成以太网格式就行了。但我们发现,以太网格式中,并没有填写IP地址的地方!
难道不需要吗?
小Q:一个广播域内电脑的数量多少对网络会有什么影响?
欢迎大家留言讨论。