网络层也是我自己写,如果网络层相对于应用层丢包,说明程序存在bug,即使提供了重转,不一样会被丢掉?
1. 判断重传或重复的标记不一样。在TCP层,头部有一个32位的序号,在接收侧有一个滑动窗口,只有接收到的消息序号在窗口范围内才被接收,否则被当做非法消息丢弃;在窗口范围内的每个序号都有是否已收到的标记,因此对重发的消息也不会重复接收。 如果在应用层进行重发,你需要自己做类似的事情。 2. 如果底层通信质量不好,TCP可能会断链重连,或者序号检测发现异常重置序号。这些情况下TCP层都会丢帧,应用层如果有重要的消息还是要自己做重传。
tcp本身是提供这种机制的额,为什么还需要应用层超时重发? 这个是跟网络层的实现有关的,不知道你的网络层是自己写的,还是用的写好,或者是第三方的。 tcp相对于你的网络层保证不丢包,不代表网络层相对于你的应用层保证不丢包。 这个和具体的网络实现有关 重传了,但之前那条消息后来又被对方收到了,岂不是一条消息被发送了2次? 确实会存在这种情况,但是这个不是发送方需要考虑的问题,而是接收方需要考虑的. 解决办法:比如需要在消息里面加上sessionid,一个逻辑包对应一个唯一的sessionid,重发时不改变这个sessionid,接收端收到重复的sessionid就不处理。
64,682
社区成员
250,490
社区内容
加载中
试试用AI创作助手写篇文章吧