5000字加21图文 | 抓包带你体验同网段的通信过程,这些细节很关键

万事须己运,他得非我贤。这篇文章主要讲述5000字加21图文 | 抓包带你体验同网段的通信过程,这些细节很关键相关的知识,希望能为你提供帮助。
作者:一天  首发公众号:网络之路博客(ID:NetworkBlog)?
填坑的开始
在第二篇的时候以及第五篇都提到过,在通信过程中,A发送数据包给B,三层需要封装源目IP,二层需要封装源目MAC,这样才能够完成通信,那么在一个局域网中,甚至互联网中,二层的MAC该怎么去封装呢?又是如何去知道对方的MAC是多少的呢?这篇就来填这个之前一直说的这个坑,并且这个内容的知识点是学习后续的关键理论以及整个数据通信的核心部分,这个学好了在后续学习路由交换的技术以及排错都会有很大的帮助。
?
局域网内同网段通信的过程
这个时候就需要用到ENSP模拟器了,之前已经安装好了,我们通过ENSP来搭建实验环境,这样可以看到实验的效果以及通过抓包来分享整个过程,先看同网段内的通信过程。
?
1、准备工作



2、开始测试

我们先用PC1访问一下PC4,先看下结果,测试的使用ICMP协议里面的ping工具,这个协议还没讲解,并且呢,这个协议也是后续排错的重要协议。

简单的测试下来有回显,表示通信正常,这个就是Ping工具,能够探测网络的质量、稳定性怎么样,回到正题,PC1到PC4是已经通了,从IP地址通信规则来看,是在同一个网段,能通很正常,那么它通信的过程中发生了什么呢?






开启抓包,PC1访问PC2,抓取PC2的数据,来看看通信过程中发生了什么事情!因为ping它只回显结果,中间发生了什么并不知道,但这个才是要弄懂的关键。
【5000字加21图文 | 抓包带你体验同网段的通信过程,这些细节很关键】


结果显然还是通的,我们关注的点放在抓包了什么内容。



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)这里没有讲解交换机收到数据包如何处理,这个会在交换机篇开始讲解,至此同一个网段局域网通信就完毕了。
?
“承上启下”
同一个网段通信已经了解了,在同一个网段内通信不依赖于网关,直接通过ARP协议获取到对方的MAC,然后从二层链路给发送出去,交换机通过MAC表转发到对应接口下的设备进行处理,那么不同网段通信的过程又是怎么样呢?下一篇来详细了解不同网段下的通信过程。




作者:一天,公众号:网络之路博客(ID:NetworkBlog)。让你的网络之路不在孤单,一起学习,一起成长。

    推荐阅读