wireshark 重传率_TCP协议的确认重传机制

(76) 2024-08-08 15:01:01

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所示。

wireshark 重传率_TCP协议的确认重传机制 (https://mushiming.com/)  第1张

 图1 Sack许可选项

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

2.1.2 Wireshark捕获的Sack-Permitted Option

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

wireshark 重传率_TCP协议的确认重传机制 (https://mushiming.com/)  第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所示。

wireshark 重传率_TCP协议的确认重传机制 (https://mushiming.com/)  第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所示。

wireshark 重传率_TCP协议的确认重传机制 (https://mushiming.com/)  第4张

 图4 Wireshark捕获的Sack Option

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

THE END

发表回复