这是为了学校,而不是家庭作业。我试图了解 RDT 是如何实现的,并且我能够找到另一所已经创建了模拟器的学校,但只需要填写发送者和接收者。无论如何,我无法让它正常工作。发送方和接收方都有一些伪代码和 FSM 图。我相信发件人是正确的,但我对收件人不太确定。我以前从未处理过有限状态机图,所以我也在努力弄清楚。
我将列出接收者以确保这是正确的,并在需要时发布更多代码。
全局变量:
astate =0 // can be 0-3, corresponds to state diagram for a/sender (3.15)
astored_pkt // saved in case we need to retransmit - for a/sender
bstate = 0 // can be 0-1,state diagram for b (3.14)
bOnceThru = 0 // A flag to track if this is the first time through the receiver
bstored_pkt // saved in case we need to retransmit - for b/sender
伪代码:
bInput
if pkt is corrupt
if bOnceThru==1
send bstored_pkt
else
do nothing
else
if (seqno==0 && bstate==0) || (seqno==1 && bstate==1)
deliver data to layer 5
Print "B: got packet #"
create bstored_pkt
sendpkt(bstored_pkt)
Print "B: sending ACK #"
incr bstate mod 2
bOnceThru=1
else
if bstate==1 || bOnceThru==1
send bstored_pkt
Print "B: sending ACK #"
Java代码:
protected void bInput(Packet packet){
if(!isPktCorrupt(packet)){
if(bOnceThru == 1){
toLayer3(1,bstored_pkt);
}else{
return;
}
}else{
if((packet.getSeqnum() == 0 && bstate == 0) ||
(packet.getSeqnum() == 1 && bstate == 1)){
toLayer5(packet.getPayload());
System.out.println("B: got packet #");
bstored_pkt = new Packet(packet);
toLayer3(1,bstored_pkt);
System.out.println("B: send ACK " + packet.getAcknum());
bstate = (bstate + 1) % 2;
if(packet.getSeqnum() == 0) bOnceThru = 1;
}else{
if(bstate == 1 || bOnceThru == 1){
toLayer3(1,bstored_pkt);
System.out.println("B: sending ACK " + packet.getAcknum());
}
}
}
}
toLayer3 和 toLayer5 是已经实现的方法,我不需要担心。此外,isPktCorrupt 是一种用于验证当前数据包的校验和与其存储的内容的方法。
这看起来正确吗?伪代码是否正确?第一个数据包运行正常,然后第二个数据包一直在尝试重新发送。我不明白为什么。如果需要,我也会发布发件人。谢谢!
最佳答案
这段代码是正确的。我确实在我的发件人中发现了一些错误(次要),但它完全解决了。不过,我不得不在接收器代码中更改一件事,那就是 bstate 的增量。因此,如果有人想知道或有类似的问题,这段代码确实与 FSM 相关并且它确实有效。
关于java - FSM 到实际的 Java 代码。不确定代码是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6783288/