一般TCP的ACK过程
在TCP的交换中,除了最初的SYN请求消息的ACK标志未被设置为1以外,其他消息的ACK标志被设置为1。 如果在客户端和服务器交互期间某些数据报被丢弃,则确认和后续数据交互的过程如下图所示。
在上图所示的交互过程中,很明显,在交互过程中由于某种未知的不可控原因,包含data-2的数据消息丢失了。 只有包含data-2的消息已丢失,客户端正在接收其他data,但服务器必须重新发送data-2和data-2之后的其他data,从而降低了交互效率。 为了解决这个问题,SACK应运而生。
SACK介绍
sack (选择性确认)技术允许TCP仅重传交互期间丢失的分组,不需要重传所有后续分组,也不需要重传哪些数据已丢失、重传了哪些数据等这样可以大大提高客户端和服务器端数据交换的效率
利用SACK确认丢失的数据包
在分析数据消息被丢弃的实际过程中,可利用SACK功能确认被丢弃的具体数据消息。 如下图所示。
明确三个参数。 ACK确认序列号为12421,SACK的块左边界值为13801,SACK的块右边界值为15181。 明确了这三个参数的数值,基本上可以计算被丢弃的数据报的序列号和长度。 根据上面图中所示的带SACK的数据消息,得知要丢弃的数据消息的TCP序号为12422,其数据长度为13801-12421=1380B。