[Wireshark Lab v8.1] Lab 翻译与解题.
以下实验步骤均来自实验指导手册。
实验指导手册下载地址:Jim Kurose Homepage (umass.edu)
Lab IP
在这个lab中, 我们将深入久具盛名的IP协议, 聚焦IPv4和IPv6数据报. 分为3部分, 在第一部分中, 我们将分析由traceroute
程序发送和接收的IPv4追踪报文(traceroute
程序本身将在ICMP lab中更进一步被说明), 将在第二部分学习IP分片的知识, 最终在第三阶段简要展示IPv6的内容.
在开始之前, 你可能需要回顾书中第1.4.3节和关于RfC2151的第3.4节, 来更新你对traceroute
程序对操作认识. 你还可能需要阅读书本第4.3节和RFC791的内容来对IP协议进行了解. 当回答阶段2 IP分片时, 你大概率需要回顾下相关的材料. 尽管我们在书的第8版删除了IP分片的话题, 还是可以在第7版或更早的版本查阅. [RFC8200]是关于IPv6的完整RFC, 但本lab不需要完全阅读这个内容, 可以查阅书中4.3.4节关于IPv6的内容.
在 traceroute 的执行中抓包
在本次实验的前两个章节, 为了获取IPv4数据报的trace, 我们将使用traceroute
程序, 来发送两个不同大小的数据报到 gaia.cs.umass.edu. 回忆traceroute
程序通过将首先将一个或多个数据报中IP头的存活时间TTL(Time To Live)设置为1来发送, 然后发送TTL为2, 为3, 等等的包到目的主机. 回忆, 路由器必须将每个收到的数据报的TTL字段减一(事实上RFC791中的规定是至少减一). 当TTL归零时, 路由器返回一个ICMP消息(类型为11-TTL-exceed)给源主机. 根据这个行为,traceroute
就能在通往目的主机的第一跳,第二跳,第三跳以及后续路由中获取返回的ICMP报文, 程序通过解析ICMP TTL-exceeded 消息中的IP地址, 从而得到它到目的主机之间所有路由的地址.
让我们运行traceroute
程序, 使它发出两种不同大小的数据报. 更大一点的数据报将会导致traceroute
消息被分片, 通过多个IPv4数据报传输.
- Linux/MacOS. 使用 Linux/MacOS
traceroute
命令,可以通过指示数据报中的字节数来明确设置发送到最终目的地的 UDP 数据报的大小; 此值在目标名称或地址之后立即输入到traceroute
命令行中。 例如,要向 gaia.cs.umass.edu 发送 2000 字节的traceroute
数据报,命令将是:$traceroute gaia.cs.umass.edu 2000
- Windows. Windows 提供的tracert 程序不允许更改tracert 发送的ICMP 消息的大小。 因此,不可能使用 Windows 机器生成大到足以强制 IP 分段的 ICMP 消息。 但是,您可以使用 tracert 生成小的、固定长度的数据包来执行本实验的第 1 部分。 在 DOS 命令提示符下输入:
>tracert gaia.cs.umass.edu
如果你需要继续实验的第二部分, 可以选择下载使用在作者主机抓到的trace文件.
进行如下操作:
- 启动Wireshark, 开始抓包
- 输入两次
traceroute
命令, 目的地是 gaia.cs.umass.edu, 第一个包长度设置为56字节, 在命令执行完成后, 输入第二次traceroute
, 目的地不变, 长度设置为3000字节 - 停止抓包
如果无法正常抓包可以使用trace文件中的ip-wireshark-trace1-1.pcapng
.
1: 基本IPv4.
你的trace中, 应该能看到由traceroute
命令通过主机发送的一系列UDP段(MacOS/Linux)或者ICMP回声请求消息(Windows), 和由中间路由返回给主机的 ICMP TTL-exceeded 消息. 在下列的问题中, 我们假设你使用 MacOS/Linux 操作系统, 针对 Windows 机器的对应问题应该也是清晰的. 你的屏幕输出应与下图类似, 我们使用了udp||icmp
过滤(亮绿字段的过滤区域), 因此只有UDP和ICMP报文会被显示.
回答下列问题:
- 选择由主机通过
traceroute
命令向 gaia.cs.umass.edu 发送的第一个UDP段(提示: 在ip-wireshark-trace1-1.pcapng
文件中的包#44), 在报文详细内容窗口打开 Internet Protocol 协议部分. 你电脑的IP地址是? - 在这个IPv4数据报头中, TTL字段的值是多少?
- 在这个IPv4数据报头中, 上层协议字段的值是多少?(注意: Linux/Macos与Windows的答案可能不同)
- IP头的大小是多少字节?
- IP数据报文中的负载长度是多少? 解释你是如何确定负载长度的.
- 这个IP数据包被分段了么? 解释如何判断数据包是否被分段.
接下来, 查看由traceroute
命令从主机发送的目的是 128.119.245.12 的UDP段sequence
. 你可以在过滤中使用 "ip.src192.168.86.61 and ip.dst128.119.245.12 and udp and !icmp". 这允许你轻易的顺序移动只包含这些段段数据包. 你的屏幕截图应如下图所示.
- 在你电脑通过
traceroute
向128.119.245.12发出的一系列UDP段中, IP数据包中的那个字段总是在不同的数据包中改变? 为什么? - 这一系列的IP数据包(包含着UDP段)中那些字段保持不变? 为什么?
- 描述主机发出的IP数据包的Identification字段的模式.
现在让我们查看由中间路由接收到的TTL为0的包而返回给主机的ICMP报文. 你可以使用“ip.dst==192.168.86.61 and icmp”来过滤.
- 由路由返回的IPv4数据报报头中, 上层协议字段的值是多少?(注意: Linux/Macos与Windows的答案可能不同)
- Identification 字段的值(在所有路由器的ICMP包序列)是否与之前问题9的答案有着相同的行为?
- 在所有路由器的ICMP包序列中的TTL字段相似么?
2: 分片
在这个章节中, 我们通过traceroute
发送一个大(3000字节)UDP段, 导致多IP数据报分片. 我们建议你首先查看在书中IP分片的材料
清空显示过滤, 点击Time
行, 以时间为关键字, 对第一部分的包列表排序,
- 找到
traceroute
包长度为3000时, 以主机发送到 gaia.cs.umass.edu 的traceroute
程序, 包含了发出的到128.119.245.12
包的第一部分的IP数据报. (提示: 在 ip-wireshark-trace1-1.pcapng teace文件中是 #179, #179-#181时第一个3000字节的UDP段的分片后IP数据报) 数据报是否分片被不同IP数据报承载?(提示: 是) - IP头中什么信息表明了数据报被分段了.
- IP头中什么信息表明了该包是第一个分片而不是后续的分片.
- 这个IP数据报中有多少字节(头部加载荷)
- 现在查看UDP段中被分片后的第二个段, IP头中包含了什么信息说明它不是第一个数据报份片?
- 在两个分片之间IP头中那个字段被改变了?
- 现在查看UDP段中被分片后的第二个段, IP头中包含了什么信息说明它是最后一个数据报份片?
3: IPv6
在最后一章中, 我们将对IPv6数据报进行概览, 可能需要回顾书中4.3.4节的内容. 由于互联网的主流还是IPv4网络, 且ISP可能还没有支持IPv6, 因此我们直接使用抓好的包含IPv6包的trace. 这个trace是通过浏览器访问 youtube.com 得到的, Youtube(google) 已经做出了良好的IPv6支持.
打开ip-wireshark-trace2-1.pcapng
, Wireshark软件应该显示类似图中的内容.
让我们详细观察于3.814489发送的#20报文, 这是一个DNS请求(被IPv6数据报承载), 它发送个IPv6 DNS服务器来查找 youtube.com 的 IPv6 地址. DNS AAAA 请求标识解析地址格式为IPv6.
回答下列问题
- 发出DNS AAAA请求的 IPv6地址是什么? 这是这个trace文件中#20包的源地址. 以Wireshark完全相同的格式给出这个数据报的IPv6源地址.
- 数据报的IPv6目的地址是什么? 给出格式应与Wireshark相同.
- 数据报的flow label值是多少?
- 数据报携带了多少负载数据?
- 这个数据报的有效载荷将在目的地传递到什么上层协议?
最后, 找到DNS AAAA请求的IPv6 DNS响应, 包含了 youtube.com 的 IPv6地址.
- 针对这个AAAA请求, 响应中有多少IPv6地址?
- DNS 返回的第一个 youtube.com 的IPv6地址是什么(在ip-wireshark-trace2-1.pcapng文件中, 这也是地址按数值排序最小的)? 以Wireshark相同的缩写格式给出.
解答:
首先来看下IP数据报头的格式
|4位版本号|4位首部长度|8位区分服务|16位总长度|
|16位标识号|3位标志|13位片偏移|
|8位TTL|8位上层协议|16位首部校验|
|32位源地址|
|32位目的地址|
|可变部分与首部填充|
-
本地IP地址为 192.168.124.8
-
TTL=1
-
traceroute使用的是UDP, 因此上层协议字段是 UPD(17)
-
没有可变部分, 固定长度20字节
-
载荷长度32, 总长度减去IP头的长度
-
没有分片,标识部分控制了分片逻辑
-
UDP包中, TTL每三个增长一次, Identification顺序增长, Identification相同的报文表示同一报文的拷贝或不同分片, 因此需要增长来区分.
-
除TTL, Identification和校验和都保持不变
-
Identification顺序增长
-
在返回的IP数据报中, 协议字段是 ICMP(1)
-
Identification 字段的值无法确定, 假如对连续三条请求作出响应的是同一个路由器, 则 Identification 字段顺序增长, 否则无法保证其关系.
-
TTL也跟作出响应的路由器有关
-
被分片
-
MF标识与段内偏移结合可以看出是否被分片
- MF不为0, 偏移为0: 第一个分片
- MF不为0, 偏移不为0: 中间分片
- MF为0, 偏移不为0: 最后一个分片
- 前两个长度为1500(MTU), 最后一个为40.
IPv6数据头与IPv4并不兼容
|4位版本号|8位通信分类|20位流标记|16位负载长度|8位下一个头部|8位跳数限制|
|64位源IP地址|
|64位目的IP地址|
- 源地址 2601:193:8302:4620:215c:f5ae:8b40:a27a
- 目的地址 2001:558:feed::1
- 流标签用来区分在一个主机内不同应用的流量, (流标签, 源地址, 目的地址) 就唯一可以标识一条应用流量
- 载荷长度 37
- 上层协议通过 下一个头部 字段查询 UDP(17)