基于Wireshark的TCP SACK重传介绍

TCP的SACK(选择确认)机制用于提高数据包重传的效率,当接收端部分数据包丢失时,通过SACK选项告诉发送端哪些数据已接收,从而避免全量重传。SACK包含Sack-PermittedOption和SackOption两种类型,前者在SYN包中启用SACK,后者携带已接收数据包的信息。SackOption结构中,接收端通过左边缘和右边缘序号告知发送端需要重传的数据范围。
摘要由CSDN通过智能技术生成

1 TCP SACK重传简介

基于TCP的通信是可靠通信,这种可靠通信是通过重传机制实现的。即如果接收端没有收到发送端发送的数据,则发送端会重新发送。

《基于Wirshark的TCP三次握手介绍》中提到,接收端会通过向发送端发送ACK数据包来向发送端确认已收到的数据包。当发送端同时向接收端发送多个数据包,例如发送了数据包1-5,而接收端接收到了数据包1、数据包3、数据包4和数据包5,没有接收到数据包2,此时接收端会向发送端发送ACK数据包来提示客户端从数据包2开始发送。

而客户端是怎么知道是只发送数据包2还是发送数据包2-5的呢?这就需要引入SACK,它是TCP重传机制的一种,是(Selective Acknowlegement)即选择确认的简称。SACK将额外信息保存在TCP包头部的选项段中,该信息表示接收端已经收到了哪些数据包,发送端可以根据该信息选择性地向接收端发送数据包。

2 SACK数据包

SACK数据包包括两种类型,一种是“Sack-Permitted Option”即Sack许可选项;另一种是“Sack Option”即Sack选项。

2.1 Sack-Permitted Option

2.1.1 Sack-Permitted Option格式

Sack许可选项的作用是通知对方在建立的TCP连接中使用Sack重传机制。Sack许可选项必须包含SYN包中,不能在其他类型的包中。

Sack许可选项的长度是2字节,包含两部分内容,如图1所示。

 图1 Sack许可选项

其中,第一个字节表示Sack的类型;第二个字节表示Sack数据的长度。

2.1.2 Wireshark捕获的Sack-Permitted Option

在Wireshark的显示过滤语句中输入“tcp.option_kind == 4”,可以过滤显示Sack-Permitted Option数据包,如图2所示。

 图2  Sack许可选项数据

如图2所示,第一部分表示Sack选项的类型,值是0x04,表示其类型是Sack许可选项,而Wireshark的显示过滤语句中的option_kind的含义是选项类型,4表示其类型是Sack许可选项;第二部分表示Sack数据的长度,值是0x02,数据包的长度是2字节。

2.2 Sack Option

Sack Option在接收端发送给发送端的TCP数据包头部中,表示已经收到的数据包。

2.2.1 Sack Option结构

Sack Option结构如图3所示。

 

图3 Sack Option结构

如图3所示,Sack Option结构的前两个字节分别表示类型和长度,与“2.1 Sack-Permitted Option格式”中提到的相同,需要注意的是Sack Option的类型值是0x05。

接下来的8个字节分成两部分,分别是“Left Edge of 1st Block”和“Right Edge of 1st Block”,每个部分4个字节,表示已经接收的数据序号的下限和上限,需要注意的是“Right Edge of 1st Block”实际上表示的是接收到的数据上限序号加1。也就是说,接收端已经接收到了[Left Edge of 1st Block,Right Edge of 1st Block)之间的数据包。当接收端收到该SOCK信息之后,会发送[Left Edge of 1st Block,Right Edge of 1st Block)区间之外的数据包,接收端收到数据之后,会发送修改后的“Left Edge of 1st Block”和“Right Edge of 1st Block”的ACK包。由于每个区间信息的大小是8字节,而TCP头部的选项段最大字节数是40字节,因为2+8*4=34,所以每个TCP头部的选项段最多包含4个SACK区间。

2.2.2 Wireshark捕获的Sack Option

将Wireshark的显示过滤语句设置为“tcp.option_kind == 5”,表示只显示选项类型为0x05的数据包,如图4所示。

 图4 Wireshark捕获的Sack Option

从图4中可以看出,该SACK信息中,包含1个SACK区间,[29914,34233),也就是说,接收端通知发送端,已经成功接收了[29914,34233)这个区间内的数据,发送端收到该信息之后,会向接收端重新发送这个区间外的数据。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值