TCP重传多少次

时间:2011-03-08 02:06:26

标签: networking tcp

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

1 个答案:

答案 0 :(得分:13)

如果服务器程序崩溃,内核将适当地清理所有打开的套接字。 (嗯,从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这些后续数据包,从而更快地启用故障。

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

将失败返回给errno设置为ECONNRESET的程序(至少send(2))。