Lab 01
目标
学习数据包中如何表示协议和分层。它们是课本第 1.3 节和第 1.4 节中涉及的构建网络的关键概念(指的是top-down那本书)。在做实验前,请先复习这两节内容。
要求
- Wireshark: 本实验使用 Wireshark 软件工具捕获和检查数据包跟踪。数据包跟踪是网络上某个位置的流量记录,就像对通过特定线路的所有比特进行快照一样。数据包跟踪记录了每个数据包的时间戳,以及组成数据包的比特(从低层报头到高层内容)。Wireshark 可在大多数操作系统上运行,包括 Windows、Mac 和 Linux。它提供了一个图形用户界面,显示数据包的顺序以及被解释为协议标头和数据的比特的含义。它根据数据包的类型对数据包进行颜色编码,并提供多种过滤和分析数据包的方法,让你可以研究网络协议的行为。Wireshark 广泛用于排除网络故障。如果计算机上尚未安装,可从 www.wireshark.org 下载。我们强烈建议您观看网站上的 5 分钟视频短片 “Wireshark 简介”。
- wget / curl: 本实验室使用 wget(Linux 和 Windows)和 curl(Mac)获取网络资源。与获取和执行整个网页的网页浏览器不同,wget 和 curl 可让你精确控制获取的 URL 和获取的时间。在 Linux 下,可以通过软件包管理器安装 wget。在Windows下,wget以二进制形式提供;请在http://www.gnu.org/software/wget/ 上查找下载信息。在 Mac 下,curl 会随操作系统一起安装。两者都有很多选项(请尝试使用 “wget –help” 或 “curl –help” 查看),但只需使用 “wget URL ”或 “curl URL ”就能获取URL。
步骤 1:捕获跟踪
按以下步骤捕获网络流量跟踪;也可以使用提供的跟踪。我们希望跟踪数据包的协议结构。从你选择的服务器到你的计算机(即客户端)的一个简单的 URL 网络获取将作为流量。
-
选择一个 URL,用 wget 或 curl 获取。例如,“
wget http://www.baidu.com/”或 “curl h http://www.baidu.com/”。 这将获取资源并将其写入文件(wget)或屏幕(curl)。您要检查的是获取是否成功,并检索到一些内容。下面是 wget 的一个成功示例(添加了高亮显示)。 您需要一个状态代码为 “200 OK”的单一响应。如果获取失败,请尝试不同的 URL;如果没有 URL 能正常工作,请调试 wget/curl 的使用或网络连接。
- 关闭不必要的浏览器标签页和窗口。通过减少浏览器活动,可以阻止计算机获取不必要的网页内容,并避免跟踪中的偶然流量。
- 启动 Wireshark 并使用 “
tcp.port == 80”过滤器开始捕获,并选中 “启用网络名称解析”。 该过滤器将只记录标准网络流量,而不记录计算机可能发送的其他类型数据包。检查将把发送和接收数据包的计算机地址转换为名称,这将有助于您识别数据包是发送到您的计算机还是来自您的计算机。除了高亮显示外,您的捕获窗口应该与下图类似。选择要捕获的接口,即计算机用于连接互联网的主要有线或无线接口。如果不确定,可以猜测,如果捕获不成功,稍后再重新检查这一步。取消选中 “以混杂模式捕获数据包”。这种模式对于窃听广播网络中其他电脑发送/接收的数据包非常有用。我们只想记录向/从你的电脑发送的数据包。其他选项保持默认值。 捕获过滤器(如果存在)用于防止捕获计算机可能发送或接收的其他流量。在 Wireshark 1.8 中,捕获过滤器框直接出现在选项屏幕上,但在 Wireshark 1.9 中,您可以通过双击界面来设置捕获过滤器。 - 开始捕获后,重复上述使用 wget/curl 获取网页的操作。这一次,Wireshark 将在传输内容时记录数据包。
- 获取成功后,返回 Wireshark 并使用菜单或按钮停止跟踪。如果成功,Wireshark 上部窗口将显示多个数据包,而且很可能已满。捕获的数据包数量取决于网页的大小,但跟踪中应至少有 8 个数据包,一般为 20-100 个,其中许多数据包将显示为绿色。下面是一个示例。恭喜您,您已经捕获了一条跟踪信息!

步骤 2:检查跟踪
Wireshark 会让我们选择一个数据包(从顶部面板)并查看其协议层,包括报头字段(在中间面板)和组成数据包的字节(在底部面板)。在上图中,第一个数据包被选中(蓝色显示)。 请注意,我们在此使用的 “数据包 ”是一个通用术语。严格来说,链路层的信息单位称为帧。在网络层称为数据包,在传输层称为段,在应用层称为消息。 Wireshark 正在收集帧,并向我们展示它所能识别的帧内所承载的高层数据包、段和消息结构。 为方便起见,我们通常使用 “数据包”,因为每个帧都包含一个数据包,而我们感兴趣的往往是数据包或更高层的细节。
选择一个协议列为 “HTTP”、信息列显示为 GET 的数据包。它是携带从您的计算机向服务器发送的网络 (HTTP) 请求的数据包。(您可以点击列标题按该值排序,不过通过检查找到 HTTP 数据包应该不难)。让我们仔细看看数据包结构是如何反映正在使用的协议的。
由于我们正在获取网页,因此我们知道所使用的协议层如下所示。也就是说,HTTP 是用于获取 URL 的应用层网络协议。与许多互联网应用程序一样,它运行在 TCP/IP 传输层和网络层协议之上。链路层和物理层协议取决于你的网络,但如果你的电脑是有线网络,通常会以以太网(如图所示)的形式组合在一起;如果你的电脑是无线网络,则会以 802.11(未显示)的形式组合在一起。

选中 HTTP GET 数据包后,仔细观察它与我们接下来描述的协议栈之间的异同。中间面板列出了协议块。您可以展开每个块(点击 “箭头”展开器或图标),查看其详细信息。
- 第一个 Wireshark 块是 “帧”。这不是协议,而是描述数据包整体信息的记录,包括捕获时间和长度。
- 第二个块是 “以太网(Ethernet)”。这与我们的图表相符! 请注意,您可能在使用 802.11 的计算机上进行了跟踪,但看到的仍然是以太网块,而不是 802.11 块。为什么会这样?这是因为我们在捕获选项中要求 Wireshark 以以太网格式捕获流量,因此它将真实的 802.11 报头转换成了伪以太网报头。
- 然后是 IP、TCP 和 HTTP,这正是我们想要的。请注意,顺序是从协议栈的底部向上。这是因为当数据包在协议栈中向下传递时,低层协议的报头信息会添加到高层协议的信息前面,如图 1-15 所示。也就是说,在数据包的 “线上”,低层协议是排在前面的。

现在再找一个 HTTP 数据包,即服务器给你电脑的响应,看看这个数据包的结构与 HTTP GET 数据包有什么不同。这个数据包的信息字段应该是 “200 OK”,表示获取成功。在我们的跟踪中,详细面板上有两个额外块,如下图所示。
- 第一个额外块显示“
[11 个重新组装的 TCP 网段......](4 reassembled TCP segments …)”。捕获的详细信息会有所不同,但这个块描述的内容比数据包本身要多。最有可能的情况是,网络响应是以一系列数据包的形式通过网络发送的,这些数据包在到达计算机后被组合在一起。标有 HTTP 的数据包是网络响应中的最后一个数据包,该数据块列出了连接在一起以获得完整网络响应的数据包。 每个数据包都显示为 TCP 协议,尽管这些数据包携带了 HTTP 响应的一部分。只有最后一个数据包才显示为具有 HTTP 协议,因为完整的 HTTP 信息是可以理解的,而且它还列出了连接在一起的数据包,以形成 HTTP 响应。 - 第二个额外块显示 “
基于行的文本数据.....(Line-based text data)”。捕获的细节会有所不同,但这个块描述的是获取的网页内容。在我们的例子中,它的类型是 text/html,但也可能是 text/xml、image/jpeg 或许多其他类型。与帧记录一样,这不是一个真正的协议。相反,它是 Wireshark 为帮助我们理解网络流量而生成的数据包内容描述。
步骤 3:数据包结构
为了显示你对数据包结构的理解,请绘制一个 HTTP GET 数据包的图形,显示 TCP、IP 和以太网协议头的位置和字节大小。您的图形可以简单地将整个数据包显示为一个细长的矩形。最左边的元素是最先发送的。在这幅图上,显示以太网报头的范围以及 IP 传递给以太网在网络上发送的以太网有效载荷。要显示协议层的嵌套结构,请注意 IP 报头和 IP 有效负载的范围。在查看每个协议的字段时,您可能会有疑问。我们将在今后的实验中详细探讨这些协议和字段。
要计算大小,请注意,当您点击中间面板中的协议块(协议块本身,而不是 “+”扩展器)时,Wireshark 会在下部面板中高亮显示数据包中与之对应的字节,并在窗口底部显示长度。例如,在我们的跟踪中点击数据包的 IP 版本 4 头,就会显示长度为 20 字节。(如果是 IPv6,跟踪结果会有所不同,即使是 IPv4,也可能因各种选项不同而不同)。您也可以使用长度列或帧详细信息块中显示的整个数据包大小。
步骤 4:协议开销
估算下载协议开销,即协议开销占下载字节的百分比。为此,应将 HTTP 数据(报头和信息)视为网络传输的有用数据,而将下层报头(TCP、IP 和以太网)视为开销。我们希望这种开销很小,以便大部分比特用于传输应用程序关心的内容。要解决这个问题,首先要查看单个网络获取的下载方向上的数据包。您可以对 “目的地 ”列进行排序来查找这些数据包。这些数据包应该以一个简短的 TCP 数据包开始,它被描述为 SYN ACK,是连接的开始。随后,中间大部分是较长的数据包(大约 1 至 1.5KB),其中最后一个是 HTTP 数据包。这是下载的主要部分。最后可能会有一个短 TCP 数据包作为结束连接的部分。对于每个数据包,你都可以检查它有多少以太网/IP/TCP 报头形式的开销,以及它在 TCP 有效负载中携带了多少有用的 HTTP 数据。您还可以在 Wireshark 中查看 HTTP 数据包,了解所有下载数据包的 TCP 有效载荷中有多少数据。
投入: 您对上述下载协议开销的估计。告诉我们您是否认为这种开销很大。
步骤 5:解复用密钥
当以太网帧到达计算机时,以太网层必须将其中包含的数据包交给下一层处理。找到正确的上一层来处理接收到的数据包的行为称为解复用。我们知道,在我们的例子中,上一层是 IP。但以太网协议是如何知道这一点的呢?毕竟,高层完全可以是另一种协议(如 ARP)。我们在 IP 层也遇到了同样的问题–IP 必须能够确定 IP 报文的内容是 TCP 数据包,以便将其交给 TCP 协议处理。答案是,协议使用报头中被称为 “解复用密钥 ”的信息来确定上一层。 详细查看下载数据包的以太网报头和 IP 报头,回答下列问题:
- 哪个以太网报头字段是解复用密钥,它能告知下一层是 IP?该字段中使用什么值来表示 “IP”?
- 哪个 IP 报头字段是解复用关键字,用于指示下一层是 TCP?该字段用什么值表示 “TCP”?
上交: 上交上述问题的答案。
自行探索
我们鼓励您在完成本实验后探索协议和分层。一些想法:
- 查看一个没有携带高层数据的 TCP 短数据包。这个数据包的目的地是什么实体?毕竟,如果它不携带任何上层数据,那么对于 HTTP 等上层协议来说似乎并没有什么用处!
- 在经典的分层模型中,来自上层的一条信息会被下层附加一个报头,成为一条新的信息。但情况并非总是如此。在上文中,我们看到了一条跟踪记录,其中网络响应(一条由 HTTP 报文头和 HTTP 有效载荷组成的 HTTP 报文)被转换成了多条下层报文(即多个 TCP 数据包)。 想象一下,您为携带网络响应的第一个和最后一个 TCP 数据包绘制了数据包结构图(如步骤 2 所示)。 绘制的结果有何不同?
- 在上文所述的经典分层模型中,下层会在上层传递下来的报文中附加报文头。如果下层增加了加密功能,这种模式会有什么变化?
- 在上文描述的经典分层模型中,下层对从上层传递下来的信息附加报头。如果下层增加压缩功能,这种模式会有什么变化?
Lab 02 以太网
目标
探索以太网帧的细节。以太网是一种常用的链路层协议。在做此实验前,请先复习以太网。
要求
Wireshark: 本实验使用 Wireshark 软件工具捕获和检查数据包跟踪。 ping: ping 是一种标准的命令行工具,用于检查另一台计算机是否有响应。它广泛用于网络故障排除,并预装在 Window、Linux 和 Mac 上。ping 有多种选项,只需发出 “ping www.bnu.edu.cn ”命令,计算机就会向远程计算机(此处为 www.bing.com)发送少量 ICMP ping 请求,每次请求都会得到 ICMP ping 响应。 上交 上交捕获的跟踪文件和练习报告,包括对问题的回答和绘制的图表。
步骤 1:捕获跟踪
-
选择一个远程网络服务器或其他可公开访问的互联网主机,使用 ping 发送一些 ping 信息,并检查它是否发送了回复。例如,“
ping www.bnu.edu.cn”。你应该会看到几个回复,表明 ping 到达了远程主机并被返回。
- 启动 Wireshark 并开始捕获以太网帧,过滤 “icmp”,确保选中 “启用 MAC 名称解析”。后者将翻译以太网 (MAC) 地址以提供供应商信息。同时检查链路层报头类型下拉菜单是否显示 “以太网”。
- 开始捕获后,重复上面的 ping 命令。这一次,数据包也将被 Wireshark 记录下来。
- 完成 ping 命令后,返回 Wireshark 并使用菜单或按钮停止跟踪。现在您应该有一个类似下图所示的简短跟踪。
步骤 2:检查跟踪
选择跟踪中的任意数据包(在顶部面板),查看其结构细节(在中间面板)和组成数据包的字节(在底部面板)。现在我们可以检查数据包的详细信息。
在中间面板中,展开以太网报头字段(使用 “+”展开器或图标)以查看其详细信息。我们感兴趣的是以太网报头,您可以忽略高层协议(本例中为 IP 和 ICMP)。您可以点击以太网报头,查看底部面板中突出显示的数据包中与之对应的字节。
步骤 3:以太网帧结构
为了显示你对以太网帧格式的理解,请绘制一张显示以太网报文头字段的位置和大小(以字节为单位)的 ping 报文图。你的图可以简单地将帧显示为一个细长的矩形。最左边的字段在数据包中排在最前面,并首先在线路上发送。在该图中,显示以太网报头和以太网有效载荷的范围。在末尾添加一个虚线框,表示 4 字节校验和;即使 Wireshark 不显示该字段,我们也知道它存在。
步骤 4:以太网地址的范围
每个以太网帧都带有一个源地址和目标地址。其中一个地址就是你的计算机地址。它是发送帧的源地址,也是接收帧的目标地址。但另一个地址是什么呢?假设你 ping 的是远程互联网服务器,那么它就不可能是远程服务器的以太网地址,因为以太网帧只能在一个局域网内传送。取而代之的是路由器或默认网关的以太网地址。这是连接局域网和互联网其他部分的设备。与此相反,每个数据包的 IP 块中的 IP 地址确实指示了整个源端和目的端点。它们分别是您的计算机和远程服务器。
画一个图,显示你的计算机、路由器和远程服务器的相对位置。用以太网地址标注计算机和路由器。用 IP 地址标注计算机和远程服务器。显示以太网和互联网其他部分在图中的位置。
步骤 5:广播帧
您在上面收集的跟踪记录了在特定源和目标(如您的计算机到路由器)之间发送的单播以太网流量。也可以发送组播或广播以太网流量,分别发送给一组计算机或以太网上的所有计算机。我们可以从地址中看出是单播、组播还是广播。广播流量发送到所有位都设置为 “1 ”的保留以太网地址。组播流量被发送到第一个比特位为 “1 ”的地址;广播是组播的一种特殊情况。广播和组播流量广泛用于发现协议,例如,发送给每个人的数据包,目的是找到本地打印机。
使用 “ether multicast ”过滤器开始捕获广播和组播以太网帧,最多等待 30 秒以记录背景流量,然后停止捕获。如果使用该过滤器捕获不到任何数据包,请使用我们提供的跟踪功能。在大多数以太网中,计算机会不断交换信息以维持网络状态,因此我们会尽量在不运行任何其他程序的情况下捕获流量。使用 “ether multicast ”捕获过滤器可以捕获组播和广播以太网帧,但不能捕获普通单播帧。捕获这些数据包可能需要等待一段时间,但在大多数有多台计算机的局域网中,至少每隔几秒钟就能看到一个数据包。
检查捕获的组播和广播数据包,查看源地址和目标地址的详细信息。最有可能的是广播以太网地址,因为广播帧往往比组播帧更常见。查看广播帧,了解以太网用于广播的地址。展开广播或组播帧的以太网地址字段,查看设置了哪一个位来区分广播/组播或群组流量与单播流量。
回答下列问题:
-
按照 Wireshark 显示的标准格式,广播以太网地址是什么?
-
以太网地址的哪一位用于确定是单播还是组播/广播?
Lab 03 ARP
目标
了解ARP(地址解析协议)是如何工作的。ARP是一种重要的协议,用来连接以太网和IP协议。请在进行实验前先复习相关内容。
要求
- Wireshark:使用Wireshark软件工具来捕获和检查数据包跟踪。
- arp:使用“arp”命令行工具检查和清除计算机上ARP协议使用的缓存。该工具在Windows、Linux和Mac操作系统上均有安装,但命令参数不同。清除缓存需要管理员权限。
- ifconfig / ipconfig:使用“ipconfig”(Windows)或“ifconfig”(Mac/Linux)命令行工具检查计算机网络接口的状态。该工具也在操作系统中自带。
- route / netstat:使用“route”或“netstat”命令行工具检查计算机使用的路由。关键路由是通过默认网关访问互联网远程部分的默认路由(或到前缀0.0.0.0的路由)。这些命令在不同操作系统上有不同的参数。
- 浏览器:使用网页浏览器查找或获取页面作为工作负载。任何浏览器都可以使用。
提交内容
提交捕获到的跟踪文件以及实验报告,包括问题的答案和绘制的图形。
第1步:捕获跟踪
- 使用
ifconfig/ipconfig命令找到计算机主网络接口的以太网地址。在Windows上,使用命令行输入“ipconfig /all”。在Mac/Linux上,使用命令行输入“ifconfig”。找到以太网地址用于后续分析。 - 使用
netstat或route命令找到本地路由器或默认网关的IP地址。命令示例:“netstat -r”(Windows、Mac、Linux),或使用“route print”(Windows)、“route”(Linux)或“route -n get default”(Mac)。 - 启动Wireshark并设置捕获过滤器为“arp”。选择连接互联网的主要有线或无线接口进行捕获,取消勾选“混杂模式下捕获数据包”。
- 清除ARP缓存中的默认网关条目,使用“
arp –a”命令检查ARP缓存并使用适当命令清除缓存。此操作需要管理员权限。 - 清除ARP缓存后,使用浏览器访问远程页面,触发ARP请求并让Wireshark捕获这些ARP数据包。
- 捕获ARP流量后停止捕获,保存跟踪文件并记录你的以太网地址和默认网关的IP地址。
第2步:检查抓包数据
现在我们可以查看一次ARP交换了!由于你的抓包文件中可能包含许多ARP数据包,我们首先将视图缩小为仅显示从你的计算机发送或接收的ARP数据包。
设置一个显示过滤器,过滤出与你计算机以太网地址相关的数据包。你可以在Wireshark窗口顶部的“Filter:”框中输入一个表达式,然后点击“Apply”按钮。过滤器的表达式取决于你的以太网地址。例如,如果你的以太网地址是 01:02:03:04:05:06,则输入过滤表达式为“eth.addr==01:02:03:04:05:06”。应用过滤器后,你的抓包数据应类似于下图,我们扩展了ARP协议的详细信息。
找到并选择一个发往默认网关的ARP请求,查看其字段。ARP数据包有两种类型:请求和应答,我们将依次查看这两种类型。请求的数据包的“Info”行会以“Who has …”开头,你需要寻找一个请求默认网关MAC地址的数据包,例如“Who has xx.xx.xx.xx …”,其中xx.xx.xx.xx是你的默认网关。你可以点击ARP协议块的加号图标来查看详细字段。
接下来,选择一个ARP应答包并查看其字段。应答包将响应请求,且其“Info”行的格式为“xx.xx.xx.xx is at yy:yy:yy:yy:yy:yy”。
第3步:ARP请求与应答
为了展示你对ARP交换的理解,绘制一张图,展示计算机与默认网关之间的ARP请求和应答数据包。以我们分析的情况为例,绘制你计算机对默认网关发出ARP请求的过程。标记一个包为请求,另一个为应答。给出每个包的发送方和目标的MAC地址及IP地址;你可以使用Wireshark检查数据包来获取这些值。最后,圈出图中所查找的以太网地址,显示它在交换中来自哪个部分。
第4步:ARP在以太网中的细节
检查ARP请求和应答,回答以下问题:
- 请求和应答的操作码分别是什么?
- ARP请求和应答的头部大小是多少?
- 请求中目标MAC地址的值是什么?
ARP数据包封装在以太网帧中,以太网头字段的值被专门设置以支持ARP。例如,你可能会疑惑ARP请求包是如何传递到目标计算机,使其可以回复并告知请求者它的MAC地址。答案是,ARP请求通常在以太网层进行广播,因此它会被局域网中所有计算机接收,包括目标计算机。具体来看,ARP请求的目标以太网地址被设置为广播地址 ff:ff:ff:ff:ff
这样目标计算机会接收到请求并识别它是此消息的预定接收者;其他接收到请求的计算机知道消息不是发给它们的,只有目标计算机会发送应答。然而,任何接收到ARP包的设备都可以从中学到映射关系:发送方的MAC地址和IP地址对。
- 表示ARP是高层协议的以太网类型值是什么?
- ARP应答是否像ARP请求一样广播?
自行探索
我们鼓励你在完成本次实验后继续自行探索ARP。建议你查看抓包文件中其他可能记录的ARP数据包;我们只分析了你计算机的ARP请求和默认网关的ARP应答。
要查看是否有其他ARP活动,确保清除之前设置的任何以太网地址过滤器。其他ARP数据包可能会展现以下行为,供你进一步探索:
- 其他计算机广播的ARP请求:局域网中的其他计算机也会使用ARP。由于请求是广播发送的,你的计算机会接收到它们的请求。
- 你的计算机发送的ARP应答:如果另一台计算机对你计算机的IP地址发出ARP请求,你的计算机会发送ARP应答告知它答案。
- 任意ARP(Gratuitous ARP):你计算机发出与自己相关的ARP请求或应答。这有助于在计算机或网络连接启动时确保没有其他设备使用相同的IP地址。任意ARP的发送者和目标IP地址是相同的,在Wireshark中可以通过Info字段标识出来。
- 其他主机的ARP请求与应答:在清空ARP缓存后,你的计算机可能还需要对其他主机进行ARP请求,而不仅仅是默认网关。
Lab 04 IPv4
目标
学习互联网协议(IP)的细节。IP是整个互联网使用的网络层协议。我们将重点研究广泛部署的IP版本4(IPv4),因为它几乎在所有地方使用,而IP版本6(IPv6)仅部分部署。请在实验前复习相关内容。
要求
- Wireshark:本实验使用Wireshark软件工具来捕获和分析数据包跟踪。
- wget / curl:实验使用wget(Linux和Windows)和curl(Mac)来获取网页资源。wget和curl是命令行程序,允许你精确控制获取哪个URL以及何时获取。与浏览器不同,它们只获取指定的资源。Linux用户可以通过包管理器安装wget;Windows用户可以在http://www.gnu.org/software/wget/下载wget的二进制文件;Mac自带curl。使用方法:执行“wget URL”或“curl URL”。
- traceroute / tracert:本实验使用“traceroute”来查找从你的计算机到远程互联网主机的路由器级路径。traceroute是标准的命令行工具,用于发现计算机使用的互联网路径,广泛用于网络故障排除。在Windows和Mac上预装了该工具,Linux用户可通过包管理器安装。在Windows上,该工具名为“tracert”。执行“
traceroute www.bnu.edu.cn”命令将打印从你的计算机到远程主机的路径。
提交内容
提交捕获的跟踪文件以及实验报告,包含问题的答案和绘制的图形。
第1步:捕获跟踪
- 选择一个远程服务器的URL,并使用wget或curl检查是否能成功获取内容,例如“
wget http://www.bnu.edu.cn/”或“curl http://www.bnu.edu.cn/”。wget会将资源写入文件,而curl则将其输出到屏幕。使用wget时,你应看到状态码“200 OK”的响应。如果获取失败,尝试使用其他URL;注意,有些简化的URL可能需要浏览器处理,例如http://mit.edu实际上是http://web.mit.edu/index.html。如果没有URL有效,请检查你的wget/curl使用情况或网络连接。 - 使用traceroute命令对同一远程服务器执行路径追踪,以检查网络路径信息。在Windows上,输入“
tracert www.bnu.edu.cn”;在Linux/Mac上,输入“traceroute www.bnu.edu.cn”。如果你使用Linux/Mac且处于NAT后方(例如大多数家庭用户或虚拟机用户),使用“–I”选项发送ICMP探测包(例如“traceroute –I www.bnu.edu.cn”),因为ICMP探测包比UDP探测包更容易通过NAT设备。保存traceroute的输出结果,你将需要它进行后续步骤。 - 启动Wireshark并开始捕获,设置过滤器为“tcp port 80”。确保勾选“启用网络名称解析”。我们使用此过滤器仅记录标准的Web流量。名称解析会将发送和接收数据包的计算机IP地址转换为名称,这有助于你识别数据包是否来自或发往你的计算机。你的捕获窗口应与下图类似,除了我们标注的部分。选择计算机用于连接互联网的主要有线或无线接口进行捕获。如果不确定,可以先猜测并在捕获不成功时返回此步骤重新选择。取消勾选“在混杂模式下捕获数据包”。此模式用于监听广播网络上其他计算机的收发数据包。我们只希望记录与你的计算机相关的包。其他选项保持默认值。如果Wireshark有捕获过滤器,它用于防止捕获计算机可能发送或接收的其他流量。在Wireshark 1.8版本中,捕获过滤器框直接显示在选项屏幕上,而在Wireshark 1.9中,你需要通过双击接口来设置捕获过滤器。
- 捕获开始后,重复之前的wget/curl命令。这次数据包也会被Wireshark记录下来。
命令执行完毕后,回到Wireshark并停止捕获。现在你应该有一个简短的跟踪文件,类似于下图所示,并且还有你之前运行的traceroute输出结果。
第2步:检查跟踪
选择跟踪中的任意数据包,展开IP头字段(使用“+”号图标)查看详细信息。你可以简单地点击顶部面板中的一个数据包进行选择。中间面板会显示其结构的详细信息,底部面板则显示构成该数据包的字节内容。我们感兴趣的是IP头部,其他高层和低层协议可以忽略。当你点击IP头部的某个部分时,底部面板会高亮显示与该部分对应的字节。我们在下图中已展开IP头部,并点击了所有IP头部字段。
第3步:IP数据包结构
为了展示你对IP协议的理解,绘制一张你研究过的IP数据包的图。图中应显示IP头部字段的位置及其字节大小,这些字段可以通过Wireshark观察到。由于不易确定子字节大小,可以将相同字节内的IP字段分组。你的图可以简单地将帧显示为一个细长的矩形。尽量不要参考课本中的IPv4数据包图,之后再检查并研究可能存在的不同之处。
通过查看你抓取的IP数据包,回答以下问题:
- 你计算机和远程服务器的IP地址是什么?
- 总长度(Total Length)字段是包括IP头部和IP负载,还是仅包括IP负载?
- 标识(Identification)字段在不同数据包中是如何变化的?例如,在TCP连接的所有数据包中该字段的值是否相同,还是每个包的值不同?它在两个方向上是否相同?如果值发生变化,是否能看到某种模式?
- 你计算机发送的数据包中,TTL(生存时间)字段的初始值是多少?是最大可能值,还是一个较小的值?
- 如何从数据包中判断它没有被分片?在正常操作中,IP数据包通常不会被分片,但接收方必须有办法确认。
- IP头部的长度是多少?该长度是如何在头部长度字段中编码的?提示:注意只有4位用于此字段,因为版本号占用了字节的其他4位。你可以通过尝试和查阅资料来确认。
第4步:互联网路径
IP数据包中的源IP地址和目的IP地址标识了互联网路径的终点,而不是数据包从源到目的所经过的网络路径上的IP路由器。traceroute是一种用于发现这些路径的工具。它通过引发响应(ICMP TTL超时消息)来工作,首先从距离源1跳的路由器发起响应,然后是距离源2跳的路由器,依此类推,直到到达目的地。响应消息会标识路由器的IP地址。traceroute的输出通常每跳打印一行信息,包括测量的往返时间(RTT)、路由器的IP地址和DNS名称。DNS名称有助于了解路由器所属的组织。由于traceroute依赖于常见的路由器实现,它不能保证所有路径上的路由器都有效,通常你会看到部分路径上的“*”响应。
根据traceroute的输出,绘制一张网络路径的示意图。左侧为你的计算机,右侧为远程服务器,均标注IP地址,绘制它们之间路径上所有路由器的跳数编号。你可以通过查看捕获的数据包找到你计算机和远程服务器的IP地址,traceroute的输出会告诉你每个路由器的跳数。
为了完成你的图,请标注路径中各个路由器所属的真实世界组织的名称。为此,你需要解释traceroute给出的路由器的域名。如果不确定,可以根据你认为该路由器所属的组织来标注。如果某个路由器没有域名(或IP地址),可以忽略或留空。
Lab 05 ICMP
目标
了解ICMP(互联网控制消息协议)的使用。ICMP是IP协议的辅助协议,通过处理各种错误和测试情况来帮助IP执行其功能。请在实验前复习相关内容。
要求
- Wireshark:本实验使用Wireshark软件工具来捕获和检查数据包跟踪。
- traceroute / tracert:本实验使用“traceroute”工具来查找从你的计算机到远程互联网主机的路由路径。
traceroute是一个标准的命令行工具,广泛用于网络故障排除。它在Windows和Mac上预装,Linux用户可以通过包管理器安装。在Windows上,该工具名为“tracert”。执行命令“traceroute www.bnu.edu.cn”将打印从你计算机到远程主机(例如www.bnu.edu.cn)的路径。 - ping:本实验使用“ping”命令发送和接收消息。
ping是一个标准命令行工具,用于检查另一台计算机是否响应。它广泛用于网络故障排除,预装在Windows、Linux和Mac上。简单地执行“ping www.bnu.edu.cn”命令会让你的计算机发送少量ICMP ping请求到远程主机,每个请求应该都会收到ICMP ping响应。
提交内容
提交你捕获的跟踪文件以及实验报告,包含问题的答案和你绘制的图形。
第1步:捕获跟踪
- 选择一个远程的Web服务器或其他可以公开访问的互联网主机,使用
ping发送一些ping消息,并检查其是否回复。例如,执行“ping www.bnu.edu.cn”。你应该能看到多个回复,表明ping请求到达了远程主机并得到了返回。 - 对同一个远程服务器执行 traceroute 以检查你是否能获取网络路径的信息。在 Windows 上输入,例如,“
tracert www.bnu.edu.cn”。在 Linux / Mac 上输入,例如,“traceroute www.bnu.edu.cn”。如果你使用的是Linux / Mac 并且处于 NAT 后面(如大多数家庭用户或虚拟机用户),请使用 –I 选项(这是一个大写的 i)进行 traceroute,例如,“traceroute –I [www.bnu.edu.cn”。这将使traceroute 发送 ICMP 探测包,而不是通常的 UDP 探测包;ICMP 探测包更容易穿越 NAT 设备。成功的示例如下所示;保存输出,因为你需要在后续步骤中使用它。注意,traceroute 可能需要一分钟的时间来运行。每一行显示了从运行 traceroute 的计算机到目标目的地的下一个 IP 跳数的信息。带有“_”的行表示网络未响应,无法识别互联网路径的该段。一些无法识别的段是可以预期的。然而,如果 traceroute 无法正常工作,则几乎所有的路径都会是“_”。在这种情况下,尝试不同的远程服务器,尝试不同的 traceroute 配置。 - 启动 Wireshark 并开始使用“icmp”过滤器进行捕获。确保勾选“启用网络名称解析”。这将把发送数据包的计算机和路由器的 IP 地址转换为名称,这有助于你识别数据包经过的网络路径上的组织。你的捕获窗口应该与下图类似,只是没有高亮显示。选择从中捕获的接口作为计算机连接到互联网的主要有线或无线接口。如果不确定,请猜测,如果捕获不成功,可以稍后重新访问此步骤。取消勾选“以混杂模式捕获数据包”。此模式对于监听广播网络中其他计算机发送的包很有用。我们只想记录发送到/从你的计算机发送的数据包。将其他选项保持为默认值。如果有捕获过滤器,则用于防止捕获计算机可能发送或接收的其他流量。在 Wireshark 1.8 中,捕获过滤器框直接出现在选项屏幕上,但在 Wireshark 1.9 中,你需要通过双击接口来设置捕获过滤器。
- 当捕获开始时,重复你测试过的 ping 命令,等待几秒钟,然后再重复 traceroute 命令。这次,Wireshark 将记录这两个程序发送和接收的 ICMP 数据包。
- 命令完成后,返回 Wireshark,使用菜单或按钮停止跟踪。你应该有一个类似于下图所示的简短跟踪。我们已经扩展了我们视图中的 ping 请求包的 ICMP 头部的详细信息。确保保存 ping 和 traceroute 命令的输出。你将在后续步骤中需要这些输出。
步骤 2:回显(ping)数据包
通过选择跟踪开始处的一个回显(ping)请求和响应数据包开始你的探索。 展开 ICMP 块(使用“+”展开器或图标)以查看 ICMP 头部和负载的详细信息。 回答以下问题以展示你对 ICMP 回显消息的理解:
- ICMP 回显请求和回显响应数据包的 Type/Code 值分别是多少?
- 回显请求和相应的回显响应的数据包中的 Identifier 和 Sequence Number 有何不同?
- 连续的回显请求数据包中的 Identifier 和 Sequence Number 有何不同?
- 回显响应中的数据是否与回显请求中的数据相同或不同?
步骤 3:TTL 超限(traceroute)数据包
接下来,通过选择跟踪中的任何 Time Exceeded ICMP 数据包来探索 traceroute 流量。展开 ICMP 块(使用“+”展开器或图标)以查看 ICMP 头部和负载的详细信息。 绘制一个 ICMP TTL 超限数据包的图示,以确保你理解其嵌套结构。在你的图示中,显示 IP 头部、ICMP 头部及其 Type/Code 和校验和子字段的字节位置和大小,以及 ICMP 负载。在 ICMP 负载中,再绘制一个矩形,展示负载内容的整体结构。像往常一样,你的图示可以简单地显示为一个长而细的矩形。
要计算大小,可以观察到当你在中间面板中点击一个协议块(点击块本身,而不是“+”展开器)时,Wireshark 会在下方面板中突出显示该块对应的数据包字节,并在窗口底部显示长度。
回答以下问题:
- ICMP TTL 超时数据包的 Type/Code 值是多少?
- 请说明接收方如果事先不知道期望接收到的 ICMP 消息类型,如何安全地找到并处理所有 ICMP 字段。你可能已经注意到,不同的 ICMP 消息可能有不同的格式。例如,回显(Echo)消息有序列号(Sequence)和标识符(Identifier)字段,而 TTL 超时消息则没有这些字段。
- TTL 超时数据包的 ICMP 头部有多长?在 Wireshark 中选择头部的不同部分,查看它们如何对应到数据包中的字节。
- ICMP 负载包含一个 IP 头部。这个头部中的 TTL 值是多少?解释为什么它是这个值。猜测一下,在查看之前你觉得它会是多少!
步骤 4:互联网路径
IP 数据包中的源 IP 地址和目的地 IP 地址表示互联网路径的端点,而不是数据包从源到目的地的网络路径上的 IP 路由器。traceroute 是一个用于发现这一路径的工具。它的工作原理是从源向目的地逐步探测每一个跳数的路由器。它首先从源出发,向距离源 1 跳的路由器请求响应,然后是距离源 2 跳的路由器,依此类推,直到到达目的地。响应将标识路由器的 IP 地址。traceroute 的输出通常会每行打印一个跳数的信息,包括测量的往返时间、路由器的 IP 地址和 DNS 名称。DNS 名称有助于确定路由器所属的组织。由于 traceroute 利用常见的路由器实现,因此不能保证它对路径上的所有路由器都有效,通常在某些路径部分失败时会看到“*”响应。
查看 traceroute 部分的跟踪,其中会有一系列 ICMP 回显请求数据包,后跟 ICMP TTL 超限数据包。回显请求从源(你的计算机)发送到正在探测的目的地。TTL 超限数据包则来自路径上的路由器,返回到你的计算机,由 TTL 字段倒计时至零触发。
通过查看数据包的详细信息,回答以下问题:
- 你的计算机(源)如何通过 TTL 超限数据包了解路径上某个路由器的 IP 地址?说明 IP 地址在这个数据包中的位置。你可以通过查看回显数据包来查看源和目的地 IP 地址。路径上的路由器将具有不同的 IP 地址,这些地址将出现在 TTL 超限数据包中。如果不确定,可以检查 traceroute 的文本输出,查看路由器的 IP 地址,并在 TTL 超限数据包上查找这些地址。
- traceroute 对路径上的每个路由器进行探测多少次?查看 TTL 超限响应,看看是否能发现模式。
- 你的计算机(源)如何构造一个回显请求数据包,以找到(通过引发 TTL 超限响应)距离目的地 N 跳的路由器?描述回显请求数据包的关键属性。traceroute 发送的回显请求数据包逐步探测路径上距离更远的路由器。你可以查看这些数据包,了解它们如何在从不同路由器获取响应时有所不同。
使用 traceroute 输出,绘制网络路径的图示。显示你的计算机(左侧)和远程服务器(右侧),两者都有 IP 地址,以及它们之间路径上的路由器,按从路径开始的跳数编号。你可以在你捕获的数据包中找到你的计算机和远程服务器的 IP 地址。traceroute 的输出会告诉你每个路由器的跳数。
完成绘图后,标注路径上的路由器所属的实际组织名称。为此,你需要解释 traceroute 给出的路由器的域名。如果不确定,可以用你认为是该组织的域名标注路由器。忽略或留空没有域名(或没有 IP 地址)的路由器。
Lab 06 TCP
目标
查看 TCP(传输控制协议)的详细信息。TCP 是互联网中主要使用的传输层协议。在进行本实验之前,请复习 TCP 的相关内容。
要求
Wireshark:本实验使用 Wireshark 软件工具来捕获和检查数据包跟踪。
wget / curl:本实验使用 wget(Linux 和 Windows)和 curl(Mac)来获取 web 资源。wget 和 curl 是命令行程序,允许你获取 URL。与 web 浏览器不同的是,wget 和 curl 允许你精确控制获取哪些 URL 以及何时获取。对于 Linux,wget 可以通过你的包管理器安装。对于 Windows,wget 作为二进制文件提供;请查找下载信息:http://www.gnu.org/software/wget/。对于 Mac,curl 已随操作系统安装。两者都有很多选项(尝试 “wget –help” 或 “curl –help” 来查看),但可以简单地使用 “wget URL” 或 “curl URL” 来获取 URL。
浏览器:本实验使用 web 浏览器来查找或获取页面作为负载。任何 web 浏览器都可以。
提交 提交你捕获的跟踪文件和包括你回答问题和绘制图形的实验报告。
步骤 1:捕获跟踪
按照以下步骤捕获一个单一 TCP 连接的数据跟踪,该连接发送适量的数据。许多应用程序使用 TCP 作为传输协议,包括 web 浏览器。因此,我们将简单地执行一个 web 下载以练习 TCP 连接。然而,请注意,TCP 能够同时双向传输数据,但在下载过程中内容仅从远程服务器发送到本地计算机(在初始请求之后)。
- 找到一个单一中等大小的资源 URL,并确保可以通过 HTTP(而非 HTTPS)下载。你可以使用浏览器进行搜索,寻找一张图片(.jpg)或 PDF 文档(.pdf)。你要确保它是单一资源,而不是包含许多内嵌资源的 web 页面(例如,.html)。找到一个有趣的文件,例如 .jpeg、.doc 或 .pdf 类型!
- 使用 wget 或 curl 获取该 URL,检查你是否能够检索到至少 500 KB 的内容,且网络时间为几秒钟。例如,使用命令 “
wget http://www.diit.unict.it/~acalva/SE/master/03-Sockets.pdf” 或 “curl http://www.diit.unict.it/~acalva/SE/master/03-Sockets.pdf > file”。如果获取失败,请尝试不同的 URL;记住,你可能引用了一个快捷 URL,而浏览器必须做额外工作来找到实际内容,例如,http://mit.edu/image.jpg 可能实际上是 http://web.mit.edu/image.jpg。 - 启动 Wireshark,并以“tcp and host xx.xx.xx”作为过滤器开始捕获,其中 xx.xx.xx 是你将获取内容的远程服务器的名称,例如下图中显示的 “conferences.sigcomm.org”。过滤器的目的是仅捕获你计算机与服务器之间的 TCP 流量。
- 捕获开始后,重复上面的 wget/curl 命令。这次,数据包也会被 Wireshark 记录下来。
- 命令完成后,返回到 Wireshark,并使用菜单或按钮停止跟踪。现在你应该有一个类似于下图所示的跟踪。我们在视图中扩展了 TCP 头部的详细信息,因为这是本实验的重点。
步骤 2:检查跟踪
选择跟踪中间部分的一个较长的数据包,其协议列为 TCP。在中间面板中展开 TCP 协议部分(通过使用“+”展开器或图标)。除了初始的 HTTP GET 请求和 HTTP 响应的最后一个数据包之外,所有数据包都应列为 TCP。选择一个较长的数据包确保我们查看的是从服务器到计算机的下载数据包。在协议层中,你应看到 IP 块在 TCP 块之前。这是因为 TCP 段在 IP 中传输。我们在图中展示了展开的 TCP 块。
你将大致看到以下字段:
- 首先是源端口,然后是目的端口。这是 TCP 在 IP 地址之外添加的寻址信息。源端口可能是 80,因为数据包是由 web 服务器发送的,而标准的 web 服务器端口是 80。
- 接下来是序列号字段。它给出负载字节流中第一个字节的位置。
- 然后是确认字段。它表示反向字节流中最后接收到的位置。
- 头部长度字段给出 TCP 头部的长度。
- 标志字段有多个标志位,用于指示 TCP 段的类型。你可以展开它并查看可能的标志。
- 接下来是校验和,用于检测传输错误。
- 可能还有一个选项字段,其中包含各种选项。你可以展开此字段并探索,但我们稍后将更详细地查看选项。
- 最后,可能还有一个 TCP 负载,携带正在传输的字节。
除了上述字段,Wireshark 还可能提供其他信息行,以帮助你解释数据包。我们只覆盖了网络上传输的字段。
步骤 3:TCP 段结构
为了展示你对 TCP 的理解,绘制你研究的 TCP 段的图示。它应该显示你可以通过 Wireshark 观察到的 TCP 头部字段的位置和字节大小。不要拆分标志字段或任何选项字段,如果你发现某些 TCP 字段共享一个字节,则将它们分组。像往常一样,你的图示可以简单地将帧显示为一个长而细的矩形。尽量不要查看文本中的 TCP 段图示;在之后检查并记录任何差异。
要确定大小,请观察当你点击中间面板中的协议块(块本身,而不是“+”展开器)时,Wireshark 会在下方面板中突出显示数据包中的相应字节,并在窗口底部显示长度。你还可以使用长度列或帧详细信息块中显示的总体数据包大小。注意,这种方法不会告诉你子字节位置。
步骤 4:TCP 连接的建立和拆除
三次握手
要查看“三次握手”的过程,寻找一个带有 SYN 标志的 TCP 段,通常在你的跟踪开始时,以及后续的数据包。SYN 标志在信息列中注明。你也可以使用过滤表达式 “tcp.flags.syn==1” 来搜索带有 SYN 标志的数据包。一个“SYN 数据包”是三次握手的开始。在这种情况下,它将从你的计算机发送到远程服务器。远程服务器应该用一个同时设置了 SYN 和 ACK 标志的 TCP 段回应,即“SYN-ACK 数据包”。在收到这个数据段后,你的计算机将对其进行 ACK,认为连接已建立,并开始发送数据,在这种情况下是 HTTP 请求。你的交换应遵循这个模式,尽管如果数据包丢失并且需要重新传输,可能会略有不同。
绘制三次握手的时间序列图,直到包括连接建立后的第一个数据包(HTTP GET 请求)。将你的计算机放在左侧,远程服务器放在右侧。时间沿页面向下流动,页面上的线条表示数据段。
在你的图示中包括以下特征:
- 每个段的序列号和 ACK 号(如果存在)。ACK 号仅在数据段设置了 ACK 标志时才携带。
- 每个数据段在你的计算机上发送或接收的时间(以毫秒为单位),从零开始。
- 估算的往返时间(RTT),作为 SYN 和 SYN-ACK 数据段之间的时间差。
连接选项
除了建立连接外,TCP SYN 数据包还使用选项(Options)在两端之间协商参数。每一端通过在其 SYN 中包含相应的选项来描述其能力,供另一端了解。通常,必须双方都支持某一功能,才能在数据传输过程中使用它。
回答以下问题:
- 在你的跟踪中,SYN 数据包携带了哪些 TCP 选项?
常见的选项包括最大报文段大小(MSS),用于告知对方可以接收的最大报文段,以及时间戳(Timestamps),用于在报文段中包含信息以估算往返时间(RTT)。还有一些选项,例如 NOP(No-operation) 和 End of Option List(选项列表结束),这些选项仅用于格式化选项字段,不用于宣告能力。在上述答案中,你不需要包括这些格式化选项。选项也可以在连接建立后携带在常规报文段中,若它们在数据传输中有作用。具体取决于选项,例如:MSS 选项不在每个数据包中携带,因为它不传递新的信息;时间戳选项可能会包含在每个数据包中,以持续估算 RTT;而诸如 SACK(选择性确认) 的选项,则只在数据接收出现乱序时使用。为了了解更多,可以查看你跟踪中的数据包上的选项。
FIN/RST 连接终止
最后,TCP 连接在下载完成后被终止。这通常通过 FIN(Finalize) 段完成。每一端向另一端发送 FIN,并确认接收到的 FIN,这类似于三次握手过程。或者,连接也可能在一端发送 RST(Reset) 时被突然中断。此数据包不需要对方确认。
绘制一个你跟踪中的连接终止示意图,从第一次发送 FIN 或 RST 开始,直到连接完成为止。与之前一样,展示每个报文段的序列号和确认号。如果你有 FIN 数据包,可以使用时间差来估算往返时间(RTT)。
步骤5:TCP 数据传输
TCP 连接的中间部分是数据传输或下载阶段,这也是我们的跟踪中最重要的部分。为了整体了解这一过程,我们首先将查看随时间变化的下载速率。
在 Statistics(统计) 菜单下,选择 IO Graph(输入输出图)。默认情况下,此图显示的是随时间变化的数据包速率。根据以下提示进行调整,以显示下载速率。你可能会想使用 Statistics(统计) 菜单下的 TCP Stream Graph(TCP 流图) 工具。然而,这些工具在我们的场景中并不适用,因为它们假设跟踪是在发送数据的计算机附近进行的;而我们的跟踪是在接收数据的计算机附近进行的。
-
x轴:调整刻度间隔和每刻度的像素数。刻度间隔应足够小,以便观察到跟踪中的行为变化,但不宜过小,以避免没有进行足够的平均处理。对于持续几秒的跟踪,0.1 秒是一个不错的选择。每刻度的像素数可以根据需要调整图表的宽度,以适应窗口大小。
-
y轴:将单位更改为 Bits/Tick(比特/刻度)。默认值是 Packet/Tick(数据包/刻度)。通过改变单位,我们可以轻松计算比特/秒的吞吐量,只需根据需要对 y 轴的值进行缩放即可。例如,对于 0.1 秒的刻度,缩放比例为 10 倍。
-
添加过滤表达式:仅查看下载数据包。目前我们查看的是所有数据包。假设下载来自常见的 Web 服务器端口 80,你可以使用过滤器
tcp.srcport==80进行过滤。别忘了按 Enter 键,可能需要点击 Graph(图表) 按钮以重新显示图表。 -
查看上传流量对应的图表:在下一个输入框中输入第二个过滤器。同样,假设使用的是常见的 Web 服务器端口,过滤器为
tcp.dstport==80。按 Enter 键并点击 Graph(图表) 按钮后,图表上应有两条线。
以下是我们绘制的图表示例。我们可以看到下载速率从零快速增加到一个稳定的速率,呈现出一定的指数曲线。这是 TCP 的慢启动过程。在连接运行时,下载速率大约为 2.5 Mbps。你可以使用 wget/curl 中的信息来检查你的速率估算。上传速率是一个稳定的小 ACK 流量。我们的下载也相对稳定,直到完成。这是理想的情况,但如果可用带宽由于竞争的下载任务而变化,下载速率是由服务器而非网络决定,或因数据包丢失中断传输,许多下载可能会表现出更大的波动。如果你希望调查某一特定特征,可以点击图表跳转到跟踪中的最近位置。
回答以下问题以展示你对数据传输的理解:
-
TCP连接正常运行时,下载方向的大致数据速率是多少(以数据包/秒和比特/秒为单位)?
- 数据包/秒:从图表中计算下载数据包的数量(例如,计算一定时间段内的总数据包数量),然后用总数据包数量除以时间段的秒数。
- 比特/秒:使用 I/O 图中的 y 轴值(比特/刻度),结合时间段的刻度间隔,可以计算出下载的比特/秒速率。记得调整刻度间隔以获取准确的数据。
-
这个下载速率中有多少百分比是内容?展示你的计算过程。
- 查找一个典型的下载数据包,查看其大小和包含的 TCP 负载字节数。然后,将 TCP 负载字节数转换为比特数,并将其与总体下载速率进行比较。计算公式为:$\text{内容百分比} = \left(\frac{\text{内容比特数}}{\text{总比特数}}\right) \times 100\%$
-
由于 ACK 数据包,上传方向的大致数据速率是多少(以数据包/秒和比特/秒为单位)?
- 数据包/秒:从图表中计算 ACK 数据包的数量,并除以时间段的秒数。
- 比特/秒:如果 ACK 数据包的大小较小,可以根据 I/O 图中的上传速率来估算 ACK 数据包的比特/秒速率。
检查跟踪中间部分的下载数据包的特征:
- 你应该会看到携带数据的 TCP 段和发送回服务器的 ACK 的模式。通常,每隔几个数据包就会有一个 ACK。这些 ACK 被称为延迟 ACK。通过短时间延迟,可以减少 ACK 的数量。
- 由于这是下载,接收段的序列号会增加;相应地,随后的传输段的 ACK 号也会增加。
- 由于这是下载,传输段的序列号在初始请求后不会增加,因此接收段的 ACK 号也不会增加。
- 每个段都携带窗口信息,以告诉另一端缓冲区中剩余的空间。窗口必须大于零,否则连接会因流量控制而被阻塞。
回答以下问题:
-
如果来自服务器的最新接收 TCP 段的序列号为 X,那么下一次传输的 TCP 段携带的 ACK 号是多少?
- 下一次传输的 TCP 段的 ACK 号应该等于最新接收段的序列号加上接收到的字节数(即最新接收段的序列号 + 负载字节数)。
鼓励你在完成这个实验后自行探索 TCP:
- 探索拥塞控制和经典的 AIMD 行为:捕获发送(而不是接收)适量数据的 TCP 连接的跟踪。使用“TCP 流图”工具以及其他分析工具观察拥塞窗口如何随时间变化。
- 深入探索 TCP 的可靠性机制:捕获包含段丢失的连接跟踪。观察是什么触发了重传以及何时触发。还可以查看往返时间估计器。
- 查看使用选项包括 SACK 的详细情况:你应该看到在段丢失期间接收到的字节范围的信息。
- TCP 是支撑网络的传输层:你可以通过设置并发连接来查看浏览器如何利用 TCP。
Lab 07 UDP
目标
了解 UDP(用户数据报协议)的详细内容。UDP 是一种在互联网中广泛使用的传输协议,用作 TCP 的替代方案,当可靠性不是必须时使用。执行此实验前需复习 UDP 的相关知识。
要求
- Wireshark:该实验使用 Wireshark 工具捕获和检查数据包跟踪。
- ifconfig / ipconfig:使用命令行工具 “ipconfig”(Windows)或 “ifconfig”(Mac/Linux)来检查计算机网络接口的状态。
- 浏览器:该实验使用浏览器查找或获取网页,任何浏览器都可以使用。
提交要求
提交你捕获的跟踪文件,并提交包含问题答案和图示的实验报告。
步骤 1:捕获跟踪
有很多方法可以使计算机发送和接收 UDP 消息,因为 UDP 作为传输协议广泛使用。以下是几个最简单的选项:
- 什么都不做,等待一段时间。UDP 被用于许多 “系统协议”,这些协议通常在后台运行并产生少量流量,例如用于 IP 地址分配的 DHCP 和用于时间同步的 NTP。
- 使用浏览器访问网站。UDP 被 DNS 用于将域名解析为 IP 地址,因此访问新网站会导致发送 DNS 流量。访问安全网站,或者你熟悉但最近没有访问的网站。简单的网页浏览很可能会导致稳定的 DNS 流量。
-
启动语音/视频通话。UDP 被 RTP 使用,而 RTP 是用于在互联网语音或视频通话中传输媒体样本的常见协议。
-
启动 Wireshark 并使用过滤器 “udp” 开始捕获。捕获窗口应与下图类似,除了我们所强调的部分。选择用于连接互联网的主要有线或无线接口进行捕获。如果不确定,请猜测并在捕获失败时重新尝试。取消勾选“以混杂模式捕获数据包”。这种模式适用于监听广播网络中其他计算机发送/接收的数据包。而我们只需记录发送到或从你的计算机发送的数据包。其他选项保持默认设置。在 Wireshark 1.8 版中,捕获过滤器框直接出现在选项屏幕上,但在 Wireshark 1.9 版中,双击接口即可设置捕获过滤器。
-
当捕获开始后,执行一些会产生 UDP 流量的活动。我们在上面描述了几种选项,例如浏览网页或发起一次简短的 VoIP 通话。
-
在停止活动后稍等片刻(比如 60 秒),以观察任何后台的 UDP 流量。很可能你会看到少量的 UDP 流量,因为系统活动通常使用 UDP 进行通信。我们希望能看到这些活动中的一部分。
- 使用 Wireshark 的菜单或按钮来停止捕获。此时你应该拥有一个可能包含许多 UDP 数据包的跟踪文件。我们下面展示了一个示例。我们选择了一个数据包,并展开了 UDP 头的详细信息。
步骤 2:检查跟踪文件
根据网络设置和本地活动的不同,可能会捕获到不同类型的 UDP 流量。注意,协议列可能会显示多个协议,而不是 UDP。这是因为列出的协议是基于 UDP 的应用层协议。Wireshark 会显示应用层协议的名称,而不是传输层的 UDP 协议,除非 Wireshark 无法识别应用层协议。不过,即使这些数据包显示为应用层协议,它们依然会包含用于我们研究的 UDP 协议头,紧随其后的是 IP 和更低层的协议头。
在跟踪文件中选择不同的数据包(在顶部面板中)并浏览展开的 UDP 头(在中间面板中)。你会看到它包含以下字段:
- 源端口:发送 UDP 消息的端口。它显示为一个数字,有时可能还会显示端口的文本名称;这些名称对应的是已注册用于特定应用程序的端口值。
- 目的端口:这是 UDP 消息要发送到的端口号,可能还会显示端口名称。端口是 UDP 唯一的寻址方式,而计算机通过更低层的 IP 层来标识。
- 长度:UDP 消息的长度。
- 校验和:用于验证消息内容的校验和。
UDP 头的字段会因不同的消息而有所不同,但正如你所见,它简洁且直观。消息的其余部分是 UDP 负载,通常由其承载的更高层协议来识别,例如 DNS 或 RTP。
步骤 3:UDP 消息结构
为了检查你对 UDP 的理解,请绘制一个你观察到的 UDP 消息结构图。图中应展示 IP 头、UDP 头和 UDP 负载的位置。在 UDP 头中,标明每个 UDP 字段的位置和大小。你的图可以简单地将整个消息表示为一个长而窄的矩形。
图 3:UDP 消息结构
通过查看跟踪文件中的 UDP 消息详细信息,回答以下问题:
- 长度字段包含什么内容?
- UDP 负载,UDP 负载和 UDP 头,还是 UDP 负载、UDP 头以及更低层的头?
- UDP 校验和有多长(以比特为单位)?
- 整个 UDP 头有多长(以字节为单位)?
步骤 4:UDP 的使用
为了完整理解 UDP,我们将研究 UDP 作为应用程序传输层的实际使用情况。从 IP 协议层(更低一层的协议)开始,我们可以考虑多个问题。第一个问题是 IP 如何知道下一层协议是 UDP。答案是 IP 头中有一个“协议”字段,包含了这些信息。
回答以下问题:
- IP 协议字段的值是多少,以标识 UDP 作为上层协议?
第二个问题是 UDP 消息在 IP 层通常是如何寻址的。你可能会惊讶地发现你的跟踪文件中有一些 UDP 消息既不是从你的电脑发出的,也不是只发送给你的电脑的。你可以通过对源和目标列进行排序来查看这一点。源和目标将显示为域名(如果网络层名称解析开启),否则会显示为 IP 地址。(你可以通过 Wireshark 的 “View” 菜单中的 “Name Resolution” 选项来切换此设置。)
你可以使用 “ipconfig” 命令(Windows)或 “ifconfig” 命令(Mac/Linux)来查看你的计算机的 IP 地址。只需在终端窗口中输入该命令,然后查找主网络接口的 IPv4 地址。我们在下面提供了示例。
UDP消息中,你可能会发现既没有你的计算机作为源IP地址,也没有作为目的IP地址的消息。这是因为UDP广泛用于系统协议的一部分。这些协议通常通过广播和多播地址发送消息,目标是所有对这些消息感兴趣的本地计算机。在我们的跟踪文件中,可以找到DNS(域名系统)、MDNS(使用IP多播的DNS流量)、NTP(时间同步)、NBNS(NetBIOS流量)、DHCP(IP地址分配)、SSDP(服务发现协议)、STUN(NAT穿越协议)、RTP(用于传输音视频样本)等。你的跟踪文件中可能包含一些你未曾听说过的协议,这很正常,因为存在很多协议。你可以在网上查阅它们,作为乐趣。
回答以下问题:
- 检查UDP消息,给出在你的计算机既不是源IP地址也不是目的IP地址时使用的目的IP地址。(如果你的跟踪文件中只有你的计算机作为源或目的IP地址,你可以使用提供的跟踪文件。)
最后,让我们看看典型的UDP消息长度。我们知道UDP消息的最大大小大约为64K字节。但在你浏览时,你应该会发现大多数UDP消息比这个最大值要短得多,以确保UDP消息适合单个数据包。
回答以下问题:
- 在你的跟踪文件中,UDP消息的典型大小是多少?
我们鼓励你继续自主探索,尽管UDP本身没有更多内容。相反,你可以检查基于UDP的应用程序的流量,观察数据包大小和丢包率。VoIP(网络语音)及其伴生协议如RTP(实时协议)是很好的研究对象。同样,你也可以探索流媒体和实时应用程序,看看哪些使用UDP作为传输,哪些使用TCP。






