在 connect(2) [Linux 2.6.7 2004-06-23 版本] 的手册页中,描述 ETIMEDOUT 的部分说:
ETIMEDOUT Timeout while attempting connection. The server may be too busy to accept new connections. Note that for IP sockets the timeout may be very long when syncookies are enabled on the server.
同样的评论至少也出现在 Linux 手册页项目的 3.35 版中。
我不了解在服务器上启用 syncookies 如何导致客户端可能有更长的超时时间。
最佳答案
我唯一的解释是这是手册页中的错误,这不是作者的本意。 Linux中处理连接超时的源码比较简单,可以看看here在 retransmits_timed_out() 和 tcp_write_timeout() 函数中。
tcp_retransmit_timer() 是基于正常的指数退避计时器调用的(即 syn 像任何其他数据包一样重新传输,没有特殊处理)。 tcp_retransmit_timer() 调用 tcp_write_timeout() ( line 396 ),如果套接字处于 SYN_SENT 或 SYN_RECV 状态,则将变量 retry_until 设置为 icsk_syn_retries(如果已使用 setsockopt() 设置)或 sysctl tcp_syn_retries 值。它还设置 syn_set = true。这两个在 retransmits_timed_out() 上传递,它检查是否有 retry_until 尝试发送 syn。如果是这样,它返回 true 并调用 tcp_write_err() ,它返回 ETIMEDOUT 错误 ( line 37 )。
在 syn_set 为真的情况下,retransmits_timed_out 使用 TCP_TIMEOUT_INIT 作为其计算的基本超时,这是一个常量(定义为 here )。因此,即使 syncookies 的存在以某种方式神奇地改变了重传计时器,它也无法改变 retransmits_timed_out() 的计算方式,如果已经过了足够的时间以保证返回 ETIMEDOUT。它只能更改重传次数,但 icsk_syn_retries 仅设置 here在处理 setsockopt 时,sysctl_tcp_syn_retries 仅通过 sysctl 机制设置。
所以我看不出服务器上的 syncookies 对 connect() 超时有任何影响。正如您指出的那样,这是有道理的。客户端如何知道服务器正在使用 syncookies?尤其是在收到 syn|ack 之前,这将完成 connect()。
我猜作者是想表达超时应该设置得比较高,因为随着 syncookies 的出现,完全积压的服务器仍然可以成功建立连接,但这可能需要一些时间. (请注意,此行可以追溯到设置当前手册页存储库之前,因为它是在 2004 年首次导入手册页 1.70 时引入的)。
关于linux connect()超时和syncookies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23481823/
起初:那不是错误区域的问题。在irb和数据库中,一切都很好。当我想在我的View中显示日期(created_at、updated_at和所有由我自己在每个模型中定义的日期)时,就会出现问题。我试图在application.rb中设置时区并从初始化程序中删除时间格式,但这并没有解决我的问题。Annotategem生成的架构信息:#created_at:datetime#updated_at:datetime#publish_at:datetime来自irb:1.9.2-p290:004>Time.zone=>(GMT+00:00)UTC1.9.2-p290:005>Time.zone.n
在RubyRestClientgem中,超时和打开超时功能有什么区别?http://www.ruby-doc.org/gems/docs/w/wgibbs-rest-client-1.0.5/RestClient/Resource.html#method-i-open_timeout我也没有从gem的doc文件中得到任何东西。 最佳答案 您正在阅读错误的文档(您的文档是自2009年以来未更新的wgibbs-rest-client):here'stherightone.但是那个也没有说任何区别,尽管它很简单::open_timeout
我有一个像这样调用系统(bash)命令的ruby超时..Timeout::timeout(10){`my_bash_command-c12-otext.txt`}但我认为即使ruby线程被中断,实际命令仍在后台运行..这正常吗?我怎样才能杀死它? 最佳答案 我认为你必须手动kill它:require'timeout'puts'startingprocess'pid=Process.spawn('sleep20')beginTimeout.timeout(5)doputs'waitingfortheprocesstoend'P
尝试在全新安装(fedora)上使用RVM启动并运行Ruby1.9.1。执行rvminstall1.9.1后,rubygems错误日志显示找不到zlibnosuchfiletoload--zlib(LoadError)但是zlib运行时和开发库都已安装并且是最新的。我现在有点被这个难住了。 最佳答案 使用rvm安装zlibhttps://rvm.io/packages/zlib/rvmpackageinstallzlibrvmremove1.9.1rvminstall1.9.1-C--with-zlib-dir=$rvm_path/
我正在寻找一种在运行时和编译时编译我的.scss文件的解决方案。我需要两者的原因是我们的设计师在Mac上工作,并且更喜欢在运行时(尤其是在开发阶段)动态编译他们的.scss文件。另一方面,我需要编译时支持来验证SCSS在我的构建过程中是否成功编译。如果SCSS无法编译,我的目标是让构建失败。我在NuGet上发现了几个可用的库,但是,每个库中的小缺陷都让我望而却步。是否有适用于这两种情况的解决方案?以下是我的研究成果:运行时支持BundleTransformer.SassAndScss通过HttpHandler(与Bourbon一起工作,尽管很慢)Cassette.Sass(由于erro
是否有一种简单的字符串格式可以将表示小时和小时的小数部分的小数显示为小时和分钟?例如:5.5格式化为显示5小时30分钟。我很乐意自己编写代码,但是如果现有功能可用,我更愿意使用它 最佳答案 decimalt=5.5M;Console.WriteLine(TimeSpan.FromHours((double)t).ToString());这将为您提供非常接近的“05:30:00”。然后您可以将其格式化为您想要的结果:varts=TimeSpan.FromHours((double)t);Console.WriteLine("{0}hr
我在我的应用程序中使用HttpWebRequest来检查多个线程中的某些URI。我收到多种类型的超时异常。操作超时远程服务器返回错误:(504)网关超时。他们的详细信息如下:System.Net.WebException:TheoperationhastimedoutatSystem.Net.HttpWebRequest.GetResponse()at......和System.Net.WebException:Theremoteserverreturnedanerror:(504)GatewayTimeout.atSystem.Net.HttpWebRequest.GetRespon
所以我的要求是让我的函数等待第一个实例eventAction来自另一个类和另一个线程,并在我的线程上处理它,允许等待被超时或CancellationToken中断.我想创建一个我可以重用的通用函数。我设法创建了几个选项来满足(我认为)我的需要,但两者似乎都比我想象的要复杂。用法需要说明的是,此函数的示例用法如下所示,其中serialDevice在一个单独的线程上吐出事件:vareventOccurred=Helper.WaitForSingleEvent(cancellationToken,statusPacket=>OnStatusPacketReceived(statusPacke
我想知道为什么在编译时检查C#中的某些强制转换,而在其他情况下,责任被推给了CLR。像上面一样,两者都是不正确的,但处理方式不同。classBase{}classDerived:Base{}classOther{}staticvoidMain(string[]args){Derivedd=(Derived)newBase();//RuntimeInvalidCastExceptionDerivedd=(Derived)newOther();//Compile-timeCannotconverttype...}在阅读“深入了解C#”时,我找到了有关此主题的信息,其中作者说:“如果编译器发
我想打印一个符合ISO-8601标准的日期:YYYY-MM-DDTHH:mm:ss.sssZ所以我使用了以下代码行,但是我得到了意外的输出vardate=newDate(2012,10,30,6,51);print('UTCFormat:'+date.toGMTString());print('toString()method:'+date.toString());print('toJSON()method:'+date.toJSON());//printhoursandminutesincorrectlyprint('toUTCString()method:'+date.toUTCS