29-tcp可靠传输——选择确认选项(SACK)

0. 为什么会有选择确认

   ARQ协议和滑动窗口协议确实保障了数据的可靠传输,随之而来的问题就是通信效率不高。因为在tcp通信时,计算机在传输连续数据第1,2,3,4分组时,中间的第2分组数据在网络中丢失了,tcp会重传最后确认的第2分组和后面的第3,4分组,导致第3,4分组被重复发送,降低了tcp性能,于是根据这种情况发展出了选择确认。


1. 什么是选择确认

  关于选择确认,我们在上一篇滑动窗口中提到过选择确认,简单来讲,当计算机在传输连续数据第1,2,3,4分组时,中间的第2分组在网络中丢失了,那么通过发送选择确认数据包可以针对丢失的第2分组进行超时重传,从这里可以看出选择确认就是针对丢失或出差错的数据重传,已经正确发送的分组不会重传,即接收方通过选择确认告诉发送方那些数据丢失,那些数据已经收到等,选择确认这种可靠传输方式也称为快速选择性重传


2. 选择确认数据包格式

这里写图片描述

图1-选择确认数据包格式


  一般来说,计算机都是默认支持选择确认的。上面这张图是刚才通过wireshark工具抓取到的接收方给发送方发送的一个tcp确认包,在这个tcp选择确认(SACK)包中,在图1的tcp选项的SACK选项是选择确认(SACK)能保障可靠传输最为重要的依据。所以,这里我们重点关注tcp选项部分,在tcp首部中可以看到确认号为:2336611189,首部长度是32字节,Window size valaue字段是接收方的接收窗口,同于通知发送方将发送窗口大小设置为65520字节。


3. 分析选择确认包

  从该tcp数据包的tcp选项来看这是一个选择确认(SACK)包,也就是说这个确认包只有tcp首部,没有数据部分,Kind:SACK(5)用来表示这是选择确认(SACK),该字段占用一个字节。Length表示tcp选项长度,占用一个字节,左边界和右边界各占用4字节,也就是说这里总共用掉了10字节。其中left edge表示接收方接收到的数据块中的左边界位置(起始字节),而right edge可以理解为接收方接收到的数据块中的结束位置(右边界),为了方便学习,我们暂时这么理解吧。也就是说,通过左边界和右边界我们可以指明一个数据块的位置。

  那么我们可以根据捕获的数据报中的确认号丢失的数据块中的起始字节,也就是要重传的起始字节,再结合接收窗口,左边界和右边界。我们可以推出接收窗口中的已经接收到的数据块,和未接收到的数据块,如图2所示:
这里写图片描述

图2-窗口中的数据块位置


  从图2中我们可以清晰的看到滑动窗口中的数据分布如上图所示,其中未接收到的字节数据块表示需要重传的数据,那么发送方在进行选择性重传时,会从2336611189字节的位置开始重传。注意:对于已经接收到的字节数据块(2336631881 - 2336693150)是不会被重传的。


4. 选择确认包的tcp选项

  另外,在前面学习tcp数据报格式的时候说过,tcp首部中的选项部分最大是40字节,在图1中左边界和右边界在指明一个数据块时就用掉了8字节,那么指明4个数据块就用掉了32字节,再加上Kind:SACK(5)和Length两个字段占用的2字节,最终只剩下了6字节,换句话说,tcp选项的选择确认选项最多也就只能指明4个数据块

这里写图片描述

图3-tcp选项最多指明4个边界


  如图3所示,现有10个分组数据,第1个分组为1-100,第2个分组为101-200,其他以此类推… 假设发送方发送了这10个分组,然后接收方接收到数据后给发送方发送了一个选择确认(SACK)数据报,其中tcp首部中给出确认号为201,同时tcp选项中携带了8个左右边界。

  发送方接收到选择确认数据包后,会根据数据包中的tcp首部中的确认号201,从201字节位置开始重传,再根据tcp首部的tcp选项中的选择确认(SACK)选项指明的已经收到的数据块的8个边界,进行选择性重传(201-300),(401-500),(601-700),(801-900)分组(对于已经收到的数据块(301-400),(501-600),(701-800),(901-1000)是不会重传的,因为选择确认(SACK)选项中给出的边界是指明已经接收到的数据块和未接收到的数据块。换句话说,边界就是接收方用来告诉发送方:“哪些数据已经收到,哪些数据没收到”。然后发送方再选择对未收到的数据进行重传)。仔细体会一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值