TCP/IP-PING包大小分析

  • A+
所属分类:逆向工程

在排查网络错误的过程中,PING是我们必不可少的排错手段,PING是基于ICMP协议,但你真的了解PING么?


列如:

    1.电脑PING一个包,抓包得到的数据包大小是多少字节,请求与回应的包结构是什么样的呢?

    2.如果使用指定PING包携带字节大小为1字节,那么抓包得到的数据包请求与回应大小又是多少呢?

今天在安全巡检时候,运维的一个同事问了上面这样的俩个问题,我给的答案是,最小的应该是64字节,一般PING包大小的话,我的看看ICMP占用多长字节才知道。

    也许观察仔细的同学知道,电脑一般PING包携带32字节,也就是这种:


TCP/IP-PING包大小分析

那么抓包所得到的字节大小呢?

    74字节,由以太网头部14个字节(源目MAC各6个字节,Type 2个字节)+IP包头20个字节+ICMP 40个字节(8个固定字节+32个data字节),回包也应是如此。

    根据RFC894文档指明,以太网封装IP数据包的最大长度是1500字节,也就是说以太网最大帧长应该是以太网首部加上1500,再加上7字节的前导同步码和1字节的帧开始定界符,具体就是:7字节前导同步码 + 1字节帧开始定界符 + 6字节的目的MAC + 6字节的源MAC + 2字节的帧类型 + 1500 + 4字节的FCS。也就是1526字节!

    但抓包却是这个数值呢?原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和出错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交给“设备驱动程序”做进一步处理。这时我们抓包的软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据,其最大值是6 + 6 + 2 + 1500 = 1514。


TCP/IP-PING包大小分析

那么如果PING指定字节的长度呢?比如PING带一个字节长度,数据包字节大小应该是以太网头部14个字节+IP报头20个字节+ICMP 9个字节,也就是43个字节,回包也亦是如此。等等,以太网传输最短字节不应该是64字节么?那么,会是在IP还是ICMP部分填充,直到达到64字节呢?(以下是在请求主机抓的报文)


TCP/IP-PING包大小分析

为什么PING包请求是43字节,回包却是60字节?

    这是由于以太网规定,以太网帧数据域部分最小为46字节,也就是以太网帧最小是 6 + 6 + 2 + 46 + 4 = 64。除去4个字节的FCS,因此,抓包时就是60字节。当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面填充以满足数据帧长不小于64 字节。由于填充数据是由MAC子层负责,也就是设备驱动程序。不同的抓包程序和设备驱动程序所处的优先层次可能不同,抓包程序的优先级可能比设备驱动程序更高,也就是说,我们的抓包程序可能在设备驱动程序还没有填充不到64字节帧的时候,已经捕获了数据。因此不同的抓包工具抓到的数据帧的大小可能不同。(比如以上这种情况,就是由于没有抓到设备驱动填充字段)

    现在,我们来看当前请求和回应报文详细情况。

请求报文:


TCP/IP-PING包大小分析

TCP/IP-PING包大小分析

回应报文:

TCP/IP-PING包大小分析

TCP/IP-PING包大小分析

也就是,在回应报文的以太网帧填充了数据,并且填充长度恰好为17字节(60回应报文 - 43请求报文)。刚刚好满足之前结论,14(以太网固定字节)+17(以太网填充字段)+20(IP包头)+9(8个ICMP固定头部+一个data字节)。

    若同时在回应主机上抓包,会发现数据包字节恰好反过来,也就是请求60字节,回应43字节。

   



作者:梦之深海
链接:https://www.jianshu.com/p/3ab6e31edba8


本文始发于微信公众号(LemonSec):TCP/IP-PING包大小分析

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: