目录服务器
@网络
我打算从一个ping命令的抓包结果来结合实际分析链路层和网络层的几个协议,先看一些无聊却重要的基础知识,封装过程图镇楼并发
咱们都知道网络是分层的,在链路层的封装主要是以太网封装,这里咱们直接给出格式tcp
这里也给出了IEEE 802的封装,下面的就是以太网封装,咱们看到以太网的封装会为网络层的其余协议提供服务,同时也看到ARP/RARP 和IP的地位是并列的。他们根据以太网头部的类型字段区分,以太网的源地址和目的地址是6字节的硬件地址也就是咱们常说的MAC地址,一个硬件由它来标识。能够看到除了14个字节的头部之外,数据段要求最小46个字节,因此会有填充的出现,后面的尾部是4个字节,即以太网数据帧一共最少有64字节(有时候会略去尾部直接是60字节)。测试
咱们虽然从ping命令开始,可是必须介绍一些基础知识,首先就是ip协议,上图就是ip协议的头部,最小是20字节。后面的抓包结果要结合这张图来看。目前几乎全部的互联网传输都使用的ip协议。命令行
首先介绍一下这些字段3d
ping程序是测试连通性用的,固然他还有其余功能,这个下面会说,首先咱们就用它的测试功能,至于ping的原理,咱们边抓包边看,这其中会涉及不少网络层的协议,咱们结合抓包讲解。代理
打开wireshark后,开启命令行的ping命令ping一个ip地址(这里我ping的是一个网段的地址10.134.220.102,我本机的地址是10.134.220.113),如何使用wireshark和如何查看本身的ip地址请自行百度。这里ping完成后code
收到这四个回复,咱们先无论这些,看看咱们抓包抓到了什么,这里我加了过滤器:blog
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命令的结果,是否是对起来了?
从上面的抓包结果咱们看到了两个协议,ARP与ICMP,这两个重要的协议咱们细细讲解,同时会结合抓包的内容一块看。
ARP是什么?ARP是一种地址解析协议。
ARP干吗用的?当咱们知道目的ip地址后,咱们觉得计算机知道了应该找哪台主机,可是计算机硬件一脸懵,在他那里只有硬件地址,ip地址是网路层的东西,要数据传输必须知道链路层的信息即硬件的地址,那么如何根据ip地址知道目的地址的硬件地址呢?答案就是使用ARP协议来查询,将ip地址转化为硬件地址。还有一种协议是RARP,他跟ARP反着,根据硬件地址查询ip地址,这种协议是无盘系统没法从本地知晓本身的ip地址,只能经过RARP协议从RARP服务器上查询本身的ip地址。因为我这里没有无盘机,因此抓包抓不到RARP协议的包,有须要的能够查资料详细理解。他们俩的报文格式仍是很像的。
ARP如何工做的?
ARP分为请求和应答,他的报文格式以下
还记得看以太网封装时说过的,ARP是跟IP并列的。这里详细介绍ARP的报文格式
对于以太网头部中的目的地址,在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是什么? 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请求那里),没有进行填充,这部分疑问尚未获得解决吗,但愿有人能够指导一下。