如何识别 TCP 3 次握手中的初始数据包?

How to identify initial packet in TCP 3-way handshake?

当客户端通过发送其初始数据包启动 3 次 TCP 握手时,Acknowledgment Number(请注意我在这里不是在谈论 ACK 标志)是否设置为 0 是真的吗?

我有一个 TCP 跟踪文件,我使用 C 中的 pcap 库打印出每个数据包的特定信息。我注意到连接中第一个数据包的 Acknowledgment Number 始终设置为 0。我可以将其用作识别 TCP 会话的第一个数据包的标准吗?

如果不是那样,我可以使用哪些其他标准来将给定数据包识别为 Web 客户端发送的第一个数据包?仅仅查看 SYN 标志是行不通的,因为当服务器响应客户端的初始请求时,它也会设置其 SYN 标志。

sequence 数字将有一个随机值,但对于 acknowledgement(您询问的)数字来说这是完全正常的行为字段中包含 32 位零。

这并不是说它不能包含数据。您正确地区分了 ACK 标志和确认号。标志的实际含义是表示确认号字段中的值有效。因为它会在初始 SYN 上被清除,所以没有这样的声明。因此,它绝对可以包含任何内容,但同样,正常行为为零。

关于您区分初始 SYN 和响应的问题,正常 IP 堆栈对正确形成的初始 SYN 的响应将是 SYN-ACK。因此,在设置 SYN 的同时,也会设置 ACK。要将两者区分开来,更好的做法是查看 TCP 代码位字段而不是序列号,除非您正在尝试进行某种异常检测。