问题标签 [go-back-n]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 数据报套接字饿死我的 UDP 程序中的其他线程
作为课程作业的一部分,我们的任务是在 Java 提供的 UDP 层之上添加额外的可靠性层,以便发送大图片文件。这将使用 Go-Back-N 协议完成:http ://en.wikipedia.org/wiki/Go_back_N
据我了解,这个问题的症结在于能够发送数据包,同时检查是否有任何确认已进入旧数据包,这将允许您移动窗口。
我目前通过两个线程来做到这一点:一个在窗口中有空间时发送下一个数据包;一个持续监听任何传入的确认并做出适当反应的人。
我的问题是程序应该是线程化的,就好像这两个线程同时运行一样,但实际上,ACKReceiver 线程似乎获得了非常不成比例的时间。从线程转储来看,当发送线程到达 DataSocket.receive() 行时,它似乎“饿死”了一段时间,在此阻塞执行,同时不给其他线程运行的机会。
我看过以下问题,这似乎暗示问题与 DatagramSocket.receive 是同步的事实有关......但没有提供可用的问题解决方案:
这是我代码的发送方部分的代码,我相对确定另一端的接收方非常好(一方面,我不必使用任何线程来让它工作!):
udp - 返回 N 协议
我正在尝试在两个单独的客户端和服务器应用程序上实现 Go back N 协议。假设我的序列号必须适合 3 位,因此 2^3 = 8 个最大数字,并且 2^3 - 1 = 7 窗口大小。
我最初发送我的整个窗口。前两个数据包(0 和 1)被正确接收。数据包 2 被丢弃。当 Receiver 收到数据包 3 到 6 时,它期待 2,因此它必须对收到的数据包表示它想要 2。
当 Sender 收到第一个 nack2 时,它知道已经收到 0 和 1(通过捎带)并向前移动它的窗口,但它还必须从序列号 2 开始重新发送它的窗口(所以 2-3-4-5-6 - 并且可能是 7-0)。当 Sender 收到第二个 nack2 时,它已经发送了这些数据包。由于协议的原因,发送者将再次重新发送他的整个窗口,包括 2。现在接收者可能会收到 2(和其他),但在第二个 nack2 批次中,它将重新接收 2,这是乱序的,将必须 nack 其预期的数据包,依此类推。我在所有这些假设中都是正确的吗?
如果是这样,在我看来,Go Back N 发送的数据包比 Stop and Wait 多得多,尤其是您增加其窗口大小的次数越多。我没有得到什么?
c - Kurose 模拟网络环境,Go-Back-N
我正在尝试为在 C 中使用 Go-Back-N 进行类的模拟网络环境编写代码。但是,我不断陷入某种涉及我的A_timerinterrupt()
方法的无限循环。下面是C文件,你可以看看它和我的方法。
请注意,我在模拟消息数 = 10、丢包概率 = 0.1、损坏概率 = 0.1、平均时间 = 5 和 TRACE = 0 的情况下运行了这个。
我得到的是一个无限循环的A: Timer Stopped!
消息,只有在A_timerinterrupt
被调用时才会发生。
c++ - 是什么导致 fprintf 出现 C++ 缓冲区溢出错误?
我正在尝试使用 GoBackN 窗口在 C++ 中使用套接字和 UDP 设置客户端、路由器、服务器。我不确定为什么在 fprintf() 行的 Client::write_log() 中出现缓冲区溢出错误。
主运行()函数
放()代码
WRITE_LOG() 代码
algorithm - Go-Back-N 窗口大小
为什么在 TCP 的 Go-Back-N 算法中窗口大小(N)必须小于序列号空间(S):S>N?我试着自己弄清楚,但不要安静地得到它
c++ - 尝试发送包含字符数组的数据包时出现分段错误(核心转储)
尝试发送包含最多 30 个字符以及其他识别信息的数据包。这是构造函数。
对于我的课程,我们需要通过以下方式进行序列化和反序列化:
此客户端代码导致我的 server.exe 出现分段错误:
这是服务器端接收代码:
如果我将数据包中的数据内容清空并将长度设置为 0,则数据包传输得非常好。一旦我尝试增加数据包的长度并给它一个字符串,服务器就会遇到分段错误。
我在这里想念什么?我觉得我的缓冲区太大了,或者我错误地指向或引用了某些东西。
c++ - 试图访问对象数组中的对象,但只保存一个对象
我正在尝试为一个类实现 GoBackN ARQ。我正在尝试读取文件,将其分成 30 个字符的数据包,然后将数据包存储在数据包数组中。所有这些数据包都是class packet
.
目前,此代码编译并运行,但是当我访问数据包数组时,在数组的索引 0 处我收到最后一个和最近的数据包。当我尝试访问索引 1 时,我期望一个不同的数据包,但是,所有索引中的数据包都是相同的。
为什么我所有数据包中的数据都相同?
的构造函数代码class packet
。
c++ - 因使用警报()而陷入超时循环;
我正在尝试实现 GoBackN 协议,当服务器丢弃数据包时,我的警报会等待 2 秒,然后再发送所有先前发送的数据包。
警报工作并等待 2 秒,但是在第一次超时后,我正在使用的状态机陷入循环并继续超时。我认为这可能是因为errno
没有重置,但我不确定。
我怀疑循环开始的位置在该receiveData
州。
network-protocols - 如果接收方的 ACK 丢失会怎样?
对于模 4 算术,序列号范围为 0-3,窗口大小为 3(0-2)。假设发送了 0-2 的 3 个数据包,并且发送方正在等待接收方的 ACK。假设接收方发送的所有 3 个 ACK 都丢失了。
此时,接收方正在等待序列号为 3 的数据包。在发送方,发送窗口中充满了未完成的数据包。在超时的情况下,所有未完成的数据包都会重新发送并被接收者正确丢弃。我们都知道 ACK 不会被重新发送。
所以我的问题是发送者现在将如何发送序列号为 3 的数据包,因为发送窗口已满,除非收到 ACK(无法重传),否则未完成的数据包不会被清除。