参考
Traceroute
为了生成一系列IP数据报,我们将使用traceroute程序向不同的目的地发送不同大小的数据报。traceroute首先发送一个或多个TTL=1的数据报。然后发送TTL=2的数据报,逐次增加,知道目的地收到该数据报为止。每经过一个路由器跳数减一,TTL=1的数据报发送距离为一次跳跃,TTL=2的数据报为两次跳跃。以这种方式,执行tracerout的主机可以通过查看包含ICMP TTL超出信息的数据报中的来源IP地址来获知其自身与目的之间的路由器的身份。
捕获执行Traceroute的数据报
traceroute -m 5 www.baidu.com,-m设置跳数5。
- 启动wireshark开始捕获数据报
traceroute -m 5 www.ustc.edu.cn使用默认包大小traceroute -m 5 www.ustc.edu.cn 2000包大小2000bytetraceroute -m 5 www.ustc.edu.cn 3500包大小3500byte
分析数据报
- 选择发送的第一个 ICMP Echo Request 消息,然后在 packet details window 中展开数据包的 Internet 协议部分。您的计算器的 IP 地址是多少?192.168.0.102
- 在 IP header 中,上层协议字段的值是多少?
这里用UDP发送的,协议字段17,上层协议字段1。这是因为traceroute请求是UDP报文,响应的ICMP报文。如果要用ICMP请求,使用tracert。
- IP header 有多少 bytes? IP datagram 的有效负载中有多少 bytes?
IP header 20 bytes,数据报一共有 56 bytes,因此有效负载中有 36 bytes。
- 此 IP 数据报是否已被分段(fragmented)? 没有,more fragements=0。
- 查看第一个 ICMP 及其所有后续 ICMP 消息。
在您的计算器发送的这一系列 ICMP 消息中,IP 数据报中的哪些字段一直改变?
- 哪些字段保持不变?哪个字段必须保持不变?哪些字段必须更改?所谓的保持不变指的是这次 traceroute 不会改变的,但是下一次 traceroute 可能就会改了。 必须保持不变:
- 版本(Version):占 4 bit,通信双方使用的版本必须一致,对于 IPv4 字段的值是4;
- 首部长度(Internet Header Length, IHL):占 4 bit,首部长度说明首部有多少 32 位字(4字节)。由于IPv4首部可能包含数目不定的选项,这个字段也用来确定数据的偏移量;
- 区分服务(Differentiated Services,DS):占 6 bit,只有在使用区分服务时,这个字段才起作用,在一般的情况下都不使用这个字段;
保持不变:
- 显式拥塞通告( Explicit Congestion Notification,ECN):允许在不丢弃报文的同时通知对方网络拥塞的发生。
- 全长(Total Length):占 16 位字段,定义了报文总长,包含首部和数据,单位为字节。这个字段的最小值是 20(0 字节数据),最大值是65535。
- 标识符(Identification):占16位,这个字段主要被用来唯一地标识一个报文的所有分片,因为分片不一定按序到达,所以在重组时需要知道分片所属的报文。
- 分片偏移 (Fragment Offset):这个13位字段指明了每个分片相对于原始报文开头的偏移量,以8字节作单位。
- 源地址:报文的发送端;
- 目的地址:报文的接收端;
- 选项:附加的首部字段可能跟在目的地址之后;
必须更改:
- 标识符(Identification):占 16 位,主要被用来唯一地标识一个报文的所有分片;
- 存活时间(Time To Live,TTL):占 8 位,避免报文在互联网中永远存在。实现为跳数计数器,报文经过的每个路由器都将此字段减1,当此字段等于0时,报文不再向下一跳传送并被丢弃,最大值是255。这是traceroute的核心原理;
- 首部检验和 (Header Checksum):占 16 位,检验和字段只对首部查错,在每一跳,路由器都要重新计算出的首部检验和并与此字段进行比对,如果不一致,此报文将会被丢弃;
- 数据
- 描述您在 IP datagram 的 Identification field 中的值中所看到的?
主要被用来唯一地标识一个报文的所有分片,因此对于不同的报文就需要改变这个值,使得报文可以唯一确定。
下一步查找第一跳路由器发送到您的计算器的一系列 ICMP TTL 超出的回复讯息。
- ID 字段和 TTL 字段的值是多少?
- 对于第一跳路由器发送到您的计算器的所有 ICMP TTL 超出的回复,这些值是否保持不变?为什么?
ID字段改变,TTL字段不变。
分片
- 将数据包大小更改为 2000 后,查找计算机发送的第一个 ICMP Echo Request 消息。该消息是否已碎片化为多个 IP 数据报?
- IP 数据报的第一个片段。 IP 头中的哪些信息表明数据报已碎片化? IP 头中的哪些信息表明这是第一个片段还是后一个片段? 这个 IP 数据报有多长?
- 找到碎片 IP 数据报的第二个片段。 IP 标头中的哪些信息表明这不是第一个数据报片段? 是否还有更多的片段?你是如何知道的?
- 在第一个和第二个片段中,IP 标头中哪些字段发生了变化?
接下来在将 pingplotter 中的数据包大小更改为 3500 后,找到计算机发送的第一个 ICMP Echo Request 消息。
- 从原始数据报创建了多少个片段?
\