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选项,来报告其他的丢失区间。
- 如果需要重传的区间超过4个,TCP协议的SACK(Selective Acknowledgment)选项可能无法完全表示所有的区间。在这种情况下,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