【问题标题】:Are FIN packets guaranteed to arrive?FIN数据包是否保证到达?
【发布时间】:2015-08-17 10:11:13
【问题描述】:

在 4 次握手中,我们有以下内容:

FIN ------->
<------- ACK
<---x--- FIN (what if this packet is lost?)
ACK ------->

如果第三个数据包丢失,会发生什么情况,会重新传输吗?请注意,在发送第三个数据包时,程序可能已经破坏了套接字,所以它不能再发送任何东西了!

【问题讨论】:

  • 永远不要相信网络,一切皆有可能。没有任何保证
  • 它将等待响应,直到出现超时。

标签: sockets networking tcp winsock


【解决方案1】:

TCP 协议

在确认之前,包括 FIN 在内的所有段都将重新传输。

来源:https://www.rfc-editor.org/rfc/rfc793

套接字

您可以使用操作系统工具查看打开的 TCP 套接字及其状态。在 TCP 终结期间,套接字首先打开以进行双向通信,然后每一方关闭其方向,并且必须在操作系统中释放资源之前确认每个 FIN。

为了重传 FIN 数据包,在 FIN 被确认或超时之前,连接必须在 OS 中仍然存在。

【讨论】:

  • 所以当第三个数据包(FIN数据包)发送时,当我调用closesocket()销毁socket时,socket并没有真正被销毁,对吧?而是等待对方的ACK包,如果过了一定时间还没有收到ACK包,就重传FIN包?
  • 另外我还有一个问题,如果FIN包发出后,另一边的另一台电脑已经断电,这意味着发送方永远不会收到FIN包会怎样(因为没有人发)。那么在这种情况下会发生什么,发送方会一直等待直到收到一个 FIN 数据包(永远不会到达)?
  • 这由通常由操作系统配置确定的超时覆盖。它肯定不会永远等待。
  • @user4572253:操作系统必须跟踪连接,即使在您关闭套接字之后,直到握手完成和等待时间(以防数据包仍在传输中)已过期。无论是通过保持套接字对象处于活动状态,还是仅单独跟踪连接来实现这一点,都是一个可能会更改的实现细节。在 Windows、IIRC 中,您将能够通过 netstat 查看连接,如果您的进程退出,连接的所有权将重新分配给系统进程。 (或者类似的东西,我的记忆很模糊。)
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 2019-02-13
  • 2010-12-14
  • 2019-07-23
  • 1970-01-01
  • 2014-10-13
  • 2015-09-24
  • 1970-01-01
相关资源
最近更新 更多