TCP四次挥手,如果客户端进入了FIN-WAIT-2状态,又想向服务端发送消息了,会发生什么情况?

admin 2026-08-04 07:56:55 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文分析TCP四次挥手中客户端进入FIN-WAIT-2状态后能否发送新消息。通过内核数据结构追踪状态,指出在FIN-WAIT-2中客户端理论上可以发送数据,但实际行为取决于系统调用。建议理解TCP状态机,避免在关闭连接后发送数据。 综合评分: 100 文章分类: 其他


cover_image

TCP四次挥手,如果客户端进入了FIN-WAIT-2状态,又想向服务端发送消息了,会发生什么情况?

原创

车小胖谈网络 车小胖谈网络

车小胖谈网络

2026年7月26日 13:33 上海

在小说阅读器读本章

去阅读

What happens if the client is in the FIN-WAIT-2 state and wants to send a new message to the server?

能让客户端的TCP进入FIN-WAIT-2状态的,客户端一般调用2种syscall

  • close(fd)
  • shutdown(fd, SHUT_WR) 或者  shutdown(fd, SHUT_RDWR)

其中fdfile descriptor。

假设调用syscall函数 socket成功返回fd=10,再调用connect(fd,…) = connect(10,…),经过3次握手,成功建立tcp连接,状态为established

内核是如何从客户端进程的视角追踪这个状态的?

p->files->fdt->fd[10]->private_data->sk->sk_state == established

其中,p客户端进程task_struct实例的指针。如果不好理解,可以理解为客户端进程task_struct实例的base address。

加亮的10代表fd inex,代表在fd[] array里的index。

如果客户端再建立一个TCP连接,假如分配的fd =11,那么跟踪它的状态就可以用:

p->files->fdt->fd[11]->private_data->sk->sk_state == established

如果客户端没有打开更多的文件,或者创建更多的tcp连接。那么

p->files->fdt->fd[12] == NULL ==0

p->files->fdt->fd[13] == NULL ==0

。。。

场景1:客户端调用shutdown(10, SHUT_WR)

内核用fd=10作为index来填入p->files->fdt->fd[]这个数组,并判断

p->files->fdt->fd[index] == p->files->fdt->fd[10] 是否== NULL?

如果NULL,说明fd 10对应的内核struct完全释放或者不存在,比如fd 12,13要么曾经使用过但是已经被释放内存,或者压根没有存在过。

如果不是NULL,继续check:

p->files->fdt->fd[10]->private_data== NULL?

如果不是NULL,继续check

p->files->fdt->fd[10]->private_data->sk == NULL?

如果不是NULL,继续check当前的状态:

p->files->fdt->fd[10]->private_data->sk->sk_state == established?

我们拥有上帝的视角,知道 fd=10代表的tcp连接状态为established状态。

但是,CPU不具有上帝视角,做每一个de-reference操作之前,都确保不是NULL地址,或者内存地址0,否则系统会崩溃。以上每一步check如果是NULL,syscall直接返回用户栈,并把errer code返回。

由于以上每一步都成功了,tcp发现该TCP连接状态是established,用户想发送End of File == EOF== FIN,可以吗?

当然可以了,于是TCP发出了FIN报文,并更新状态为:

p->files->fdt->fd[10]->private_data->sk->sk_state = fin_wait_1

收到服务器对自己FIN消息的ACK报文之后,客户端tcp更新状态为:

p->files->fdt->fd[10]->private_data->sk->sk_state = fin_wait_2

题主的问题来了,此情此景,客户端能用send(10,…)发送新的数据吗?

send是465种syscall的一种类型,客户端可以自由调用自己喜欢的syscall。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:车小胖谈网络 车小胖谈网络 车小胖谈网络《TCP四次挥手,如果客户端进入了FIN-WAIT-2状态,又想向服务端发送消息了,会发生什么情况?》

评论:0   参与:  0