jjzjj

networking - TCP会重传多少次

coder 2023-09-17 原文

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

最佳答案

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

如果服务器 kernel 崩溃并且没有恢复,重试的次数和时间取决于套接字是否已连接:

   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))。

关于networking - TCP会重传多少次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5227520/

有关networking - TCP会重传多少次的更多相关文章

  1. ruby - 可以通过多少种方法将方法添加到 ruby​​ 对象? - 2

    当谈到运行时自省(introspection)和动态代码生成时,我认为ruby​​没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby​​的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资

  2. ruby - 使用 Ruby,计算 n x m 数组的每一列中有多少个 true 的简单方法是什么? - 2

    给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in

  3. ruby - 正则表达式 - 这个用于素数检测的正则表达式的复杂性是多少? - 2

    这行ruby​​代码检测素数(太棒了!)。("1"*n)!~/^1?$|^(11+?)\1+$/#wherenisapositiveinteger详细信息在这篇博文中解释http://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-prime-numbers/我很好奇它在BIG-O表示法中的表现。有人帮忙吗? 最佳答案 根据经验数据,它似乎是O(n2)。我对前10000个质数中的每100个运行Ruby代码。以下是结果:蓝点是记录的时间,橙色线是

  4. 计算机网络笔记:TCP三次握手和四次挥手过程 - 2

    TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报

  5. sql - 在多少种语言中,Null 不等于任何东西,甚至不等于 Null? - 2

    在多少种语言中,Null不等于Null? 最佳答案 在SQL(作为一种逻辑语言)中就是这样,因为null表示未知/未定义。但是,在编程语言(例如C++或C#)中,空指针/引用是具有特定含义的特定值——没有任何意义。两个无是等价的,但两个未知数不是等价的。造成混淆的原因是两个概念使用了相同的名称(null)。 关于sql-在多少种语言中,Null不等于任何东西,甚至不等于Null?,我们在StackOverflow上找到一个类似的问题: https://stac

  6. Two-Stream Convolutional Networks for Action Recognition in Videos双流网络论文精读 - 2

    Two-StreamConvolutionalNetworksforActionRecognitioninVideos双流网络论文精读论文:Two-StreamConvolutionalNetworksforActionRecognitioninVideos链接:https://arxiv.org/abs/1406.2199本文是深度学习应用在视频分类领域的开山之作,双流网络的意思就是使用了两个卷积神经网络,一个是SpatialstreamConvNet,一个是TemporalstreamConvNet。此前的研究者在将卷积神经网络直接应用在视频分类中时,效果并不好。作者认为可能是因为卷积神经

  7. ruby - Ruby 兰特的有效种子范围是多少? - 2

    Ruby将PRNG实现为“修改后的MersenneTwister,周期为2**19937-1”。1我对MT的理解是它在2^32种不同的种子上运行。让我感到困惑的是Random.new(seed)接受任意大的数字,例如Random.new(2**100)。但是,我无法找到(逻辑上的)碰撞:Random.new(1).rand(10**5)==Random.new(2**32-1).rand(10**5)=>falseRandom.new(1).rand(10**5)==Random.new(2**32).rand(10**5)=>falseRandom.new(1).rand(10**5

  8. ruby - ruby 中方法名称的最大长度是多少? - 2

    我正在使用RubyMine,它告诉我unsubscribe_from_all_notifications...对于方法名称来说太长了。最大长度是多少? 最佳答案 在RubyMine中,您可以通过以下方式更改所有类别的Ruby名称的最大长度:选择菜单项RubyMine-->Preferences在左Pane中Editor下的结果模式对话框中,选择Inspections。在右侧的结果Pane中,选择Ruby-->NamingConventions。您有九类Ruby名称需要更改。每一个都显示一个用于最大长度的编辑字段。因此,例如,我将它们

  9. ruby - 不转换成字符串,一个Fixnum有多少位数? - 2

    我想找到Fixnum的长度,num,而不将其转换为String。也就是说,在不调用.to_s()方法的情况下,num有多少位:num.to_s.length 最佳答案 putsMath.log10(1234).to_i+1#=>4您可以像这样将它添加到Fixnum:classFixnumdefnum_digitsMath.log10(self).to_i+1endendputs1234.num_digits#=>4 关于ruby-不转换成字符串,一个Fixnum有多少位数?,我们在Sta

  10. ruby - 如何检查 ruby​​ 方法中可选参数的默认值是多少? - 2

    给定一个类,classMyClassdefindex(arg1,arg2="hello")endend是否可以通过Class#instance_method等方法获取arg2的默认值? 最佳答案 似乎我们可以检查方法参数值的唯一方法是访问方法的binding。使用Tracepoint类,我们可以获取这样一个绑定(bind)对象,然后检查所有optional参数的值。我们需要确保只使用必需的参数调用所需的方法,以便为默认参数分配默认值。下面是我尝试这样做的-它适用于实例方法和类方法。为了调用实例方法,我们需要实例化类-如果构造函数需要

随机推荐