带旋转的Promela模型-重复的消息和损坏的消息

时间:2019-01-14 00:58:06

标签: model-checking promela spin

我有此promela代码,我需要对消息重复和消息损坏进行建模,还需要添加机制来检测和处理损坏的消息和重复消息

从我的阅读中发现,我需要添加新进程,一个用于复制消息,另一个用于处理消息损坏。同样,为了检测重复项,我需要添加一个序列号,并且为了损坏,我需要添加校验和。我在Pormela的技能无法帮助我将这些信息转换为代码。如果您可以提供帮助或知道有用的网站,我将不胜感激

chan linkA = [1] of {byte};
chan linkB = [1] of {byte};
proctype sender (chan link; byte first)
{ byte n=first;
do
:: n <= 10 -> link!n; n=n+2
:: else -> break
od
}
proctype receiver ()
{ byte m, totaleven, totalodd;
do
:: linkA?m -> totaleven=totaleven+m
:: linkB?m -> totalodd=totalodd+m
od
}
init
{
run sender (linkA,2);
run sender (linkB,1);
run receiver ()
}

1 个答案:

答案 0 :(得分:0)

由于这看起来像是一种练习,因此,除了向您提供正确的解决方案外,我将尝试为您提供一些提示。

  • 消息重复:与其发送一次消息,不如添加一次分支选项以两次发送消息,类似于:

    if
        :: channel!MSG(value, seq_no, checksum)
        :: channel!MSG(value, seq_no, checksum);
           channel!MSG(value, seq_no, checksum); // msg. duplication
        :: true; // msg. loss
    fi
    

    在接收方,您可以通过检查seq_no值来应对重复和丢失。复制邮件时,将其丢弃。如果缺少(先前的)消息,则将您的消息(为简单起见)丢弃(为简单起见),并要求再次发送带有所需seq_no的消息,例如

    channel!NACK(seq_no)
    
  • 消息损坏:先计算校验和,然后更改value

    的内容
    checksum = (seq_no ^ value) % 2
    select(value : 1 .. 100)
    ...
    channel!MSG(value, seq_no, checksum);
    

    checksum非常简单,我认为对本练习而言,它并不重要。在接收方,您可以对接收到的数据计算校验和,并将其与消息中的校验和值进行比较。如果没有问题,请再次发送。