一 TCP的ACK原理和延迟确认机制
(1)ACK的定义:
TCP协议中,接收方成功接收到数据后会回复一个ACK数据包,表示已经确认接收到ACK确认号前面的所有数据。字段长度是32位。
(2)ACK的作用
发送方在一定时间内没有收到服务端的ACK确认包后,就会重新发送数据包。发送方收到了ACK,表明接收方已经接收到数据,保证了数据可靠传输。
(3)ACK机制
接收方在收到数据后,不是立即会给发送方发送ACK的。可能有以下原因:
A 收到数据包的序号前面还有需要接收的数据包。因为发送方发送数据时,并不是需要等上次发送数据被ACK就可以继续发送TCP包,而这些TCP数据包到达的顺序是不保证的,这样接收方可能先收到后发送的TCP包(注意提交给应用层时是保证顺序的)。
B 为了降低网络流量,ACK有延迟确认机制。
C ACK的值到达最大值后,又会从0开始。
(4)ACK延迟确认机制
接收方在收到数据后,并不会立即回复ACK,而是延迟一定时间。一般ACK延迟发送时间为200ms,但是这个200ms并非收到数据后需要延迟的时间。系统有一个固定的定时器每隔200ms会来检查是否需要发送ACK包。这样做有2个目的:
- 这样做的目的是ACK是可以合并的,也就是指如果连续收到两个TCP包,并不一定需要ACK两次,只要回复最终的ACK就可以了,可以降低网络流量。
- 如果接收方有数据要发送,那么就会在发送数据的TCP数据包里,带上ACK信息。这样做,可以避免大量的ACK以一个单独的TCP包发送,减少了网络流量。
比如:正常TCP断开是4次挥手,但是抓包抓到大部分都是3次挥手。就是延迟确认的结果吧。
二:浅议SACK
(1)SACK:
Selective Acknowledgement,选择性确认。
(2)功能
TCP收到乱序数据后会将其放到乱序序列中,然后发送重复ACK给对端。对端如果收到多个重复的ACK,认为发生丢包,TCP会重传最后确认的包开始的后续包。这样原先已经正确传输的包,可能会重复发送,降低了TCP性能。为改善这种情况,发展出SACK技术,使用SACK选项可以告知发包方收到了哪些数据,发包方收到这些信息后就会知道哪些数据丢失,然后立即重传丢失的部分。
需要注意的是只有收到失序的分组时才会可能会发送SACK,TCP的ACK还是建立在累积确认的基础上的。也就是说如果收到的报文段与期望收到的报文段的序号相同就会发送累积的ACK,SACK只是针对失序到达的报文段的。
(3)格式
SACK包括了两个TCP选项,一个选项用于标识是否支持SACK(SACK_permitted),是在TCP连接建立时时发送;另一种选项则包含了具体的SACK信息。
1)SACK_permitted选项
该选项只允许在TCP连接建立时,有SYN标志的包中设置,也即TCP握手的前两个包中,分别表示通信的两方各自是否支持SACK。
2)SACK信息选项
SACK信息选项用于通告对端接收数据的信息。
该选项参数告诉对方已经接收到并缓存的不连续的数据块,注意都是已经接收的,发送方可
根据此信息检查究竟是哪个块丢失,从而发送相应的数据块。
* Left Edge of Block
不连续块的第一个数据的序列号
* Right Edge of Block
不连续块的最后一个数据的序列号之后的序列号