TCP:半封闭连接上的数据

TCP:半封闭连接上的数据,tcp,Tcp,我正在实现一个TCP堆栈,遇到了一个半关闭连接的问题 我的实现充当服务器端。客户端建立连接,然后发送一些数据,然后发送一条“FIN”消息。然后,服务器确认来自客户端的数据,发送自己的一些数据,然后才关闭其一半的连接(发送“FIN”) 问题在于,客户端不确认服务器在半封闭连接上发送的数据,也不确认其最终的“FIN”消息。根据netstat,客户机处于FIN_WAIT2状态。在服务器不发送任何数据的相同场景中,事情会顺利进行。 所讨论的客户机是netcat,因此我假设问题出在我这边:) 屏幕截图可用

我正在实现一个TCP堆栈,遇到了一个半关闭连接的问题

我的实现充当服务器端。客户端建立连接,然后发送一些数据,然后发送一条“FIN”消息。然后,服务器确认来自客户端的数据,发送自己的一些数据,然后才关闭其一半的连接(发送“FIN”)

问题在于,客户端不确认服务器在半封闭连接上发送的数据,也不确认其最终的“FIN”消息。根据netstat,客户机处于FIN_WAIT2状态。在服务器不发送任何数据的相同场景中,事情会顺利进行。 所讨论的客户机是netcat,因此我假设问题出在我这边:)

屏幕截图可用。 实际的PCAP文件可用

我的问题是,一般来说,我是否应该期望在半封闭连接上发送数据的ACK;特别是,在上面的例子中,我做错了什么



任何帮助都将不胜感激

可能服务器应该发送ACK=2561而不是FIN/ACK中的2562?

可能服务器应该发送ACK=2561而不是FIN/ACK中的2562?

FIN-WAIT-2表示它看到了ACK,因此序列号必须正确,但也表示它没有看到同一段中的FIN。如果FIN计数为1字节,则LEN可能应为1?

FIN-WAIT-2表示它看到了ACK,因此序列号必须正确,但也表示它没有在同一段中看到FIN。如果FIN计数为1字节,那么LEN可能应该为1?

从对等方的角度来看,您不知道这是一个半封闭的连接。客户端可能已完全关闭连接,在这种情况下,端口在您一侧处于CLOSE_WAIT,而在对等方处于FIN_WAIT_2,但对等方将向您的发送发送RST而不是ACK。你的链接下载了.exes,据我所知可能是病毒。有没有其他方法让他们可以使用?谢谢你的评论。我已经更新了链接-希望它们现在能正确显示。屏幕截图的最后一行是你第一次PSH的确认。还有吗?我让它单独呆了几分钟,没有别的事发生。另外,netcat客户端没有完成运行,即没有返回提示。两侧的端口状态是什么?从对等方的角度看,您不知道它是一个半封闭的连接。客户端可能已完全关闭连接,在这种情况下,端口在您一侧处于CLOSE_WAIT,而在对等方处于FIN_WAIT_2,但对等方将向您的发送发送RST而不是ACK。你的链接下载了.exes,据我所知可能是病毒。有没有其他方法让他们可以使用?谢谢你的评论。我已经更新了链接-希望它们现在能正确显示。屏幕截图的最后一行是你第一次PSH的确认。还有吗?我让它单独呆了几分钟,没有别的事发生。另外,netcat客户端没有完成运行,即没有返回提示。两侧的端口状态是什么?我刚刚尝试使用2561而不是2562。这产生了类似的结果-客户端重复其[FIN,PSH,ACK]消息,但序列号为2562-因此我认为2562首先是正确的ACK(FIN计数为1字节)。EJP,我在先前的回复中犯了一个错误。Netstat说,在原始问题(acking2562)中,客户机处于FIN-WAIT-2中。当使用2561时,它在FIN-WAIT-1中。是的,我错了:它应该是2562。显然,客户不想因为未知的原因确认您的数据。您可以尝试重新传输数据,看看会发生什么。我刚刚尝试使用2561而不是2562。这产生了类似的结果-客户端重复其[FIN,PSH,ACK]消息,但序列号为2562-因此我认为2562首先是正确的ACK(FIN计数为1字节)。EJP,我在先前的回复中犯了一个错误。Netstat说,在原始问题(acking2562)中,客户机处于FIN-WAIT-2中。当使用2561时,它在FIN-WAIT-1中。是的,我错了:它应该是2562。显然,客户不想因为未知的原因确认您的数据。您可以尝试重新传输数据,看看会发生什么。我认为“LEN”不是数据包中的实际字段,它只是wireshark告诉您tcp段包含多少字节。FIN是标头中的一个标志,而不是实际的字节,因此我认为0是正确的。我同意你的评估,客户忽略了fin。问题似乎开始得更早,因为它没有确认fin之前发送的任何数据。这是我最初问题的一部分-我是否应该期望客户端在关闭其连接端后确认此数据?是的,您应该期望对所有数据进行确认。我认为“LEN”不是数据包中的实际字段-它只是wireshark告诉您tcp段包含多少字节。FIN是标头中的一个标志,而不是实际的字节,因此我认为0是正确的。我同意你的评估,客户忽略了fin。问题似乎开始得更早,因为它没有确认fin之前发送的任何数据。这是我最初问题的一部分-我是否应该期望客户端在已经关闭其连接端后确认此数据?是的,您应该期望对所有数据进行确认。