我们将研究 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 安装好之后,打开该软件:

wireshark监控client断开 wireshark time to live_网络


我们向www.baidu.com发送ICMP报文,

wireshark监控client断开 wireshark time to live_tcp/ip_02


等到count为 3的时候右键点击 Pause

wireshark监控client断开 wireshark time to live_网络_03


这就是一次完整的使用示例。

然后我们将WireShark启动再向www.baidu.com发送ICMP报文,在过滤器上输入 ICMP,表示我们只查看捕获的ICMP数据包。

wireshark监控client断开 wireshark time to live_wireshark_04

如图,我们发现,每一次的ICMP请求的TTL都加了1,和ICMP定义是一样的。第一个数据包的详细情况如下:

wireshark监控client断开 wireshark time to live_网络_05


可以看到,IP的总长度为56字节(Total Length) ,这是因为我们发送的ICMP包默认就是56个字节,现在去修改一下:

wireshark监控client断开 wireshark time to live_tcp/ip_06


wireshark监控client断开 wireshark time to live_tcp/ip_07


我们将这里的56字节改成 2000字节,再观察一下ICMP数据包的IP情况。

wireshark监控client断开 wireshark time to live_IP_08


可以看到,这里一个ICMP包就变成了两个IP数据报,一个负载了1480字节,一个负载500字节。这就是IP的分片机制。

为什么是1980而不是2000,这是因为我们发送的ICMP数据包本身就是 IP首部加负载数据,第一次的56个字节,一个IP分片能装得下所以就可以直接装,那时的总大小是56个字节,说明负载的数据是36个字节,所以这里也应该是 2000-20=1980字节的负载数据。