局域网内同网段通信的过程
这个时候就需要用到ENSP模拟器了,之前已经安装好了,我们通过ENSP来搭建实验环境,这样可以看到实验的效果以及通过抓包来分享整个过程,先看同网段内的通信过程。
1、准备工作
2、开始测试
我们先用PC1访问一下PC4,先看下结果,测试的使用ICMP协议里面的ping工具,这个协议还没讲解,并且呢,这个协议也是后续排错的重要协议。
简单的测试下来有回显,表示通信正常,这个就是Ping工具,能够探测网络的质量、稳定性怎么样,回到正题,PC1到PC4是已经通了,从IP地址通信规则来看,是在同一个网段,能通很正常,那么它通信的过程中发生了什么呢?
开启抓包,PC1访问PC2,抓取PC2的数据,来看看通信过程中发生了什么事情!因为ping它只回显结果,中间发生了什么并不知道,但这个才是要弄懂的关键。
结果显然还是通的,我们关注的点放在抓包了什么内容。
12个数据包,protocol总共两种类型,一种是ARP、一种是ICMP,ICMP上面介绍过,就是我们在命令行输入的Ping,icmp总共10个包(来回各5个),那ARP是干嘛用的呢?这个就需要从我们之前学到的内容综合起来了,这样才能够把这个过程理解透彻。
(1)IP通信规则
PC1(192.168.100.1/24)访问PC2(192.168.100.2)的时候,PC1会用自己的子网掩码计算出自己的网络号是多少,然后根据目的地址来判断是否在一个网段,判断的依据是两边的网络号是否一致,那这里就有一个疑问了,PC1不可能去知道PC2的掩码是多少,PC1只能知晓自己的,因为可以读取网卡的参数,所以PC1判断的依旧是以自己的子网掩码来计算的PC2的地址的网络号是多少,然后做对比,显然是同一个网点号,PC1会直接发送数据到PC2。(源地址192.168.100.1,目的地址192.168.100.2)
(2)数据封装
现在通过掩码的计算得到了对方跟自己在同一个网段,PC1会开始进行封装,最上层为ICMP协议的数据,中间是网络层,包含IP头部(源地址为 192.168.100.1,目的地址是PC2的地址 192.168.100.2),这个都是知道的。(这里说明下,PC2的地址,如果单纯从PC1来说是不知道的,是我们发送指令调用ICMP的ping功能发往的192.168.100.2,ICMP调用网络层,告诉它目的地址是多少,很多新手会迷糊,所以这里多解释下)
现在的问题就在二层封装上面,源MAC,那自然是PC1的MAC地址(54-89-98-FB-22-1B),但是PC2的MAC多少,PC1是并不知道的,不知道的话,那就没法完成封装,所以这个时候就必须有一个协议出来解决这个问题,让PC1能够获取目标的MAC地址,完成封装,这个协议就是ARP。
(3)从抓包来了解ARP的报文结构
在了解ARP的报文结构之前,我们先来了解下ARP的工作原理,然后在结合抓包的内容,就能够更深入的掌握ARP了。
ARP分为两种报文,ARP请求以及ARP响应
PC1在发送数据包给PC2的时候,发现不知道PC2的MAC是多少,于是PC1会发送一个广播ARP的请求,这个请求包中的内容是请求PC2主机IP地址对应的MAC地址是多少
先看前面2个,怎么看数据包呢,可以双击第一个,会单独显示出来,这也是我们能够去深入学习协议的重要工具,能够实实在在的看到整个过程与内容。
上面提到了ARP有两个报文,第一个包势必就是请求了,那它在ARP中结构就是如上图。
Hardware Type:通常值显示为以太网(0x0001)
Protocol Type:这个类型是不是很熟悉,在IP协议中也有,在ARP中表明为谁提供服务,通常值为IP(0x0800)
硬件地址与协议地址长度:这个表示的是MAC地址与IP地址的字节长度
Opcode:requeset(0x0001):这个用于标识这个ARP包到底是请求包还是响应包,当操作值为1的时候,表示是ARP请求
Sender MAC Address(发送方MAC):表明发送方的MAC地址(这里为PC1的MAC 54-89-98-FB-22-1B)
Sender IP Address(发送方的IP):表明发送方的IP地址(这里PC1的IP是192.168.100.1)
Target MAC address(目标的MAC):目标的MAC地址,你会发些这里是一个特殊的MAC地址,模拟器里面有一个错误的,是全F,表示广播,但是标准的格式是全0,表示未知
Target IP address(目标的IP):表明目标的IP地址是多少,也是要请求该IP的MAC
需要掌握的有用信息
这里红色部分表示关键的地方,要掌握,首先来一个比较特殊的,目标MAC那个字段,用的全F的表示,在上面提到过,ARP请求包是以广播的形式发送的,那广播在以太网头部中,目的MAC地址中表示就是为全F
那为什么要广播呢?这就又回到以太网的网络特点了,它是一个典型的多路访问这样的一个结构,从拓扑里面来看,交换机上面接了多个PC,PC1并不知道192.168.10.2具体在哪个PC上面,所以它要想知道这个MAC地址是多少,就只能通过广播的方式来进行请求获取,这个包以广播形式发送出去后,所有人都会收到,那么收到以后,谁来回应呢?这就是在ARP请求报文中目标IP存在的意义了,它表明了请求的就是这个IP的MAC地址,那源MAC与IP的作用是什么呢?这是让对应的目标能够正确的回包,不然你发一个请求包,不告诉别人是谁在请求,那对方想回应都找不到谁来请求的。
看了ARP的报文结构内容后,结合我们做的测试,是不是就很容易看懂了,PC1不知道PC2的MAC地址是多少,于是发送了ARP请求报文,报文中源IP与MAC是PC1,请求的目标IP是192.168.100.2,目标MAC未知,所以以广播的形式全F,发送给同一个链路区域的所有终端设备,其他设备收到以后会拆开这个ARP请求包的内容,如果发现请求包中的目标IP地址与自己的IP地址一致,那么这个设备就会回应这个请求,如果不一致则丢弃(发现找的不是自己)
所以PC2发现这个请求包是询问的自己,于是使用ARP响应来回应这个请求。(在来看回应报文字段内容)
图片大部分字段都是一样的,我们来看看变化的
Opcode:reply(0x0002):这里变成了响应,类型是2
Sender MAC Address(发送方MAC):这个就是PC2收到请求后,在响应包里面把自己的MAC地址包含在源MAC里面
Sender IP Address(发送方的IP):响应方的IP地址,这里为192.168.100.2(PC2的)
Target MAC address(目标的MAC):请求者的目标MAC(PC1,是它请求)
Target IP address(目标的IP):请求者的IP地址(PC1,192.168.100.1)
这样PC1就知道了PC2的MAC地址是多少了,那就可以完成封装了,把数据包发送给PC2了,另外可以发现回应的时候使用的是单播(因为PC2知道了PC1的MAC是多少)
那现在有一个问题,PC1每次发送数据给PC2,都需要ARP请求吗?ARP请求包是广播报文,其余无关终端也需要去查看这个包的内容,如果每次发送数据包都要发送ARP请求,一旦这个网络规模比较大的时候,那岂不是白白的消耗了链路带宽,为了解决这个问题,在终端设备以及网络设备上面都有一个表项,叫做ARP表,用于缓存自己通过ARP协议获取到的IP与MAC的对应信息,在一定时间内,只要ARP表项存在这个IP对应MAC的条目,不需要在去ARP请求。
通过命令arp -a,就可以查看到了,192.168.100.2对应的MAC地址是多少,并且Type是动态的,动态的意思是这条记录是有时间的,时间一过,那么就会消失。像Windows系统默认是2分钟(arp -a的意思是查看arp缓存,Windows CMD里面的指令)
(4)解封装
PC1发送ICMP数据包出来后,交换机会根据MAC表查询到PC2的位置(MAC表记录了PC2的MAC地址是多少),交换机的工作原理,在第三篇链路层简单提到了,回头在开始进入交换篇后在详细了解,PC2收到这个数据包,会进行解封装,那PC2怎么知道这个数据包就是给自己的呢?这个时候就需要来看下以太网的头部。
从抓包来看,以太网头部就显示三个字段
Destination(目的MAC):这里MAC地址为PC2,如果为全F则表示广播(该链路区域内的所有主机都会进行接受处理)
Source(源MAC):这里MAC地址为PC1
Type(类型):表示上层的内容,在如今的网络中,这个值为0x0800(表示IP),如果为0x86DD(表示IPV6)
抓包是看不到前导码跟FCS的,因为这个抓取的数据包是网卡已经处理完毕后的结果。
PC2通过读取以太网头部中的目的MAC地址,发现是找的自己,并且从type中知道上层是IP协议,所以在解封装三层的时候,会用IP协议来读取,同样我们先来看下IP的头部
IP协议头部的字段之前都介绍过,这里就看下几个比较重要的字段,复习下
version(版本):固定为版本4,因为IPV6的包头已经发生了变化
Header Length(头部长度)与Total Length(总长度):头部长度为20个字节,这是一个默认的大小,而总长度表示的IP头部加后面DATA部分的总长度,为60字节,那说明ICMP部分有40个字节(60-20)。
Time to Live(生成时间):这里TTL为128
Protocol(协议):这里为ICMP=1,也就是告诉接收方,上一层的协议是什么
Source与Destination:源目IP,源自然是PC1的地址(192.168.100.1),目的是PC2(192.168.100.2)
PC2通过读取IP协议中的目的地址发现是自己,也从Protocol中知道上层使用的是ICMP,最终会使用ICMP来读取这些数据,然后做出回应,这个就是整个的通信过程。
整个同网段通信过程重点回顾
(1)PC1想要跟PC2通信,首先会读取自己网卡上的IP、子网掩码参数,利用该掩码计算出自己与对方的网络号,看是否相同,相同则在同一个网段。
(2)判断出在同一个网段后,PC1由于不知道PC2的MAC地址是多少,无法完成二层封装,所以必须依靠ARP请求协议来获取,这个请求包内容是请求PC2的IP的MAC地址是多少,并且以广播形式发送(以太网头部 源MAC为PC1,目的MAC,全F),发广播的原因是PC1不知道PC2在哪,只能依靠广播的形式来询问PC2在哪(也是之前说的的靠”吼”的方式),这样整个局域网内的终端都可以收到这个请求,不是PC2的终端设备收到,发现ARP报文里面询问的IP不是自己,就丢弃了,而PC2自身发现请求的是自己IP的MAC,则开始进行ARP回应。
(3)PC2回应这个请求(携带了自己的MAC),以太网头部(源为PC2,目的是PC1),单播的形返回,PC1收到以后,会把这个信息缓存到ARP表项里面,一定时间内不会消失,在这个时间内再次有数据包发送的话,则直接调用ARP表里面的信息即可。
(4)PC1终于知道了PC2的MAC,开始进行封装,以太网头部:源MAC(PC1),目的MAC(PC2),IP头部:源IP(PC1),目的IP(PC2),最终ICMP头部与数据,并且以太网头与IP头里面都会标识出来上层的协议使用的是什么。
(5)PC2收到以后,开始解封装,解封装的过程通过二层头部的目的MAC发现找的是自己,然后通过type知道上层协议使用的是什么,在用对应协议读取上层IP头部,IP头部里面通过查询目的IP字段,发现也是给自己的,然后通过协议号知道上层协议为ICMP,最后读取到最终数据,然后回应。
(6)回应的过程也是一个封装与解封装的过程,与PC1到PC2一样,只是中间不需要在执行ARP了,因为PC1用ARP得到PC2的MAC地址的时候,PC2也从ARP协议里面学到了PC1的MAC,也会缓存到ARP列表中,只有在缓存消失后,再次访问就又需要依赖ARP报文来解析了,缓存期间只要ARP表里面存在的列表,则不需要再次发起ARP请求,直接调用。
(7)这里没有讲解交换机收到数据包如何处理,这个会在交换机篇开始讲解,至此同一个网段局域网通信就完毕了。