Networking TCP将重新传输多少次

Networking TCP将重新传输多少次,networking,tcp,Networking,Tcp,在半开放连接的情况下,服务器崩溃(没有FIN或重置发送到客户端),并且客户端尝试在这个断开的连接上发送一些数据,每个TCP段都将取消确认。TCP将在超时后尝试重新传输数据包。TCP在放弃之前会尝试重新传输多少次?在这种情况下会发生什么?它如何通知操作系统无法访问主机?TCP RFC中指定了什么位置?如果服务器程序崩溃,内核将适当地清理所有打开的套接字。(从TCP的角度来看,这是适当的;它可能会违反应用层协议,但应用程序应该为此事件做好准备。) 如果服务器内核崩溃且未恢复,重试次数和时间取决于套接

在半开放连接的情况下,服务器崩溃(没有FIN或重置发送到客户端),并且客户端尝试在这个断开的连接上发送一些数据,每个TCP段都将取消确认。TCP将在超时后尝试重新传输数据包。TCP在放弃之前会尝试重新传输多少次?在这种情况下会发生什么?它如何通知操作系统无法访问主机?TCP RFC中指定了什么位置?

如果服务器程序崩溃,内核将适当地清理所有打开的套接字。(从TCP的角度来看,这是适当的;它可能会违反应用层协议,但应用程序应该为此事件做好准备。)

如果服务器内核崩溃且未恢复,重试次数和时间取决于套接字是否已连接:

   tcp_retries1 (integer; default: 3; since Linux 2.2)
          The number of times TCP will attempt to
          retransmit a packet on an established connection
          normally, without the extra effort of getting
          the network layers involved.  Once we exceed
          this number of retransmits, we first have the
          network layer update the route if possible
          before each new retransmit.  The default is the
          RFC specified minimum of 3.

   tcp_retries2 (integer; default: 15; since Linux 2.2)
          The maximum number of times a TCP packet is
          retransmitted in established state before giving
          up.  The default value is 15, which corresponds
          to a duration of approximately between 13 to 30
          minutes, depending on the retransmission
          timeout.  The RFC 1122 specified minimum limit
          of 100 seconds is typically deemed too short.
(来自tcp(7))

如果服务器内核崩溃并重新启动,它将不知道任何套接字,并且将
RST
这些后续数据包,从而更快地启用故障

如果沿途的任何单点故障路由器崩溃,如果它们恢复得足够快,连接可能会继续工作。这将要求防火墙和路由器是无状态的,或者如果它们是无状态的,则具有允许先前存在的连接继续运行的规则集。(可能不安全,不同的防火墙管理员对此有不同的策略。)


errno
设置为
ECONNRESET
(至少对于
send(2)
)时,故障会返回到程序。

如果黑洞路由,重试后,套接字和程序会发生什么情况?插座状态是否切换到关闭状态?或者程序的下一次写入/读取将获得错误号xxx?