IP和ICMP
实验目标
(1)分析IP头部
(2)分析IP头部变动(MAC地址每段改变,TTL改变,校验和)
(3)IP分片
(4)分析traceroute路由追踪
试验任务
1.使用ping命令,抓包分析IP报文格式。
2.使用更大的数据包ping,抓包分析IP数据包分片情况。
3.使用traceroute命令抓包分析路由追踪。
4.Ping不存在的网络,抓包并分析ICMP主机不可达的回复。
5.ICMP重定向。先配置一项默认路由,让R6收到R4dIP数据包。让R6收到的IP数据包的下一跳地址和发送者在同一个网段,让R6回复ICMP重定向的报文,让R4以后直接发给R5。
拓扑
参数:
R1:int f0/0 IP:132.0.23.1
R2: int f0/0 IP: 132.0.23.2, int f1/0 IP:132.1.23.2
R3: int f0/0 IP:132.1.23.1
拓扑(ICMP重定向):
R4: E0/0: 132.0.23.1
R5: E0/0: 132.0.23.2
R6: E0/0: 132.0.23.3
实验过程
- 1.根据实验参数配置每个接口的IP
网络号为132.0.23.0和132.1.23.0,其他接口配置过程IP同上。 - 2.配置环回口和三台路由器的OSPF
注意的是OSPF连接的不同的网络。
R1的路由表:
有直连的,有通过R2与其他网络学习来的。
查看R2的OSPF邻接表。
同样R3的邻居只有ID 为2.2.2.2的网络。
132.0.23.1 ping 132.1.23.1 - 分析报文
IP报文总长度100,头部5X4为20,ICMP报文长度为80.
两个头部只有TTL和校验和不同。标示位相同。版本号为4(0100),首部长度为5(0101),保留位、不允许分片、更多分片位都为0,未发生变化。TTL因为中间经过了一个路由器,所以减一。
一次ping过程不同的ICMP报文(标志位不同)
MAC地址发生变化。R1到R2间报文目的MAC成为R2到R3报文的源MAC地址。
通过每次ICMP报文发一个,查看IP报文。
可以看出三次ICMP的标志位不同,而且是递增加一。
分片
- 先查看接口MTU值,设计产生分片。
IP报文长度为100,所以可以先发一个长度为200的包,查看分片情况。
在传输ICMP request之前IP分了三片。
三个分片数据部分加起来为180.
三个报文的更多分片位。
三个报文的分片偏移字段。
如果ping长度为200的而且不分片(Don’t Fragment位 df-bit),发现会因超时而不能进行通信。
路由追踪
-
从R1追踪到3.3.3.3的路由。
-
分析报文
两条链路上UDP和ICMP报文数量不同,而且ICMP报文一是超时,而是端口不可达两种失败方式。
UDP报文TTL为1.而且使用了较大的端口。
- 尝试每次发送一个UDP报文。
这是对两台路由器进行的探测,两台路由器也都回复了ICMP报文,只是报文携带的信息不同。
两个ICMP报文类型不同
两个报文源IP不同,分别是两台路由器。
主机不可达
- 路由器收到IP数据包,但是本地没有到此数据包目的的路径时就会丢弃数据包并回复ICMP 主机不可达的信息。
- 开始ping 33.33.33.33,
显示失败,但是R1到R2间并没有抓到ICMP包。
加一条静态路由,送往R2的f0/0端口。
这时的debug有了回应。
抓包也抓到了ICMP报文。
其中132.0.23.2给132.0.23.1 返回了一个主机不可达的ICMP报文。
ICMP重定向
关闭R4的路由功能,在R4上先配置一个默认路由(相当于网关)R6的e0/0端口。这样R4通往R5的数据包就会先经过R6。
在R5上设置一个环回口3.3.3.3实现跨网段。
在R6上配置一条路由,即如果有通往3.3.3.0网络的包要转发到132.0.23.2端口(R5)。
Ping 3.3.3.3 ,出现ICMP重定向报文。提示通往3.3.3.3的网关是132.0.23.2。
实验分析
IP头部变化
- 通过132.0.23.1 ping 132.1.23.1过程中的ICMP报文头部可以得出,一次ping过程中会发出多个ICMP报文,这时每一个报文标志位不同,但是连续,通过R2路由器后的ICMP的TTL减一,因为跨了网段。其中校验和位也发生变化(因为数据包经过一个路由器都要重新计算一下首部检验和)因为TTL发送变化,所以校验和肯定会发生变化。但是头部中如版本号,长度,保留位等没有变化。
MAC地址变化:
- MAC地址是用来识别数据链路层中相连的结点。MAC地址每段链路都会改变,因为报文到达路由器之后,为了转发他,路由器会先除去二层的MAC信息,根据报文的IP地址查找路由表,找到这个IP转发路径之后要再次封装报文,而此时封装的时候用的源MAC就是转发端口的MAC地址,此时MAC地址就发送了变化,所以每次经过不同的链路MAC地址会改变。
就像这两个MAC地址,链路1上的目的IP成了转发链路2上报文的源MAC地址。
分片
- 如果数据包大小比MTU大,而且不分段标志位为0,表示可以分段。这次实验中设置的MTU为100.所为除去长度为20的头部大小,而且要是8的整数倍,所以这里可以是80.
前面两段是IP报文,最后一片是ICMP报文(More fragment=0),而且Data部分重组了所以分片,显示所有数据长度。最后一片之前的所有分片中More fragment位都是1.偏移量为 0 是第一片。
重组的时候按照相同的ID然后根据偏移量进行重组。
路由追踪
- 每次探测发送一个UDP报文。可以从抓包中看出R1一共发送了两个UDP报文,然后有两个ICMP回复报文,但是内容不同,一个是超时,一个是端口不可达。
过程:
1.从源地址发出一个UDP报文,TTL设置为1.
2.到达一个路由器,TTL - -。
3.TTL如果变为0而且不是目的地址,则此时路由器回复一个ICMP报文,包括IP包的源地址,内容和路由器的IP地址。
从抓包的内容可以看出,之前的UDP包封装在ICMP reply报文中返回到源地址。
4.源路由器收到这样reply报文,得到了路由信息。
5.再次发UDP探测包,TTL加1。(因为本拓扑中R1到R3只有一个路由器,所以UDP探测包发了两个就成功到达目的地址)。
6.目的地址收到UDP报文,而此时IP地址可以对应,但是UDP目的端口是33435,目的地址收到大于30000的目的端口返回一个ICMP reply报文,内容是端口不可达。
7.源路由器收到Port Unreachable的ICMP报文知道找到了目的地址,停止路由追踪。
R2与R3链路上UDP及ICMP报文少的原因是开始的UDP报文TTL到0了不能通过路由器R2。
主机不可达
- 开始的时候R1 ping R3,因为报文首先在R1中也会路由,但是R1中并没有到33.33.33.33的路由,所以R1找不到正确的路径就直接丢包,不会传出去,所以开始的时候并没有在R1与R2之间的链路上抓到ICMP报文。
给R1添加一条默认路由0.0.0.0 0.0.0.0,当有点数据包找不到路由信息就通过默认路由发到132.0.23.2.所以第二次再抓包发现了ICMP报文。
- 但是在数据包到了R2之后,R2也不知道怎么转发,所以丢包并且给R1回复一个ICMP reply报文,告诉他主机不可达。
对每个ICMP request报文,R2的132.0.23.2 端口都会回复一个reply报文,将ICMP request报文封装在返回的ICMP报文中,ICMP reply报文Type 为3.code 为1 (host unreachable)。
ICMP 重定向
- R1要和R3通信,但是开始的时候R1中先配置了一条路由,即要去3.3.3.0 网络要通过132.0.23.3的端口。R1 ping R3,开始的第一条ICMP报文到达R2后,R2根据开始配置的路由将数据包转发出去,这时发现这个收到数据包的接口和转发数据包的接口是一个,而且R2的下一跳还是和R3在同一个网络,所以这时R2会进行ICMP重定向,从抓到的重定向报文中可以看出有一个gateway address 字段,即告诉R1以后要去R3可以直接通过132.0.23.2,而不用通过R2进行转发。