SACK 选项
一般TCP的ACK过程
在TCP的交互过程中,除了第一个SYN请求报文的ACK标志未置1外,其他的报文的ACK标志都是置1的。当客户端与服务器在交互的过程中,某些数据报被丢弃时,其ACK确认和后续数据交互的过程如下图所示:
图 1 一般丢包情况下的ACK确认和后续数据交互的过程示意图
在上图所示的交互过程中,我们可以清楚的发现,在交互中由于某些未知的不可控的原因导致包含data-2的数据报文丢失。虽然仅有包含data-2的报文 丢失,客户端已经收到其他的data,但是,服务器却要将data-2以及data-2之后的其他Data重传一次,这就造成了交互效率的低下。正是为了 解决这个问题,诞生了SACK。
SACK介绍
SACK(Selective
Acknowledgment,选择性确认)技术,使TCP只重新发送交互过程中丢失的包,不用发送后续所有的包,而且提供相应机制使接收方能告诉发送方
哪些数据丢失,哪些数据重发了,哪些数据已经提前收到了。如此大大提高了客户端与服务器端数据交互的效率,其确认和数据交互的过程如下图所示:
SACK包结构
SACK在TCP的选项字段里,其主要分为两种,一种为SACK允许选项,其类型值为4,该选项只允许在有SYN标志的TCP包中,也即TCP握手的前两个包中,分别表示各自是否支持SACK。其在数据报文中的封装如下图所示:
另外一种SACK类型为SACK选项类型,其选项类型值为5,选项长度可变,但整个TCP选项长度不超过40字节,实际最多不超过4组边界值。其在数据报文中的封装如下图所示:
利用SACK确认丢失的数据包
在我们分析数据报文被丢弃的实际过程中,我们完全可以利用SACK的功能来确认被丢弃的具体数据报文。如下图所示:
图 5 带有SACK选项的确认报文中所携带的相关被丢弃的报文信息示意图
明确三个参数:ACK确认序列号为12421,SACK的块左边界值为13801,SACK的块右边界值为15181。明确了这三个参数的数值,我们基本上就可以计算出被丢弃的数据报的序列号和长度了。
通过上图所示的带有SACK的数据报文,我们可以知道被丢弃的数据报文的TCP序列号为12422,其数据长度为13801-12421=1380B。