-
关于
TCP
协议的
SA
CK
选项功能详细解读
/cisco/xieyi/37664_
时间
:2010-12-07 13:41
来源
:
作者
:
点击
:
55
次
1.
前言
TCP
通信时,
如果发送序列中间某个数据包丢失,
TCP
会通过重传
最后确认的包
开始的后续包,
这样原先已经正确传输的包也可能
重复发送,
急剧降低了
TCP
性能。<
/p>
为改善
这种情况,发展出
SACK
(
Selective
Acknowledgment
,
<
/p>
选择性确认)技术,使
TCP
只重新
p>
发送丢
1.
前言
TCP
通
信时,如果发送序列中间某个数据包丢失,
TCP
会通过重传最
后确认的包开始的
后续包,
这样原先已经正确传输的包也可能重
复发送,
急剧降低了
TCP
性能。
p>
为改善这种情
况,发展出
SACK
(
Selective
Acknowledgment
,
<
/p>
选择性确认)技术,使
TCP
只重新发送
丢
失的包,不用发送后续所有的包,而且提供相应机制使接收方能告诉发送方哪些数据丢
失,
哪些数据重发了,哪些数据已经提前收到等。
2.
SACK
选项
SACK
信息是通过
TCP
头的选项部分提供的,信息分两种,一种标识是否支持
< br>SACK
,是
在
TCP
握手时发送;另一种是具体的
SACK
信息。<
/p>
2.1
SACK
允许选项
类型值
: 4
+---------+---------+
| Kind=4
| Length=2|
+---------+---------+
该选项只允许在有
SYN
标志的
TCP
包中,
也即
TCP
p>
握手的前两个包中,
分别表示各自是
否支持
SACK.
2.2 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 |
+--------+--------+--------+--------+
该选项参数告诉对方已经接收到并缓存的不连续的数据块,<
/p>
注意都是已经接收的,
发送
方可根据此信
息检查究竟是哪个块丢失,从而发送相应的数据块。
* Left Edge of Block
不连续块的第一个数据的序列号。
* Right Edge of Block
不连续块的最后一个数据的序列号
之后的序列号。
表示
(
Left
Edge
-
1
)
和
(
Right
Edge
)
处序列号的数据没能接收到。
关于
TCP
协议的
SACK
选项功能详细解读
(2)
时间
:2010-12-07
13:41
来源
:
作者
:
点击
:
56
次
3.
SACK
的产生
SACK
通常都是由
TCP
接收方产生的,在
TCP
握手时如果接收到对方的
SACK
允许选项同
时自己也支持
SACK
的话,在接收异常时就可以发送
SACK
包通知发送方。
3.1
对中间有丢包或延迟时的
SACK
如
果
TCP
接收方接收到
3. SACK
的产生
SACK
通常都是由
TCP
接收方产生的,
在<
/p>
TCP
握手时如果接收到对方的
SACK
允许选项同
时自己也支持
SACK
p>
的话,在接收异常时就可以发送
SACK
包
通知发送方。
3.1
对中间有丢包或延迟时的
SACK
如果
TCP
接收方接收到非期待序列号的数据块时,如果该块的序列号小于期待的序列
号,说明是网
络复制或重发的包,可以丢弃;如果收到的数据块序列号大于期待的序列号,
说明中间包
被丢弃或延迟,此时可以发送
SACK
通知发送方出现了网络丢
包。
为
反映接收方的接收缓存和网络传输情况,
SACK
中的第一个块
必须描述是那个数据块
激发此
SACK
选项的,
接收方应该尽可能地在
SACK
选项部分中填写尽可能多的块信息,
即使
空间有限不能全部写
完,
SACK
选项中要报告最近接收的不连续数据块,让发送方
能了解当
前网络传输情况的最新信息。
3.2
对重发包的
SACK
(
D-SACK<
/p>
)
RFC2883
中对
SACK
进行了扩展,在
SACK
中描述的是收到的数据段,这
些数据段可以是
正常的,
也可能是重复发送的,
SACK
字段具有描述重复发送的数据段的能力,
在第
一块
SACK
数据中描述重复接收的不连续数据块的序列号参数
,其他
SACK
数据则描述其他正常接收到
的不连续数据,
因此第一块
SACK
描述的序列号会比后面的
SACK
描述的序列号大;
而在接收
到不完整的数据段的情况下,
SACK
范围甚至可能小于当前的
ACK
值。通
过这种方法,发送