计算机网络(5.10)运输层- 选择确认SACK

问题:若收到的报文段无差错,只是未按序号,中间还缺少一些序号的数据,那么能否设法只传送缺少的数据而不重传已经正确到达接收方的数据? 答案是可以的。选择确认SACK (Selective ACK) 就是一种可行的处理方法。

TCP的接收方在接收对方发送过来的数据字节流的序号不连续,结果就形成了一些不连续的字节块。

和前后字节不连续的每一个字节块都有两个边界:左边界和右边界。

第一个字节块的左边界 L1 = 1501,但右边界 R1 = 3001。左边界指出字节块的第一个字节的序号,但右边界减 1 才是字节块中的最后 一个序号。

第二个字节块的左边界 L2 = 3501,而右边界 R2 = 4501。

接收方收到了和前面的字节流不连续的两个字节块。如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据。

RFC 2018 的规定:如果要使用选择确认,那么在建立TCP连接时,就要在TCP首部的选项中加上“允许SACK”的选项, 而双方必须都事先商定好。

如果使用选择确认,那么原来首部中的“确认号字 段”的用法仍然不变。只是以后在TCP报文段的首部中都增加了SACK 选项,以便报告收到的不连续的字节块的边界。

由于首部选项的长度最多只有 40 字节,而指明一个边界就要用掉4字节,因此在选项中最多只能指明4个字节块的边界信息。另还需两个字节,一个字节指明是SACK选项,一个字节指明此选项占用的字节数。

猜你喜欢

转载自blog.csdn.net/qq_40452317/article/details/90105560