10-ICMP数据报文格式

1. ICMP数据报文格式

icmp数据报文的格式如图1所示:

这里写图片描述
图1-icmp数据报文格式

类型(type):占用了8 bit位,前面我们说,是ICMP报文类型,用于标识错误类型的差错报文或者查询类型的报告报文。

代码(code):占用了8 bit位,根据ICMP差错报文的类型,进一步分析错误的原因,代码值不同对应的错误也不同,例如:类型为11且代码为0,表示数据传输过程中超时了,超时的具体原因是TTL值为0,数据报被丢弃。

校验和(checksum):占用了16 bit位,数据发送到目的地后需要对ICMP数据报文做一个校验,用于检查数据报文是否有错误。

标识符(Identifier):占用了16 bit位,对于每一个发送的数据报进行标识

序列号(Sequence number):占用了16 bit位,对于发送的每一个数据报文进行编号,比如:发送的第一个数据报序列号为1,第二个序列号为2。

数据(Data):要发送的ICMP数据。


以icmp请求报文为例,我们来看一下icmp请求报文的封装格式:

10-ICMP数据报文格式_第1张图片
图2-icmp请求报文的封装格式

Internet Control Message Protocol
    Type: 8 (Echo (ping) request)          // ICMP类型为8,说明这是一个ICMP请求查询报文 
    Code: 0                           //表示是请求
    Checksum: 0xf7e9 [correct]           //校验和
    [Checksum Status: Good]             //校验和状态,good表示校验和正确,bad表示数据报被修改或者发生错误
    Identifier (BE): 1 (0x0001)             //标识,用于区分在linux下抓包,基本上抓的每一个ICMP包都是1
    Identifier (LE): 256 (0x0100)           //标识,用于区分在windows下抓包,基本上抓的每一个ICMP包都是256
    Sequence number (BE): 21 (0x0015)    //序列号,用于区分在linux下抓包,每一个ICMP包的序列号都不一样
    Sequence number (LE): 5376 (0x1500)  //序列号,用于区分在windows下抓包,每一个ICMP包的序列号都不一样
    [No response seen]               
    Data (64 bytes)                    //数据部分

  这是我们刚才通过ping命令抓的ICMP协议包,其中request是ICMP请求数据报,reply是ICMP回答数据报,另外request和reply是一组ICMP请求回答数据报
10-ICMP数据报文格式_第2张图片

我们再针对一组ICMP请求回答数据报分析两个ICMP数据报是否为一组。

10-ICMP数据报文格式_第3张图片
图3-icmp的request和reply

   在图3中,左侧是ICMP请求,右侧是ICMP回答,我们在分析的时候发现,这两个ICMP数据报的序列号都是一样的,说明了这两个ICMP数据报就是一组的。而不同组的ICMP数据报的序列号也是不同的,由此可知,通过判断两个ICMP报文的序列号就可以知道是否为一组。

  下面我们来看一下,我们在用ping命令发送的ping包携带的是什么数据。

10-ICMP数据报文格式_第4张图片
图4-icmp数据部分

  其中Data就是刚才ping命令所发送的ICMP数据报文里的数据部分,这些数据是ping命令发送的测试内容,左侧部分是以十六进制表示,右侧部分就是我们所发送的数据部分,这些数据长度正好是32字节,一个字母代表一个字节。


2. ICMP报文通用格式

这里写图片描述
图5-icmp报文通用格式

  前面我们说过ICMP数据报文种类有ICMP差错报文和ICMP查询报文,这些报文的格式除了类型,代码,校验和这些字段是一样的,但是不同的ICMP数据报文的类型,代码等字段也是不一样的,而上面的图5是ICMP数据报文的通用格式。

你可能感兴趣的:(tcp/ip协议修炼心法)