使用 Wireshark 进行 TCP 分析
传输控制是网络活动的重要方面,它管理着我们认为理所当然的许多服务的行为。当您发送电子邮件或只是浏览网页时,您都依赖 TCP 以可靠的方式发送和接收数据包。感谢两位 DARPA 科学家 Vinton Cerf 和 Bob Kahn 在 1970 年开发了 TCP/IP,我们有了一套具体的规则来定义我们如何在网络上通信。当 Vinton 和 Bob 最初构思 TCP/IP 时,他们建立了一个基本的网络拓扑结构和一个可以在两个主机之间进行接口连接的设备。
在图 1 中,我们有两个网络通过一个网关连接。网关在任何网络的发展中都起着至关重要的作用,并承担着在两个网络之间正确路由数据的责任。
由于网关必须了解网络上每个主机的地址,因此每个到达的数据包都必须有一个标准格式。Vince 和 Bob 将此称为互联网报头,由源主机添加到数据包的前面。
源和目标条目,以及 IP 地址,唯一地标识网络上的每个主机,以便网关可以准确地转发数据包。
序列号和字节计数标识从源发送的每个数据包,并计算段内所有文本。接收者可以使用它来确定是否已经看到该数据包,并在必要时丢弃。
校验和用于验证发送的每个数据包,以确保无错误传输。此校验和使用伪报头并封装原始 TCP 报头的数据,例如源/目标条目、报头长度和字节计数。
您可以想象,通过单通道发送大量信息所需的巨大规模和资源成本将呈指数增长。考虑到内存限制和传输限制,将每个数据包分成精心选择的片段似乎是明智的,每个片段都有自己的序列号、字节计数和校验和,然后在目标主机上重新组装最终数据包。分片不仅降低了传输成本,而且提高了数据传输的可靠性和传输速度。当然,永远不会超过香农极限。然而,分片也引入了其他复杂性,例如正确的数据包序列确定、每个数据包的正确大小、丢弃的数据包也需要重新传输数据、目标主机上计算和重新组装数据包的额外资源成本等等。
TCP/IP 模型的每一层都有自己的数据包大小限制。即使 TCP 的最大传输单元 (MTU) 为 65K 字节,但实际上您会看到更小的数据包被分片并分布在多个网络中,然后才到达目标主机。每个数据包都分配有一个唯一的序列号和字节计数。此信息对于有序重组至关重要,并且包括将传入段的标识字段与已保存的标识字段进行匹配。校验和应用于每个段,并在发送方计算,然后在目标主机上重新计算。发送确认,让发送方知道我们已正确收到该段。通常,每个连接都经历建立、数据传输,然后关闭连接。
为了建立连接,源主机向目标主机发送一个 SYN(同步)段,这只是一个 tcp 标志字段报头中 syn 位被翻转的数据包。目标主机将发送一个响应,其中包含其自己的 SYN 段,并使用 ACK 位翻转来确认连接。源主机也必须使用其自己的 ACK 段来确认此连接。此时,通过 TCP 建立通信设置,我们可以开始传输数据。
现在我们对信息如何在网络上通过 TCP 传输有了概念性的理解。让我们看看这一切是如何付诸实践的。
对于 TCP 分析,我们将使用 tcpdump。
sudo apt install tcpdump
让我们捕获一些数据包并将其写入 .pcap 文件,以便我们可以使用 Wireshark 分析我们的流量。
sudo tcpdump -vv -w linuxjournal.pcap
-v
表示详细(您希望输出的详细程度)-w
标签写入 .pcap 文件。
现在我们有了一些数据包,让我们启动 Wireshark 进行分析。
sudo apt install wireshark
使用 Wireshark 打开 .pcap 文件。
sudo wireshark linuxjournal.pcap
仅过滤 TCP 流量。
我们可以看到一些通过 tcp 建立的连接,带有 syn、syn ack、ack 标志
下面我们有关于每个特定数据包的更多详细信息。单击下面的传输控制协议下拉箭头并查看。
我们看到源端口和目标端口。我们有 0 的段长度,所以我们知道数据尚未发送。SYN 标志字段被翻转,因此主机正在尝试建立连接。
校验和已正确计算。
逐步进行到下一行,我们看到从我们的源到目标主机发回的 syn ack。ack 位和 syn 位这次都被翻转了。
我们建立连接的最后一行只有 ack 位被翻转
两个主机之间的连接已正确建立,我们可以开始传输数据了。