当前位置:   article > 正文

计网Lesson16 - TCP选择重传和流量控制

计网Lesson16 - TCP选择重传和流量控制



1. 选择性确认(SACK)

TCP通信中,发送序列中的某一包丢失(1,2,3,4,5 中 3 丢失),如果全部重传消耗太大,接收方会确认 2 ,然后窗口划过去,将3,4,5重传,但是由于4,5传过了,造成重复。

  • 创立SACK(Selective acknowledgment,选择性确认)技术
    • 告知发送方哪些数据收到,哪些数据丢失。
    • 不用重复传输。
  • SACK是TCP协议头中选项的一部分
    • Kind:1字节。kind == 5 代表这是SACK选项。
    • Length:1字节。代表SACK选项长度(字节)。
    • Left Edge:4字节。左边界。
    • Right Edge:4字节。右边界。
    • 区间左闭右开[…, …)
  • SACK选项
    • 最多携带4组边界信息。
    • 最大占用字节数:4 * 8 + 2 = 34B
  • 但是我们会发现问题:选项长度最大为40字节,左右边界占8字节,那么最多可以表示的区间只有4个,如果不止要重传4个区间怎么办呢?
    • 如果需要重传的区间超过4个,TCP协议的SACK(Selective Acknowledgment)选项可能无法完全表示所有的区间。在这种情况下,SACK选项通常会选择最重要的区间进行报告,例如最早丢失的区间或者数据量最大的区间。
      然后,当发送方收到SACK选项后,它会立即重传那些被报告为丢失的区间。同时,接收方会继续发送新的SACK选项,来报告其他的丢失区间。
  • 为什么选择在传输层将数据分成多个段,而不是等到网络层分片传递给数据链路层?
    • 如果出错,直接整段重传,浪费资源。

2. TCP流量控制

TCP为应用程序提供了 流量控制(Flow Control) 机制,以解决因发送方发送数据太快而导致接收方来不及接收,造成接收方的接收缓存溢出的问题。

2.1 基本情况

  • 流量控制基本方法:接收方根据缓存区状况来控制发送方的发送速率。
    • 通过报文中的窗口来控制。
    • 发送方的窗口不能大于接收方给出的窗口大小。
    • 接收方给出窗口大小为0时,发送方停止发送。
      在这里插入图片描述

2.2 特殊情况

发送方给出窗口为0,之后又有了一些缓存,想让发送方继续发送数据,发送非0窗口报文,结果这个报文丢失了,改如何解决?
在这里插入图片描述

  • 解决方案:
    • 当发送方收到0窗口报文时停止发送数据。
    • 同时开启一个计时器,每隔一段时间发送测试报文询问新窗口大小。
    • 如果还是0,重新启动定时器。

在这里插入图片描述
解析:

  • 窗口有4段报文:1,2,3,4;先发了1,2,结果只确认了1。
  • 那么接下来窗口滑到2,大小调整为2,那么窗口内就是2,3两段报文。
  • 由于之前发过了2,又没有说明要重发2,所以不发,只需要发3即可。

答案选A

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/158380?site
推荐阅读
相关标签
  

闽ICP备14008679号