发送 FIN 表示该端不会发送任何数据。但是它可以发送 TCP keepalive 吗?
如果它可以,那么它与“在 FIN 之后发送东西”的声明相矛盾,即使它是 keepalive 但不是数据。
如果它不发送keepalive,它就不会检测另一端是否已经消失。
例如:
客户端发送 FIN 并返回 ACK。然后服务器发送了一个丢失的重置。客户端可以检测到服务器已经消失的唯一方法是发送keepalive,它将以reset作为响应,然后客户端关闭。
这会发生吗?
发送 FIN 表示该端不会发送任何数据。但是它可以发送 TCP keepalive 吗?
如果它可以,那么它与“在 FIN 之后发送东西”的声明相矛盾,即使它是 keepalive 但不是数据。
如果它不发送keepalive,它就不会检测另一端是否已经消失。
例如:
客户端发送 FIN 并返回 ACK。然后服务器发送了一个丢失的重置。客户端可以检测到服务器已经消失的唯一方法是发送keepalive,它将以reset作为响应,然后客户端关闭。
这会发生吗?
根据RFC-1122:
只有在一个时间间隔内没有收到连接的数据或确认数据包时,才必须发送保持活动数据包。
发送FIN
只是表示不再发送数据,而不是不再接收数据。如果发送后的应用程序FIN
仍在等待数据,则 RFC 表明它可以发送一个保持活动数据包以确保另一端仍然存在。