TCP SACK选项

作者:易隐者 发布于:2012-8-1 22:37 Wednesday 分类:网络分析

一般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只重新发送交互过程中丢失的包,不用发送后续所有的包,而且提供相应机制使接收方能告诉发送方哪些数据丢失,哪些数据重发了,哪些数据已经提前收到了。如此大大提高了客户端与服务器端数据交互的效率,其确认和数据交互的过程如下图所示:

点击查看原图
图 2  SACK确认和丢包后续数据交互示意图

SACK包结构

       SACK在TCP的选项字段里,其主要分为两种,一种为SACK允许选项,其类型值为4,该选项只允许在有SYN标志的TCP包中,也即TCP握手的前两个包中,分别表示各自是否支持SACK。其在数据报文中的封装如下图所示:

点击查看原图
 
图 3 SACK允许选项在数据报中的封装

       另外一种SACK类型为SACK选项类型,其选项类型值为5,选项长度可变,但整个TCP选项长度不超过40字节,实际最多不超过4组边界值。其在数据报文中的封装如下图所示:

点击查看原图
图 4  SACK选项类型在数据报文中的封装

利用SACK确认丢失的数据包

       在我们分析数据报文被丢弃的实际过程中,我们完全可以利用SACK的功能来确认被丢弃的具体数据报文。如下图所示:

点击查看原图
图 5  带有SACK选项的确认报文中所携带的相关被丢弃的报文信息示意图

       明确三个参数:ACK确认序列号为12421,SACK的块左边界值为13801,SACK的块右边界值为15181。明确了这三个参数的数值,我们基本上就可以计算出被丢弃的数据报的序列号和长度了。
       通过上图所示的带有SACK的数据报文,我们可以知道被丢弃的数据报文的TCP序列号为12422,其数据长度为13801-12421=1380B。

标签: TCP重传 sack TCP丢包 TCP选项


您对本文的评分:
当前平均分: 8.9(27 次打分)

版权所有:《蚂蚁网-多维人生,三实而立!》 => 《TCP SACK选项
本文地址:http://www.vants.org/?post=74
除非注明,文章均为 《蚂蚁网-多维人生,三实而立!》 原创,欢迎转载!转载请注明本文地址,谢谢。

评论:

HelloPackets
2012-08-06 13:08
能说说,一个SACK报文最多能带几对左右边界的ACK吗?
比如,接收端未收到4个不连续的数据报文,该如何SACK?
易隐者
2012-09-01 19:34
@HelloPackets:这个跟TCP报头大小限制有关,TCP报头最大40字节,剩下的你自己算一算就知道啦

发表评论:

Powered by 易隐者 基于emlog 皖ICP备12002343号-1