xiezhaoxuan
xiezhaoxuan
采纳率100%
2018-10-21 08:30

死循环的问题,网络通信中如何实现可靠交付

  • 网络
  • 计算机网络
已采纳

比如网络中A端想让B端里面的100块钱减1,A发送减1命令给B,B收到命令后执行操作,这样B里钱数为99,然后返回确认给A,但是A没收到确认,就认为操作失败,所以A还以为B里面是100块钱,但是实际B已经是99块钱了,怎么办,突然想起的问题,在线等。。。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 3年前

    君不见支付宝也有客服,也有人工解决扣款不正常的问题么?

    就你说的那个,永远都不能做到100%可靠,因为确认需要再确认才能被确认,而再确认又需要再再确认……

    我们需要了解两个原则就可以了
    (1)“不可靠”出现的概率有多大,我们不需要理论上100%的可靠,这个做不到,就算你程序做到了,cpu内存也可能因为物理原因出错。
    我们要追求的是工程上的概率足够低,即便这种方式在理论上作不到100%也没事。
    (2)我们要明白故障导向安全原则,什么意思呢,如果不可靠,发生了故障,会如何。比如你是卖东西的,你不能接受没给钱但是标记给钱了。但是给钱标记为没给钱这是“安全”的。
    前一个情况,钱不一定能追回,后一个情况,人工核实了再给也没事。那么发生了故障,我们要让系统导向安全的状态。
    类似地,如果高铁列车出现了烟雾报警,那么它会停车(虽然烟雾可能是旅客抽烟,并非严重问题,但是我们与其把检测故障的方式搞得复杂,不如导向安全的状态,然后后续去解决)

    点赞 1 评论 复制链接分享
  • summergo123321 mk_lucifer 3年前

    你需要一个临界,临界状态就是可能确认,也可能不确认的数值。。比如击鼓传花, 我们的要求是传3轮,游戏胜利,但是无法互相确认是否是3轮,那么我们就传10轮,再停止,只要你过手超过5那么其实已经证明,全部已经确认了,因为没有4轮拿来的5轮,任何人手中数字只要大于3其实都已经没问题了,那么3就是个临界状态,5即使有人接不到,也已经可以确认了。。那么这个接不到5的一定接了4,那么他只要等待一段时间确认即刻。。

    点赞 1 评论 复制链接分享
  • xiezhaoxuan xiezhaoxuan 3年前

    楼上说的这个办法我想过,但是感觉这个临界还是很容易出问题,比如下面这个图片来说图片说明
    客户端连续发送4次询问帧,服务器相应发送4个返回确认帧,比如现在判断:客户端收到的确认大于等于3,则客户端认为成功交付;服务器端收到的询问帧大于等于3,则服务端认为客户端已经成功改变状态。
    问题是,如果客户端发送第三次发送时,服务器端成功接收,但是客户端没有收到服务器的确认帧,这是服务器认为成功交付,客户端则只收到两个确认帧,所以认为是失败交付,状态还是不一样,不知道是不是会有这样的问题。。。。

    点赞 评论 复制链接分享
  • whandwho 大川里的小川人 3年前

    首先第一个是加锁的问题,这个首先得解决,其次是 数据库的问题,数据库的4条性质里面有一个叫 原子性,就是说一个操作要么成功要么失败,如果失败了,数据库会回滚到之前的状态,不会有问题的。
    楼主的问题重点放在了 网络传输方面,如果是网络问题引起的,也没关系,因为最终的操作都是对数据库操作,
    数据库首先会进行日志,如果操作失败则会回滚,所以是不用担心这个问题的。

    点赞 评论 复制链接分享

为你推荐