TCP\IP协议实践:wireshark抓包分析之链路层与网络层

TCP\IP协议实践:wireshark抓包分析之链路层与网络层

@

从ping开始

我打算从一个ping命令的抓包结果来结合实际分析链路层和网络层的几个协议,先看一些无聊却重要的基础知识,封装过程图镇楼

在这里插入图片描述

链路层之以太网封装

我们都知道网络是分层的,在链路层的封装主要是以太网封装,这里我们直接给出格式

在这里插入图片描述

这里也给出了IEEE 802的封装,下面的就是以太网封装,我们看到以太网的封装会为网络层的其他协议提供服务,同时也看到ARP/RARP 和IP的地位是并列的。他们根据以太网头部的类型字段区分,以太网的源地址和目的地址是6字节的硬件地址也就是我们常说的MAC地址,一个硬件由它来标识。可以看到除了14个字节的头部以外,数据段要求最小46个字节,所以会有填充的出现,后面的尾部是4个字节,即以太网数据帧一共最少有64字节(有时候会略去尾部直接是60字节)。

ip首部

在这里插入图片描述

我们虽然从ping命令开始,但是必须介绍一些基础知识,首先就是ip协议,上图就是ip协议的头部,最小是20字节。后面的抓包结果要结合这张图来看。目前几乎所有的互联网传输都使用的ip协议。

首先介绍一下这些字段

  • 4位版本代表是ipv4还是ipv6。即4或6 。
  • 4位首部长度代表ip首部占多少个32位(4字节)。为啥会有这个字段?因为我们看到ip首部里面是可以有选项字段的,不固定长度(选项字段一直都是以32 bit作为界限,必要时填充0,保证ip首部始终是32bit整数倍),所以要有个数据表示有多少字节是属于ip头部。
  • 8位的服务类型TOS字段见下图

在这里插入图片描述

  • 16位的总长度表示ip数据报的长度(字节为单位),为了从填充过的以太网帧中准确的找出ip数据报。
  • 标识字段唯一地标识主机发送的每一份数据报。后面的偏移字段和这里的标识字段都是为了后面的ip分片和重组用的。
  • T T L(t i m e - t o - l i v e)生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。T T L的初始值由源主机设置(通常为3 2或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送I C M P报文通知源主机。
  • 8位协议是1表示为ICMP协议, 2表示为IGMP协议, 6表示为TCP协议, 17表示为UDP协议
  • 首部检验和字段是根据I P首部计算的检验和码。它不对首部后面的数据进行计算。I C M P、I G M P、U D P和T C P在它们各自的首部中均含有同时覆盖首部和数据检验和码。
  • 地址字段
  • 选项字段后面会说

开启ping程序,开始抓包

ping程序是测试连通性用的,当然他还有其他功能,这个下面会说,首先我们就用它的测试功能,至于ping的原理,我们边抓包边看,这其中会涉及很多网络层的协议,我们结合抓包讲解。

打开wireshark后,开启命令行的ping命令ping一个ip地址(这里我ping的是一个网段的地址10.134.220.102,我本机的地址是10.134.220.113),如何使用wireshark和如何查看自己的ip地址请自行百度。这里ping完成后

在这里插入图片描述

收到这四个回复,我们先不管这些,看看我们抓包抓到了什么,这里我加了过滤器:

ip.dst == 10.134.220.102 or ip.src == 10.134.220.102 or arp

抓包结果

在这里插入图片描述

我们可以看看发生了什么,第一行不是这次ping产生的,从第二行看,首先是ARP协议的数据,内容是后面的看起来是询问的内容,然后下一行还是ARP的协议,看起来是回答。我们注意到第一列是时间,第二列是源地址,6字节的,第三列是目的地址,也是6字节的。这两个地址就是上面以太网封装头部中的那两个硬件地址。我们看到有的目的地址是广播,广播地址是全1的6字节。这个可以详细的看包里的内容。我们先不管这些协议是什么,就是看看发生了啥。接续看,有四组连续的(忽略中间那个ARP)ICMP协议的报文,而且是一问一答形式的,想想我们的ping命令的结果,是不是对起来了?

由一个ping的结果引出来的两个协议ARP ICMP

从上面的抓包结果我们看到了两个协议,ARP与ICMP,这两个重要的协议我们细细讲解,同时会结合抓包的内容一块看。

ARP:地址解析协议

原理

ARP是什么?ARP是一种地址解析协议。

ARP干嘛用的?当我们知道目的ip地址后,我们以为计算机知道了应该找哪台主机,但是计算机硬件一脸懵,在他那里只有硬件地址,ip地址是网路层的东西,要数据传输必须知道链路层的信息即硬件的地址,那么如何根据ip地址知道目的地址的硬件地址呢?答案就是使用ARP协议来查询,将ip地址转化为硬件地址。还有一种协议是RARP,他跟ARP反着,根据硬件地址查询ip地址,这种协议是无盘系统无法从本地知晓自己的ip地址,只能通过RARP协议从RARP服务器上查询自己的ip地址。由于我这里没有无盘机,所以抓包抓不到RARP协议的包,有需要的可以查资料详细理解。他们俩的报文格式还是很像的。

ARP如何工作的?

ARP分为请求和应答,他的报文格式如下

在这里插入图片描述

还记得看以太网封装时说过的,ARP是跟IP并列的。这里详细介绍ARP的报文格式

  • 2字节的硬件类型,1代表以太网地址。
  • 2字节的协议类型表示要映射的协议地址类型,我们大部分用的就是ip协议,所以这里一般是0x800。
  • 1字节的协议地址长度。我们都知道ipv4协议是4字节的。
  • 1字节的硬件地址长度。以太网的硬件地址是6字节。
  • op字段是操作字段,代表四种操作类型,它们是ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4)。
  • 发送端的以太网地址(硬件地址),发送的ip地址,接收端的硬件地址和ip地址。这里会有疑问,在ARP请求中,不是ARP请求的就是目的端的硬件地址吗,这时如何填写目的端的硬件地址呢?答案是ARP请求中的目的硬件地址全为0 。

对于以太网头部中的目的地址,在ARP请求报文中,是无法知道的(因为本身就是去查询的),那么如何填呢?或者说ARP如何起作用呢?当然是把所有的主机全问一遍呗。所以这里就填成全1表示广播地址,这样整个以太网上的所有主机都能收到ARP请求,然后看看是不是自己被翻了牌子,如果是,就发回一个ARP应答告知自己的硬件地址。整个过程可以参考下图

在这里插入图片描述

这是在同一个以太网的情况下。如果不在同一个以太网下,又如何呢?如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托A R P或A R P代理(Proxy ARP)。这样可以欺骗发起ARP请求的发送端,使它误以为路由器就是目的主机,而事实上目的主机是在路由器的“另一边”。路由器的功能相当于目的主机的代理,把分组从其他主机转发给它。这方面这篇文章里暂时没有,后续会有一个专门的文章介绍。

如果目的主机不存在呢?那就隔一段时间问一次,多问几次都没答复就不问了,哈哈哈。

抓包结果

好,接下来回到抓包结果,我们说开头的是两个ARP协议,了解了原理后我们知道他们其实就是一个ARP请求和ARP应答

这是我的ARP请求报文

在这里插入图片描述

逐字节解析,前6字节就是全1的广播以太网地址,然后是6字节的发送端以太网地址。然后0806代表是ARP协议。0001代表的以太网,0800代表ip协议,06的硬件地址长度,04的协议地址长度,0001的op字段代表ARP请求,然后就是发送端的硬件地址和ip地址,然后就是我们前面说的全0的目的硬件地址,然后是目的ip。

同样的应答报文就不解析了,就是对着格式来。

ICMP:Internet控制报文协议

ICMP是什么? ICMP是Internet控制报文协议,对,就是控制报文协议,发送控制报文的,啥叫控制报文?看下去就知道了。必须知道ICMP是封装在IP数据报里面的。在IP头部的8位协议字段中规定的,1就代表ICMP。

ICMP干嘛用的? 很有用,用途广泛,哈哈哈。

ICMP如何用?

看格式

在这里插入图片描述

8位的类型,8位的代码都在上面那张很长的图中。由于太多,就不介绍详细的了,就介绍我们ping命令用到的即ICMP回显应答报文。

在这里插入图片描述

U n i x系统在实现p i n g程序时是把I C M P报文中的标识符字段置成发送进程的I D号。这样即使在同一台主机上同时运行了多个p i n g程序实例, p i n g程序也可以识别出返回的信息。序列号从0开始,每发送一次新的回显请求就加1。p i n g程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复。I P是一种最好的数据报传递服务,因此这三个条件都有可能发生。

抓包结果

以我本机发送的ICMP回显请求报文为例:

在这里插入图片描述

前面的14个字节以太网首部就不解析了,现在从第一行的45开始

回顾ip首部,4代表ipv4 , 5代表ip首部占5个四字节即20字节,说明没有选项字段。后面两个00代表的TOS字段,大家到网上一查,不对啊,00代表很多服务啊,怎么区分啊?其实现在大多数实现都不实用TOS段了,所以就不用管这个字段了。

进入第二行,003c是总长度,整个ip数据报有60个字节,说明数据部分有40个字节,我们数一下,整个报文74个字节,除去14字节以太网首部,20字节的ip首部,剩下的40字节就是数据部分(没有计算以太网尾部)。

4347是标识,0000是偏移量,这个没啥好说的。80是TTL生存时间,01是代表的ICMP报文。2996是校验和。然后是源ip地址0a 86 dc 71, 是不是就是10.134.220.113 。目的地址是0a 86 dc 66 。后面我选中的蓝色部分就是真正的ICMP回显请求报文的内容了, 08 00 与我们说的代码是一样的,0101校验和,后面的就不说了。

总结

这篇文章从一个ping命令入手,讲述了两个很重要的协议ARP协议和ICMP协议,结合实际抓包的结果,分析了报文内容,但是这里还是有疑问,比如,我们说以太网帧除去尾部最少60字节,但是实际抓包时有的就只有42字节(比如我的ARP请求那里),没有进行填充,这部分疑问还没有得到解决吗,希望有人可以指导一下。

posted @ 2019-06-22 14:49  bobxxxl  阅读(2518)  评论(0编辑  收藏  举报