为什么TCP的Go-Back-N算法窗口大小(N)必须小于序列号空间(S):S> N?我试着弄清楚自己,但不要安静得到它
作为课程作业的一部分,我们的任务是在UDP层上提供额外的可靠性层,以便发送大图片文件.这是使用Go-Back-N协议完成的:http://en.wikipedia.org/wiki/Go_back_N
根据我的理解,这个问题的关键在于能够发送数据包,同时检查是否有任何致谢已经进入旧数据包,这将允许您移动窗口.
我目前通过两个线程执行此操作:如果窗口中有空间,则发送下一个数据包; 并且不断地听取任何传入的确认并做出适当的反应.
我的问题是该程序应该是线程化的,就好像这两个线程同时动作一样,但事实上,似乎ACKReceiver线程正在获得非常不成比例的时间.从线程转储中,当它到达DataSocket.receive()行时,它似乎"饿死"了发送线程一段时间,阻止了执行,而没有让其他线程有机会在此期间运行.
我已经看过以下问题,似乎暗示问题与DatagramSocket.receive同步的事实有关......但是没有提供问题的可用解决方案:
这是我的代码的发件人部分的代码,我相对确定另一方的接收器是完全正常的(一方面,我没有必要使用任何线程来使其工作!):
import java.io.*;
import java.net.*;
import java.nio.ByteBuffer;
public class Sender3 {
short base = 0;
short nextSeqNum = 0;
DatagramPacket[] packets;
ByteBuffer bb;
String endSys;
int portNum;
String fileName;
int retryTime;
int windowSize;
DatagramSocket clientSocket;
InetAddress IPAddress;
boolean timedOut = false;
public Sender3(String endSys, int portNum, String fileName, int retryTime, int windowSize){
this.endSys = endSys;
this.portNum = portNum;
this.fileName = fileName;
this.retryTime = retryTime;
this.windowSize = windowSize;
}
public static …Run Code Online (Sandbox Code Playgroud)