2
這是爲了學校,但不是功課。我試圖理解RDT是如何實現的,我能夠找到另一所已經創建了模擬器的學校,但只需填寫發送者和接收者。無論如何,我無法正常工作。發送者和接收者都有一些僞代碼和FSM圖。我相信發送者是正確的,但我不太確定接收者。我以前從來沒有處理過有限狀態機圖,所以我仍然試圖弄清楚。FSM與實際的java代碼。不知道代碼是否正確
我會列出接收器,確保它是正確的,並在需要時發佈更多代碼。
全局變量:
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是一種用於驗證當前數據包與其存儲的校驗和的方法。
這是否正確?僞代碼是否正確?它對第一個數據包運行正常,然後第二個數據包繼續嘗試重新發送。我不明白爲什麼。如果我需要,我也會發布發件人。謝謝!