当客户端通过发送其初始数据包来启动3路TCP握手时,是否将Acknowledgment Number(请注意,我这里不讨论ACK标志)设置为0?
我有一个TCP跟踪文件,我使用C中的PCAP库打印出每个包的特定信息。我注意到连接中第一个包的Acknowledgment Number总是设置为0。我可以用它作为识别TCP会话的第一个数据包的标准吗?
如果不是这样,我可以使用什么其他标准来确定一个给定的包是由Web客户端发送的第一个包?仅仅查看syn标志是不起作用的,因为当服务器响应客户机的初始请求时,它还将设置其syn标志。

最佳答案

序列号将有一个随机值,但是确认(您询问)数字字段包含32位零是完全正常的行为。
这并不是说它不能包含数据。您正确地将ack标志与确认号区分开来。标志的实际含义是表示确认号字段中的值有效。因为它将在初始syn上被清除,所以没有这样的声明。因此,它可以包含绝对的任何内容,但是正常行为也是零。
关于区分初始syn和响应的问题,普通ip堆栈对正确格式的初始syn的响应将是syn-ack。因此,在设置SYN的同时,也将设置ACK。要区分两者,更好的做法是查看tcp代码位字段,而不是序列号,除非您尝试进行某种异常检测。

07-28 01:19
查看更多