我目前正在尝试实现单向 TCP,我只想对 TCP 发送方/接收方窗口和接收缓冲区的行为进行一些澄清。
我对开窗过程的理解是这样的:
窗口大小表示发送方一次可以发送的最大未确认字节数。
这个尺寸是在连接时商定的。
TCP 发送方应跟踪序列号较低的 ACK,并在收到 ACK 时将数据包标记为已确认。如果最低序列号(它正在跟踪)与当前窗口中的第一个字节匹配,则将窗口向右滑动。
现在,我对接收缓冲区的理解...
当数据包乱序到达时使用。数据被放入缓冲区,接收方不对其进行确认,而是继续确认在最早的无序数据包之前收到的最后一个数据包。这导致发送方在重复的 ACK 号之后“快速”重传下一个数据包。
这是否是对这两个概念的正确理解,如果不是,请澄清。
谢谢!
最佳答案
The window size represents the maximum number of bytes un-acknowledged bytes which the sender can send at one time.
没有。它是可以传输的最大未确认字节数。当发件人达到该限制时,他必须停止发送。
This size is agreed upon during connection.
没有。在协议(protocol)中动态调整。
The TCP sender should keep track of the ACK with the lower sequence number, and also mark packets as ACKed when an ACK is received.
发送方应该缓冲发送的数据直到它被确认,此时它可以被丢弃。如果未被确认,则可能会重新传输等。
If the lowest sequence number (which it is tracking) matches the first byte in the current window, slide the window to the right.
任何 ACK 都包含一个序列号。所有低于该序列号的缓冲发送数据都可以被丢弃。
Now, my understanding of the receiver buffer...
This is used when a packet arrives out of order.
不,它在任何有序数据包到达时使用。它留在那里直到被应用程序读取。乱序段根本不需要缓冲。
The data is placed into a buffer, and the receiver does not ACK it, rather it continues to ACK the last packet it received prior to the earliest out of order packet. This causes the sender to "fast" re-transmit the next packet after the duplicate ACK number.
或多或少,但缓冲部分是可选的。
关于TCP 窗口和缓冲区 - 检查我的理解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16927596/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我