如何解决这样的一个致命的简单设计问题(发送UDP包),可能出现错误的ACK的问题,高手请进

我先把问题简化一下
通过UDP发送信息,客户端发送的UDP包分别带0,1,0,1,0,1...的序列号,每次仅仅发送一个UDP包,同时设置一个Timer
服务器接收这些带序列号的UDP包,从0开始,假如这一次收到一个0序列的UDP,那末下一个包应该带序列号1,如果是1,那么下一个因该带0,这样假如下一个UDP带的序列号不符合这个规则,就丢掉下这个带错误序列的包
如果符合这个规则,就发送一个ack,客户端收到,才允许发送下一个UDP,假如客户太长时间没有收到ack,time out就把当前的再次发送
实际上是一个stop wait的简单协议
现在的问题是
我发送一个比如带1序列号的udp,服务器收到了,于是发送一个带1序列号的ack,但是由于无联接协议的特性,这个ack在网络上传递的时间很长,这个时候客户端time out,再次发送这个带序列号1的udp,服务器收到后,再次发送一个带1序列号的ack,这个ack到达客户端,客户端就发送下一个带序列号0的udp,这个upd成功到达,它的带序列号0的ack也成功到达客户,于是客户端发送下一个带序列号1的udp,发送后,这个包却丢失了,没有到达服务端,所以也没有这个带序列号1的ack反馈给客户
但是,还记得刚刚开始时候哪个在在网络上传递的时间很长的带序列号1的ack吗,它突然到达了客户端,于是客户端误以为当前带1序列号的udp到达了服务器(实际上没有!!)
这个问题我刚刚发现,求救各位高人停等协议如何解决这个问题
up有分!!!!!!!!!!!!!
[709 byte] By [isis-isis] at [2008-2-18]
# 1
楼主可以这样做:客户端发送的时候序号不要仅取0,1,你可以采取随机序号.因为是停等,所以序号不连续没什么关系,然而却大大减小了你说的那种情况发生,每次检查序号相当于校验正确性一样(你甚至可以用很多字段的与,或,异或等操作来校验).
proxywin-方向 at 2007-10-26 > top of Msdn China Tech,专题开发,技术,项目,网络通信...
# 2
确实,用0,1来识别包是有很大缺陷的,是协议设计上的问题,从根本上没有办法避免你说的问题。
datuhao-峡谷 at 2007-10-26 > top of Msdn China Tech,专题开发,技术,项目,网络通信...
# 3
各位,以前我上学的时候印象中好像有个IP包的时间限制问题
router可以根据收到的这个IP包经历的中间站的时间判断出是否这个包发送的时间过长,超过threshold就抛弃这个IP包
时间太久了,不是很清楚了
我的这个程序不是仅仅有stopwait,现在想起来,问题就是如何设置timeout的大小,保证这个包在timeout后不会突然出现
isis-isis at 2007-10-26 > top of Msdn China Tech,专题开发,技术,项目,网络通信...
# 4
你说的是TTL跳数吧,我认为一般网络中靠时戳是无法判断超时的,各个路由器又没有绝对同步的时钟

猜测你的意思,无非是上层还有顺序逻辑,那你应该在上层进行连续序号的排序(或按你自己的规律).这样可以保证只接收序号在当前期望序号以后的数据报.
而下层使用随机序号的停等机制.
proxywin-方向 at 2007-10-26 > top of Msdn China Tech,专题开发,技术,项目,网络通信...
# 5
唉世风日下啊大家都不易
proxywin-方向 at 2007-10-26 > top of Msdn China Tech,专题开发,技术,项目,网络通信...
# 6
proxywin(方向) ( )说的有道理,我也是这么个想法!
wolfkain at 2007-10-26 > top of Msdn China Tech,专题开发,技术,项目,网络通信...
# 7
>>唉世风日下啊大家都不易
大家说明白一点,究竟有什么问题阿
isis-isis at 2007-10-26 > top of Msdn China Tech,专题开发,技术,项目,网络通信...