当客户端通过发送初始数据包启动3路TCP握手时,Acknowledgment Number
(请注意我这里没有谈到ACK标志)是否为0? / p>
我有一个TCP跟踪文件,我使用C中的pcap库打印出每个数据包的特定信息。我注意到,连接中第一个数据包的Acknowledgment Number
始终设置为0.我可以将其用作标识TCP会话的第一个数据包的标准吗?
如果不是这样,我可以使用哪些其他标准来识别给定数据包是否是Web客户端发送的第一个数据包?简单地查看SYN标志就不起作用,因为当服务器响应客户端的初始请求时,它也将设置其SYN标志。
答案 0 :(得分:3)
序列编号将具有随机值,但确认(您要求)数字字段包含32位零的完全正常行为它
这并不是说它不能包含数据。您正确地将ACK标志与确认号区分开来。该标志的实际含义是表示确认号字段中的值有效。由于它将在初始SYN上被清除,因此没有这样的声明。因此,它可以包含绝对任何东西,但同样,正常行为为零。
关于区分初始SYN和响应的问题,正常IP堆栈对正确形成的初始SYN的响应将是SYN-ACK。因此,虽然将设置SYN,但也将设置ACK。为了区分彼此,更好的做法是查看TCP代码位字段而不是序列号,除非您尝试进行某种异常检测。