如何使用tcpdump区分TCP连接的第一个fin数据包和第二个fin数据包?

3
我正在开发一个HTTP服务器。现在我想做一些统计工作,具体来说,我想知道有多少个TCP连接是由客户端关闭的,有多少个是由我的服务器关闭的。
我已经关闭了我的HTTP服务器上的Keep-alive功能,所以正常情况下是我的服务器发送第一个FIN数据包,而客户端发送第二个FIN数据包,这意味着连接通常是由我的服务器关闭的。如果它们顺序相反,就表示非正常关闭,这是我关心的问题。
这里的问题是,如何通过tcpdump区分第一个FIN数据包和第二个FIN数据包?因为它们都设置在FIN和ACK标志位中。
提前感谢并祝新年快乐!
1个回答

2

我正在通过ssh隧道连接到我的Web服务器,该服务器正在监听5000/tcp端口。我运行了tcpdump会话的捕获,并且即使忽略时间戳,从TCP源端口号仍然可以清楚地确定谁发送了什么。

05:42:06.344592 IP localhost.5000 > localhost.37924: Flags [F.], seq 243, 
    ack 419, win 529, options [nop,nop,TS val 120830308 ecr 120830308], length 0
05:42:06.381872 IP localhost.37924 > localhost.5000: Flags [.], ack 244, 
    win 513, options [nop,nop,TS val 120830318 ecr 120830308], length 0
05:42:06.382504 IP localhost.37924 > localhost.5000: Flags [F.], seq 419, 
    ack 244, win 513, options [nop,nop,TS val 120830318 ecr 120830308], length 0
05:42:06.382535 IP localhost.5000 > localhost.37924: Flags [.], ack 420, 
    win 529, options [nop,nop,TS val 120830318 ecr 120830318], length 0

05:42:06.344592时,我的Web服务器已经确认了来自客户端的字节,并设置了FIN标志。我们可以根据源端口为5000知道这是Web服务器的操作。在实际情况中,仅凭源IP地址就足以识别出它。

05:42:06.382504时,客户端向服务器发送了一个FIN的ACK。同样,通过源端口不为5000,我们也可以知道这是来自客户端的消息。


1
非常感谢。我没有清楚地表达我的问题。困难的是,我有很多连接,不可能手动处理每个连接。因此,正确的标题应该是“如何在没有人工干预的情况下使用tcpdump区分第一个fin数据包和第二个fin数据包”。 - kekaoyunfuwu
当FIN数据包按会话到达时,将其记录在列表或数组中。如果数组非零,则表示该会话有另一个FIN。 - Mike Pennington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接