我们将研究 IP 协议,重点关注 IP 数据报(IP datagram)。我们将通过分析在执行 traceroute 程序发送和接收的一系列 IP 数据报的过程来完成这个实验
traceroute 通过 首先发送一个或多个带有生存时间(TTL: Time-to-Live)字段设置为 1 的数据报到目的地; 然后发送一个或多个带有生存时间(TTL: Time-to-Live)字段设置为 2 的数据报到同一个目的地; 然后发送一个或多个带有生存时间(TTL: Time-to-Live)字段设置为 3 的数据报到同一个目的地, 以此类推,直到目的地真正收到此数据报为止。 路由器必须将每个接收到的数据报中的 TTL 减 1。如果 TTL 达到 0,路由器会向来源主机发送 ICMP 消息。由于这种行为,TTL 为 1 的数据报(由执行 traceroute 的主机发送)将导致距发送方一次跳跃的路由器,将 ICMP TTL 超出的消息发送回发送方主机; 以TTL 为 2 发送的数据报将导致距离为两次跳跃的路由器,将 ICMP 消息发送回发送方主机; 以 TTL 为 3 发送的数据报将导致距离为两次跳跃的路由器,将 ICMP 消息发送回发送方主机,等等。 以这种方式,执行 traceroute 的主机可通过查看包含ICMP TTL 超出消息的数据报中的来源 IP 地址来获知其自身与目的地 X 之间的路由器的身份。
如果我们使用命令行的方式发送ICMP请求,我们将不能控制ICMP 消息的数据大小,那么就可以使用下面这个软件: pingplotter 安装好之后,打开该软件: 我们向www.baidu.com 发送ICMP报文, 等到count为 3的时候右键点击 Pause : 这就是一次完整的使用示例。
然后我们将WireShark启动再向www.baidu.com 发送ICMP报文,在过滤器上输入 ICMP,表示我们只查看捕获的ICMP数据包。
如图,我们发现,每一次的ICMP请求的TTL都加了1,和ICMP定义是一样的。第一个数据包的详细情况如下: 可以看到,IP的总长度为56字节(Total Length) ,这是因为我们发送的ICMP包默认就是56个字节,现在去修改一下: 我们将这里的56字节改成 2000字节,再观察一下ICMP数据包的IP情况。 可以看到,这里一个ICMP包就变成了两个IP数据报,一个负载了1480字节,一个负载500字节。这就是IP的分片机制。 为什么是1980而不是2000,这是因为我们发送的ICMP数据包本身就是 IP首部加负载数据,第一次的56个字节,一个IP分片能装得下所以就可以直接装,那时的总大小是56个字节,说明负载的数据是36个字节,所以这里也应该是 2000-20=1980字节的负载数据。
|