美文网首页实时语音
重传之ACK,SACK, RACK, NACK

重传之ACK,SACK, RACK, NACK

作者: myxu_bin | 来源:发表于2020-05-03 17:36 被阅读0次

什么是重传

重传

好比我从淘宝买东西,商家通过快递向我发送货物, 但货物可能在快递途中弄丢了, 我反馈给商家货物没收到后, 商家给补发一个货物, 这就是重传。

商家怎么知道货物丢了呢?可能是我的反馈,也可能是快递公司的反馈,或是商家发现我没确认收货。 这些方式就是ACK, SACK, RACK, NACK等报文了。怎么理解这些报文呢? 下面从三种传输方式来解释重传的原理和工作方式。

TCP的重传机制

ACK: acknowledgement 应答,响应。 在TCP里的ACK是一种累积ACK, 当前n个数据块收到后, 接收端发送ACK n+1, 告知发送端前n个数据收到了,而不是发一块数据给一个ACK响应。

假如从A到B送d1, d2, d3,d4,d5,d6,d7七块数据:


ACK

其中d3, d4丢失了,
那么ACK就是这样的:

  • B收到d2后, ACK 3, 表明收到了d1, d2。
  • B收到d5后, ACK 3, 因为没收到d3, 无法累积,还停留在游标3。
  • B收到d6, d7后, 还是ACK 3, 同上。

什么时候会重传d3, d4呢?

  • 超时重传:


    RTO

    A每发送完一块数据d后,会将其加入超时重传队列, 当收到ACK 3后,将d1,d2从队列移出, 当d3 - d7的计时T到达后,就会开始对其进行重传。

  • 快速重传:
    收到了3个ACK 3, A就可以判定d3没收到了, 重发d3。

从这里可以发现快速重传机制有个问题: 触发了d3的快速重传, 但d4还没有重传,d4要等到自己的T4 timeout到了或是三个ACK 4才重传,显然时延加大了, 有没有好的解决办法呢? 这就引入了SACK。

SACK: Selective Acknowledgement 选择性的应答。在TCK协议里的SACK就是接收放告知发送方收到了一些数据片段, 它是ACK的补充, 如上例, B通过ACK告知了A收到了d1, d2, 但没告知A收到片段d5, d6,d7。


SACK

有了SACK, 就可以提前触发d4的重传了。

QUIC的重传机制

QUIC的重传机制同TCP的类似,同样用到ACK, SACK, RTO。 但改进了TCP重传机制中的问题。

TCP重传机制的问题:

  • 重传歧义: 由于重传的包的序号没有变更, 导到ACK响应的不知是原始包还是重传包。


    重传歧义

    计算网络的来回时延rtt就可能出错, 如下图所示: rtt = d3_t3 - d3_t1, 就错误的将rtt变大了。

  • SNACK带来的reneging问题, 即接收方发了很多SNACK, 且这些SNACK里携带了很多跳跃的应答数据,导致发送方大量的重传计算,这种往往是一种攻击手段。

webrtc的重传机制

NACK: Negative Acknowledgement 消极应答。所谓消极应答, 就是接收端不反馈收到哪些数据,而是反馈没有收到哪些数据。


NACK

当B收到d5后,通过对比序列号,发现d3, d4没收到, 那么发送NACK, 告知A, d3, d4丢失了, A就可以重传d3, d4了。

参考

相关文章

  • 重传之ACK,SACK, RACK, NACK

    什么是重传 好比我从淘宝买东西,商家通过快递向我发送货物, 但货物可能在快递途中弄丢了, 我反馈给商家货物没收到后...

  • WebRTC-nack机制详解

    # 1.NACK的含义 丢包重传(NACK)是抵抗网络错误的重要手段。NACK在接收端检测到数据丢包后,发送NAC...

  • RabbitMQ 消费端 ACK 与重回队列机制

    消费端的手工 ACK 和 NACK 消费端进行消费的时候,如果由于业务异常导致失败了,返回 NACK 达到最大重试...

  • RabbitMQ的ACK与重回队列机制

    消费端的手工ACK与NACK 当我们设置 autoACK=false 时,就开启了手工ACK模式,那么其实手工模式...

  • 5.6 TCP可靠传输的实现

    以字节为单位的滑动窗口 超时重传时间的选择 选择确认SACK 当数据没有按序到达,只是中间缺少一些。通过SACK告...

  • RabbitMQ消费端ACK与重回队列机制

    消费端的手工ACK和NACK 消费端进行消费的时候,如果由于业务异常导致失败了,返回NACK达到最大重试次数,此时...

  • RabbitMQ消费端ACK与重回队列机制

    消费端的手工ACK与NACK 当我们设置 autoACK=false 时,就可以使用手工ACK方式了,那么其实手工...

  • RabbitMQ ACK、NACK、Type、TTL、死信

    起因:在实际项目开发过程中,需要使用RabbitMQ来实现消息队列的功能,比如说我发布一个动态之后,需要在30分钟...

  • TCP可靠传输理论;流量控制;拥塞控制

    滑动窗口、超时重传、选择确认SACK 滑动窗口 滑动窗口:发送窗口、接收窗口。发送窗口内的数据都可以发送,在收到新...

  • TCP的重传

    我们都知道tcp发送的消息,如果没收到ack是会重传的。具体是怎么重传的呢 比如发送1,2,3,4,5 这5个包,...

网友评论

    本文标题:重传之ACK,SACK, RACK, NACK

    本文链接:https://www.haomeiwen.com/subject/tshdghtx.html