在固定宽度的消息计数器中检测环绕的好方法是什么?

Mic*_*fik 2 c c++ integer udp overflow

我正在编写一个客户端应用程序,通过UDP与服务器程序进行通信.客户端定期发出数据请求,并需要使用最新的服务器响应.请求消息有一个16位无符号计数器字段,由服务器回显,因此我可以将请求与服务器响应配对.

由于它是UDP,我必须处理服务器响应无序到达(或根本没有到达)的情况.天真地,这意味着保持到目前为止看到的最高消息计数器并丢弃任何具有较低数字的传入消息.但是,只要我们传递65535条消息并且计数器回零,那就会失败.是否有一种很好的方法来检测(例如,有合理的可能性)消息5实际上是消息65,000之后?

实现语言是C++.

caf*_*caf 6

处理此问题的常用方法是进行模减法.序列号a在序列号之后,b当且仅当(a - b) % 65536大于(b - a) % 65536.

对于您的示例,(65000 - 5) % 65536是64995并且(5 - 65000) % 65536是541,因此序列号5在序列号65000之后.

  • 您选择的序列号空间要足够大,以使经过序列号空间一半所需的时间大大大于最大数据包寿命。(此方法是TCP / IP处理其序列号的方式)。基本上,该窗口就像开窗方法一样,只是窗口始终始终是序列号空间的一半。 (2认同)