我是SPIN和Promela的初学者。 我正在尝试使用JSPIN软件模拟TFTP(普通文件传输协议)。我做了大部分模拟。但是,我遇到了问题。对我来说,模拟发送方或接收方超时之后的数据包丢失非常重要。我可以通过使用关键词“超时”来模拟超时。但是,这次超时似乎并不像我期望的那样有效。只有在此过程中没有其他选择要执行时,此超时才有效。但是,我想在分组丢失或重复之后的特定时间段之后工作。因此,我的问题是“如何在SPIN中模拟数据包丢失并在超时后跟踪它?”
以下是我的代码。
mtype {MSG, ACK, RRQ, WRQ};
chan toS = [3] of {mtype, byte, short};
chan toR = [3] of {mtype, byte, short};
bool readRequest=1;
bool writeRequest=1;
proctype Receiver(chan IN,OUT)
{
byte recvbit;
short size;
do
:: readRequest==1 ->
atomic{
readRequest=0;
size=512;
OUT ! RRQ, recvbit, size;
}
:: IN ? WRQ, recvbit, size
-> OUT ! ACK, recvbit, size;
:: IN ? MSG, recvbit, size
->
response:
atomic {
OUT ! ACK, recvbit, size;
if
::size<512 ->
if
::timeout -> break;
::IN ? MSG, recvbit, size -> goto response;
fi
::else
fi;
}
:: timeout -> OUT ! ACK, recvbit, size;
od
}
proctype Sender(chan IN,OUT)
{
byte recvbit;
short size=512;
int repeat=0;
do
:: IN ? RRQ, recvbit, size ->
atomic{
recvbit=(recvbit+1)%8;
size= size - (repeat/2); //after 10 times it becomes 511;
OUT ! MSG, recvbit,size;
repeat++;
}
:: writeRequest==1 ->
atomic {
writeRequest=0;
size= size - (repeat/10);
OUT ! WRQ, recvbit,size;
repeat++;
}
:: IN ? ACK, recvbit, size ->
atomic {
if
:: size < 512 -> break;
:: else ->
recvbit=(recvbit+1)%8;
size= size - (repeat/2); //after 10 times it becomes 511;
OUT ! MSG, recvbit,size;
repeat++;
fi
}
:: timeout ->
atomic {
size= size - (repeat/10);
OUT ! MSG, recvbit,size;
repeat++;
}
od
}
init
{
run Sender(toS, toR);
run Receiver (toR, toS);
}
答案 0 :(得分:1)
以下示例使用Demon
进程模拟“丢失”的消息:
chan sendChan = [1] of {bit};
chan replyChan = [1] of {bit};
active proctype Sender() {
bit replyVal, value = 1;
do
:: sendChan ! value -> /*Send msg over sendChan*/
if
:: replyChan ? replyVal; /*Wait for a reply*/
:: timeout; /*or timeout if none*/
fi
od
}
active proctype Reciever() {
bit msg;
do
:: sendChan ? msg -> replyChan ! 1; /*Reciever gets msg, sends reply*/
od
}
active proctype Demon() {
do
:: sendChan ? _ ; /*Msg stolen from sendChan!*/
od
}
在Demon
流程中,_
中的:: sendChan ? _ ;
会读取并弃置频道中的任何消息。
或者,有一个Alternating Bit Protocol(第二个模型)的实现,它使用Reciever
的do循环中的额外选项来模拟消息丢失而不是单独的进程。