sack从TCP NewReno以后,得到诸多版本的协议支持。较早的TCP reno、TCP tahoe、TCP NewReno貌似是不支持SACK选项的。
一、SACK包格式
SACK包主要有三个部分:ACK、SLE、SRE。
ACK表示已经确认的包序号。
SLE是收到乱序包的第一个字节,左边界;SRE是乱序包的最后一个字节加1,右边界。
举例来说,如果收到的ACK序号是1460,SLE是2921,SRE是4382
则表示,从1461--2920的数据包丢掉了。
上图是用wireshark捕捉丢包的情况。
可以看到,从83621到84681这一段的数据包丢掉了。
而后面乱序的数据包不断抵达,因此SRE在不断向右移动。
ACK表示已经确认的包序号。
SLE是收到乱序包的第一个字节,左边界;SRE是乱序包的最后一个字节加1,右边界。
举例来说,如果收到的ACK序号是1460,SLE是2921,SRE是4382
则表示,从1461--2920的数据包丢掉了。
上图是用wireshark捕捉丢包的情况。
可以看到,从83621到84681这一段的数据包丢掉了。
而后面乱序的数据包不断抵达,因此SRE在不断向右移动。
二、多个乱序段的情况
实际情况中较少见,因为这代表着隔三差五就有丢包,丢包率应该很大。
就我们使用的有线链路而言,丢包率不足0.1%,无线链路大约在5%左右。【注 1】
在RFC2018中详述了SACK包格式。
有多个数据块乱序的情况下,SLE和SRE也可以有多组,但因为头部字节限制,最多为4组。
就我们使用的有线链路而言,丢包率不足0.1%,无线链路大约在5%左右。【注 1】
在RFC2018中详述了SACK包格式。
有多个数据块乱序的情况下,SLE和SRE也可以有多组,但因为头部字节限制,最多为4组。
sack选项
选项类型: 5
选项长度: 可变,但整个TCP选项长度不超过40字节,实际最多不超过4组边界值。
+--------+--------+
| Kind=5 | Length |
+--------+--------+--------+--------+
| Left Edge of 1st Block |
+--------+--------+--------+--------+
| Right Edge of 1st Block |
+--------+--------+--------+--------+
| |
/ . . . /
| |
+--------+--------+--------+--------+
| Left Edge of nth Block |
+--------+--------+--------+--------+
| Right Edge of nth Block |
+--------+--------+--------+--------+
注:
【1】无线链路的丢包率不确定,也有20%的情况
参考文献
【1】
【2】| Kind=5 | Length |
+--------+--------+--------+--------+
| Left Edge of 1st Block |
+--------+--------+--------+--------+
| Right Edge of 1st Block |
+--------+--------+--------+--------+
| |
/ . . . /
| |
+--------+--------+--------+--------+
| Left Edge of nth Block |
+--------+--------+--------+--------+
| Right Edge of nth Block |
+--------+--------+--------+--------+
注:
【1】无线链路的丢包率不确定,也有20%的情况
参考文献
【1】