我有以下问题:
1) TCP 是否保证数据包的传送,因此如果使用的传输协议(protocol)是 TCP,则是否需要应用程序级重传。假设我已经在客户端和服务器之间建立了 TCP 连接,服务器向客户端发送了一条消息。然而,客户端离线并在大约 10 小时后才恢复正常,那么 TCP 堆栈是否会处理重新传输和向客户端传递消息,或者服务器上运行的应用程序是否需要处理它?<>
2) 与上述问题相关,如果传输协议(protocol)是 TCP,是否需要应用程序级别的 ACK。应用程序 ACK 的原因之一是,如果没有它,应用程序将不知道远程端何时收到消息。除此之外还有什么原因吗?意思是消息本身的传递是有保证的吗?
>
最佳答案
Does TCP guarantee delivery of packets and thus is thus application level re-transmission ever required if transport protocol used is TCP
TCP 保证将消息流字节传送到 TCP 连接另一端的 TCP 层。因此,应用程序不必为重传的细微差别而烦恼。但是,在将其视为绝对答案之前,请先阅读我的其余答案。
However the client goes offline and comes back only after say 10 hours, so will TCP stack handle re-transmission and delivering message to the client or will the application running on the server need to handle it?
不,不是真的。尽管 TCP 对单个 TCP 数据包具有某种程度的重试逻辑,但如果远程端点断开连接,它也无法执行重新连接。换句话说,它最终会“超时”等待从远程端获得 TCP ACK 并进行几次重试。但最终会放弃并通过套接字接口(interface)通知应用程序远程端点连接处于死或关闭状态。典型的模式是,当客户端应用程序检测到它丢失了与服务器的套接字连接时,它要么向应用程序的用户界面报告错误,要么重试连接。无论哪种方式,都是应用程序级别决定如何处理失败的 TCP 连接。
is application level ACK needed if transport protocol is TCP
是的,绝对是。大多数客户端-服务器协议(protocol)都有一些请求/响应消息对的概念。如果应用程序“发送”的数据已成功排队到内核的网络堆栈,则 TCP 套接字只能向应用程序指示。它不保证远程端套接字之上的应用程序实际上“得到它”或“处理它”。 TCP 之上的协议(protocol)应该在处理消息时提供某种响应指示。此处以 HTTP 为例。想象一下,如果应用程序向服务器发送 HTTP POST 消息,但没有来自服务器的确认(例如 200 OK)。客户端如何知道服务器处理了它?
在网络地址转换器 (NAT) 和代理服务器的世界中,空闲的 TCP 连接(彼此之间没有数据)可能会失败,因为 NAT 或代理会代表实际端点关闭连接,因为它认为缺少正在发送的数据。解决方案是使用某种周期性的“ping”和“pong”协议(protocol),应用程序可以通过这些协议(protocol)在没有数据可发送的情况下保持 TCP 连接有效。
关于sockets - 是否需要通过 TCP 进行应用程序级重传和确认?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44255697/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序