如何针对信道两端速率悬殊的情况改进滑动窗口协议?
请教各位一个关于滑动窗口协议的问题。如果信道两端的传输速率悬殊,可能会出现这种情况:A端发送的包,B端接收到了,但是在A段超时前没有来得及发送应答。针对这种情况,如何通过改进回退N步协议,来提高信道的吞吐量?
这里有一段GoBackN的代码,有没有哪位达人能帮忙修改一下实现上述功能?或者给些提示和建议?
小女十分感谢!
public class Stopwait
extends datalink.Protocol
{
datalink.Packet buffer; // copy of last packet sent
int frameToSend; // sequence number to use
// for next frame transmitted
int frameExpected; // sequence number expected
double timer; // time out value
boolean waiting; // a packet is waiting to be sent
public Stopwait( int windowsize, double timer)
{
super( windowsize, timer);
frameToSend = 0; // initialise sequence numbers
frameExpected = 0;
waiting = false;
this.timer = timer;
}
public void FrameArrival( Object frame)
{ // Object frame must be cast to DLL_Frame
DLL_Frame f = (DLL_Frame) frame;
// check that it is the one that is expected
if (f.sequence == frameExpected)
{
sendPacket(f.info); // valid frame is passed
// to network layer
frameExpected = 1 - frameExpected; // flip bit
}
if( f.acknowledgment == frameToSend)
{ // acknowledgment has arrived
buffer = null;
stopTimer(0); // cancel timer
enableNetworkLayer(); // allow new packets
frameToSend = 1-frameToSend;
}
}
public void PacketArrival( datalink.Packet p)
{
DLL_Frame f;
buffer = p;
if ( isChannelIdle() )
{
f = new DLL_Frame( frameToSend,
1-frameExpected,
buffer);
sendFrame( f); // transmit it
startTimer(0, timer); // start timer
waiting = false;
}
else
waiting = true;
disableNetworkLayer();
}
public void TimeOut( int code)
{
DLL_Frame f;
if ( isChannelIdle())
{
// a frame has not been ACKed in time,
// so re-send the outstanding frame
f = new DLL_Frame( frameToSend,
1-frameExpected,
buffer);
sendFrame( f);
startTimer(0, timer);
}
else
waiting = true;
}
public void CheckSumError()
{ // ignore check sum errors and allow frames to time out
}
public void ChannelIdle()
{
DLL_Frame f;
if ( waiting )
{
f = new DLL_Frame( frameToSend,
1-frameExpected,
buffer);
sendFrame( f);
startTimer(0, timer);
waiting = false;
}
}
public int displayWindowWidth()
{
return 12;
}
public String displayWindow()
{
StringBuffer sb = new StringBuffer();
sb.append(" Receive Window: " + frameExpected + "\n\n");
sb.append(" Transmit Window\n Seq Packet\n");
if ( buffer != null )
sb.append(" " + frameToSend + " " + buffer.getId() + "\n");
else sb.append(" " + frameToSend + " null\n");
return sb.toString();
}
}
class DLL_Frame {
public datalink.Packet info;
int sequence;
int acknowledgment;
DLL_Frame ( int s, int a, datalink.Packet p)
{
info = p;
sequence = s;
acknowledgment = a;
}
}