简介
网络流量在通过网络传输之前,通常会被拆分成较小的片段,称为数据包。当客户端与服务器进行通信时,它们会来回发送许多此类数据包。「流」(Stream)代表了单个连接中这些数据包的完整、有序序列。
这种「数据包」与「流」的区别是协议分析中最重要的思维转变之一。单个数据包展示了特定瞬间发生的情况,而流则展示了完整的会话。当你重构会话而不是盯着孤立的数据包看时,许多应用层事件(如登录、表单提交和文件传输)会变得更加清晰易懂。
在本实验中,你将学习如何使用 tshark(Wireshark 的命令行版本)来重构这些碎片化的网络会话。通过追踪完整的 TCP 流,你将能够把各个数据包重新拼接起来,并以可读文本的形式查看客户端与服务器之间完整的交互过程。这是网络故障排查和安全分析的一项必备技能。
识别 TCP 流
在这一步中,你将学习如何识别网络捕获文件中存在的不同 TCP 流。
当 tshark 读取捕获文件时,它会自动将属于同一连接(具有相同的源 IP、源端口、目标 IP 和目标端口)的数据包归为一组,并为它们分配一个唯一的整数索引。这个索引被称为 tcp.stream 字段。
你可以将 tcp.stream 视为分析器创建的会话标签。它并非来自网络本身的协议字段,而是 tshark 根据数据包共享相同的连接端点和事件序列,推断出它们属于同一个会话。这就是为什么流分析是数据分析中非常有用的「分析师视角」。
你的实验环境已经准备好了一个名为 sample_traffic.pcap 的示例捕获文件,位于 ~/project 目录下。该文件包含一些基础的 Web 流量。
要查看此捕获文件中的所有唯一 TCP 流,你可以让 tshark 从每个数据包中提取 tcp.stream 字段,对结果进行排序,并仅显示唯一值。
在终端中运行以下命令:
tshark -r sample_traffic.pcap -T fields -e tcp.stream | sort -n | uniq
让我们拆解一下这个命令:
-r sample_traffic.pcap:告诉tshark读取指定的捕获文件。-T fields:指定我们想要输出特定的字段,而不是默认的数据包摘要。-e tcp.stream:告诉tshark为每个数据包打印 TCP 流索引。| sort -n | uniq:通过管道将输出传递给标准的 Linux 工具,按数字顺序排序并去除重复项。
你应该会看到类似以下的输出:
0
1
此输出表明该捕获文件中记录了两个不同的 TCP 会话(流 0 和流 1)。
重构 TCP 流
既然你已经知道了 TCP 流的索引号,就可以重构整个会话了。此过程与 Wireshark 图形界面中的「追踪 TCP 流」(Follow TCP Stream)功能完全相同。
对于 HTTP、SMTP 以及许多传统应用协议等基于文本的协议,重构尤为重要,因为分析师可以按照应用程序体验的顺序阅读请求和响应。即使底层的交换跨越了多个数据包,重构后的流也能还原出完整的叙述。
在这一步中,我们将重构流 0。该流包含一个 HTTP GET 请求,客户端向服务器请求了一个网页。
要在 tshark 中追踪流,你需要使用 -z 选项,该选项用于各种统计和分析任务。追踪流的具体语法是 -z follow,tcp,ascii,<stream_index>。
执行以下命令来重构流 0:
tshark -r sample_traffic.pcap -z follow,tcp,ascii,0 -q
以下是新参数的含义:
-z follow,tcp,ascii,0:指示tshark追踪索引为0的 TCP 流,并以ascii(可读文本)格式显示有效载荷。-q:代表「安静」(quiet)。它会抑制默认的逐包输出,以便你只看到重构后的流数据。
你将看到显示完整 HTTP 会话的输出:
===================================================================
Follow: tcp,ascii
Filter: tcp.stream eq 0
Node 0: 127.0.0.1:58548
Node 1: 127.0.0.1:8080
GET / HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.81.0
Accept: */*
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.10.12
Date: Thu, 05 Mar 2026 02:00:48 GMT
Content-type: text/html
Content-Length: 40
Last-Modified: Thu, 05 Mar 2026 02:00:44 GMT
Welcome to the LabEx Network Stream Lab
===================================================================
在此输出中,你可以清楚地看到客户端的请求(GET / HTTP/1.1...)紧随其后的是服务器的响应(HTTP/1.0 200 OK... 以及 HTML 内容)。tshark 已成功将各个数据包重新拼接成一个连贯的文本块。
分析会话
在分析网络流量时,会话可能会非常长。直接将海量的流数据打印到终端可能会导致难以阅读和分析。
将重构后的流保存到文件中是一个小步骤,但它反映了一种更广泛的取证习惯:保留中间分析产物。调查人员通常会将笔记、提取的会话、解码后的有效载荷和过滤后的证据保存为单独的文件,以便在无需重复执行相同命令的情况下,对调查结果进行审查、比较或移交给他人。
在这一步中,你将重构流 1 并将输出重定向到一个文本文件中。这使你可以使用标准的文本编辑器或命令行工具按自己的节奏检查会话。
流 1 包含一个 HTTP POST 请求,这通常用于提交数据,例如登录表单。
运行以下命令来追踪流 1 并将输出保存到名为 stream1_analysis.txt 的文件中:
tshark -r sample_traffic.pcap -z follow,tcp,ascii,1 -q > stream1_analysis.txt
> 操作符会将原本会打印到屏幕上的输出写入到当前目录(~/project)下的 stream1_analysis.txt 文件中。
现在,使用 cat 命令查看你刚刚创建的文件内容:
cat stream1_analysis.txt
你的输出应该看起来像这样:
===================================================================
Follow: tcp,ascii
Filter: tcp.stream eq 1
Node 0: 127.0.0.1:45138
Node 1: 127.0.0.1:8080
POST /login HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.81.0
Accept: */*
Content-Length: 23
Content-Type: application/x-www-form-urlencoded
user=labex&action=loginHTTP/1.0 501 Unsupported method ('POST')
Server: SimpleHTTP/0.6 Python/3.10.12
Date: Wed, 25 Oct 2026 10:00:05 GMT
Connection: close
Content-Type: text/html;charset=utf-8
Content-Length: 480
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
...
===================================================================
通过分析此文件,你可以观察到客户端在 POST 请求体中发送的确切数据(user=labex&action=login)。你还可以看到服务器的响应,在本例中是一个 501 Unsupported method 错误,这表明用于生成此流量的简单 Python Web 服务器不支持 POST 请求。
当你需要从网络捕获中提取文件、凭据或详细日志时,将流保存到文件是一种非常有效的技术。
总结
恭喜你!你已经成功完成了「追踪网络流」实验。
在本实验中,你学习了如何:
- 使用
tcp.stream字段识别数据包捕获文件中的唯一 TCP 流。 - 使用
tshark的follow功能重构并查看特定 TCP 流的完整交互过程。 - 将重构后的流数据重定向到文本文件中,以便于阅读和深入分析。
对于网络管理员和安全专业人员来说,在调查网络问题、分析恶意软件行为或验证应用程序通信时,这些技术都是基础且核心的技能。

