最近在研究TCP拥塞控制,但是有一个问题困扰着我...
如果我理解正确,除非 cwnd(拥塞窗口)和 rwnd(接收方窗口)允许,否则 TCP 不会发送新数据。换句话说:
if(flightSize < MIN(cwnd, rwnd))
{
// Send some new data (if possible)
// Taking into account other details that we don't need
// to get into such as Nagle's algorithm, etc.
}
其中 flightSize 是已发送但尚未确认的数据量。
让我们假设 TCP 正在进行,发送数据,并适本地增加 cwnd。假设 cwnd = [10 个完整数据包],并且 flightSize == cwnd。然后网络中发生丢包,发送方的重传定时器关闭。 New Reno 如何/何时重传未确认的数据?
这是我目前的理解/误解:
当计时器关闭时,cwnd 将重置为 [1 个完整数据包],最旧的已发送但未确认的数据包将被重新发送,rto 将加倍,重传计时器将被重置。因此,如果我们说当计时器关闭时 rto 为 1 秒,它将更新为 2 秒,并且重传计时器将再次启动,等待时间为 2 秒。
这就是我感到困惑的原因:
在上述情况下,TCP 只会重发一个数据包。即使该数据包立即得到确认,TCP 也无法发送任何新数据,因为 cwnd 仍然小于 flightSize。那么它有什么作用呢?等待 2 秒重传计时器再次响起,然后再重新发送另一个数据包?由于无法发送新数据,它是否会强制重新发送旧数据?它是否重置了 flightSize,并重新考虑所有以前发送的数据未发送?
我已经阅读了所有我能找到的 RFC,以及各种关于 TCP 的指南和解释。我一定是错过了什么地方......
澄清: 我正在考虑多次丢失,其中 TCP 未使用 SACK。
如果收到重复的 ack,TCP 将在第 3 个重复的 ack(快速重传)重新发送最旧的 ack,并在第 4 个重复的 ack(快速恢复)及之后发送新数据。我的问题是如果 TCP 发送方收到少于 3 个重复确认会发生什么?
最佳答案
我在《TCP/IP Illustrated, Volume 2》一书中找到了答案,第 25.11 节,第 842-844 页:
[On a retransmission timeout] the next send sequence number (snd_nxt) is set to the oldest unacknowledged sequence number (snd_una). ... By moving snd_nxt back, [TCP can begin to retransmit all unacknowledged data].
换句话说,flightSize 将被重置,因此数据可以继续发送(在慢启动模式下)。只是这些数据中有一部分可能是之前已经发送过的数据。可能会出现一个累积的 ack,以防止重新发送所有数据。
关于tcp - TCP如何处理cwnd的超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/534957/
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在Ruby中,我需要在n毫秒秒后暂停一段代码的执行。我知道RubyTimeout库支持秒的超时:http://ruby-doc.org/stdlib/libdoc/timeout/rdoc/index.html这可能吗? 最佳答案 只需为超时使用十进制值。n毫秒的示例:Timeout::timeout(n/1000.0){sleep(100)} 关于Ruby在n*milli*秒后超时一段代码,我们在StackOverflow上找到一个类似的问题: https:
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案
我设置了以下模型:classContact:no_freq?validates_presence_of:freq,:if=>:no_band?protecteddefno_freq?freq.nil?enddefno_band?band.nil?endendclassBand当我在我的新View中输入频率时,如果输入了频率,则不允许指定波段。这在我的其他观点中造成了问题,因为band现在为零。我如何允许不指定band并在我的index和showView中显示为空,然后在editView中允许在以后指定一个。通过执行以下操作,我已经能够让我的索引显示空白:contact.band&&co
我有一个grammarfile对于我正在尝试构建的一种新的通用编程语言。我正在努力使该语言健壮且易于使用(它深受Ruby等启发),为此我引入了一些左递归规则。我看到一些例子似乎表明了以下左递归规则:rulel_recursel_recurse/'somethingelse'end可以通过将其更改为非左递归:ruler_recurse'somethingelse'/r_recurseend对我来说,这看起来会有不同的问题并且仍然会失败。我是对的,还是这会“奏效”?我试图(查找和)消除的特定左递归可以在这个grammarfile中找到.我不确定哪些规则受到影响,但至少somewerepoi
在下面的测试用例中:classPackageclassComponentdefinitializep[:initialize,self]endendendclassPackage_A结果:[:initialize,#]#[:initialize,#]#如何获取特定的Package_A.component和Package_B.component? 最佳答案 ClassComponent是在Package中声明的,所以看起来是正确的。::指示在Package_A范围内查找名称Component。由于那里没有Component,它会查找父
我想使用rubyffigem调用一个c函数,该函数将一个数组作为输入变量,输出是一个数组。也就是说,c函数看起来像:double*my_function(doublearray[],intsize)我创建了ruby绑定(bind):moduleMyModuleextendFFI::Libraryffi_lib'c'ffi_lib'my_c_lib'attach_function:my_function,[:pointer,int],:pointer我想用ruby代码调用:result_array=MyModule.my_function([4,6,4],3)我该怎么做?