IPv4协议与ICMPv4协议实验报告
文章目录
IPv4协议
一、观察分析IPv4分组各个字段
1.版本、首部长度
首先我们需要构造一个IPv4的数据包,我们直接使用ping命令去给百度发包,并用wireshark捕获这些收发数据包:
显示过滤器选择:icmp。
可以看到我们刚好捕获到了4个reply和4个request的数据包,与我们在cmd中发送和接收到的数据包数量一致。
分析数据包的 ip头 部分:
Version:4 (版本为IPv4)
Header Length:5 (ip头部长为5*4=20 bytes)
2.tracert结果下的TTL
首先在cmd中使用tracert命令:
然后观察wireshark:
可以发现由本机(ip为192.168.43.40)向百度依次发送了
3个TTL==1的request包
3个TTL==2的request包
3个TTL==3的request包
…
而每一个RTT值都对应了从各个路由器发来的TTL exceeded响应包。
由此可见,tracert跟踪的实现方式就是向目标ip依次发送TTL==1、2、3…的请求包,这样一来,路径上的每一个路由器都会收到一个TTL==0的包,于是每个路由器都需要返回一个TTL exceeded的数据包,也就是ICMP type==11的包,这样一来,本机就可以得到路径上所有路由器的ip地址。
3.协议
分析IPv4协议的结构:
由图可见,这个IP数据包的头部长度为20个字节,我们对其进行分析:
第1字节(45):分别为版本和头部长度,4代表版本为IPv4,5代表头部长度为5*4=20 Bytes
第2字节(00):服务类型,00代表普通
第3,4字节(003c):数据包总长度,0x3c = 60 Bytes
第5,6字节(7e8f):标识,确定分段属于哪个数据包,这个分段的标识为0x7e8f
第7,8字节(0000):前3位为flag,标识数据包是否分段,是否还有更多分段。剩下13位为偏移,表示这个分段在数据包中的位置
第9字节(80):TTL=0x80=128
第10字节(01):协议。
0x01:ICMP
0x06:TCP
0x11:UDP
第11,12字节(0000):头部校验和,检测头部是否有数据错误
第13~16字节(c0a82b28):源ip地址,192.168.43.40
第17~20字节(279c420a):目标ip地址,39.156.66.10
4.ping -f 下的DF值
ping 的 -f 参数表示在数据包中设置 “不分段” 标记
我们用wireshark捕获这个数据包:
可以看到 flag 字段被设为了010,这个1表示 DF=1,即 Don’t fragment,不分组
5.不同分组的标识
为了构造出有分组的数据包,我们使用 ping -l 3600 baidu.com
向百度发一个长度为3600的数据包,由于MTU限制为1500,所以这个数据包会被分组传输
可以看到,一个数据包被分成了3个分组,我们分别查看第一个数据包的前两个分组与第二个数据包的前两个分组,以此来分析不同分组的标识字段。
可以观察到,来自同一个数据包的不同分组,他们的标识是一样的,也就是为了标记他们来自于同一个分组,后续新宿机接受到后就可以根据这些标识,把同一个数据包的不同分组组合起来。
二、观察IPv4数据报分片与重组
1.每个分片的标识标志片偏移
这一个IP数据包分片的标识为0x681c ,表示这个分片是属于哪一个数据报的。
标志为 001,即MF=1,表示后面还有更多的分片
偏移为 0,表示这个分片是该数据包的第一个分片
2.分片后的总长度
可以看到,每一个数据包有三个分片,长度分别为 1514, 1514, 682。
由于每一个分片都有各自的以太网头(14 Bytes),ip头(20 Bytes),再加上第一个分片还包含一个ICMP头(8 Bytes)
加上 3600 Bytes 的数据,一共是: 14*3+20*3+8+3600 = 3710
刚好等于 1514+1514+682 = 3710
3.分片载荷规律
根据前面的分析,我们发现分片的载荷规律为,先以网络允许通过的最大限度长度截取前面的分片,最后剩下的数据长度作为最后一个分片来进行封装
ICMPv4协议
1.观察ICMPv4目标目标不可达消息
我们使用 tracert baidu.com
命令,就得到了 Destination unreachable 的ICMP包,顺便也得到了 Time-to-live exceeded 包,如图:
让我们观察目标不可达的ICMP数据包:
可以看到这个ICMP头中:Type==3,Code==3
意思是端口不可达
还可以观察到,这个数据包的内容部分,还有一个IPv4的头部,以及8个字节的数据内容,这刚好对应了我们课程中学习到的,一个差错IP数据报所对应的ICMP差错报告数据包的结构。
2.观察ICMPv4超时消息
前面我们已经构造出了超时包,下面我们直接进行观察:
可以看到,这个ICMP头的 Type==11,表示响应超时
后面跟的内容是超时的请求ip数据报,还可以看到它的ip头和ICMP头信息,数据部分是全0
3.观察ICMPv4回显请求及应答消息
通过 ping baidu.com
来构造ICMP请求和应答数据包
这是一个请求数据包,可以看到 Type==8
这是一个应答数据包,Type==0
全0
3.观察ICMPv4回显请求及应答消息
通过 ping baidu.com
来构造ICMP请求和应答数据包
这是一个请求数据包,可以看到 Type==8
这是一个应答数据包,Type==0