目录
0 引言
前面一篇文章对TCP连接建立和关闭的知识进行了归纳,这篇将对TCP连接传输数据过程中的相关知识点进行归纳
1 TCP连接为什么是可靠的
在进入正题前,首先来一个问题:TCP连接为什么是可靠的?对于这个问题,主要由以下几点原因
- 校验和:TCP首部有一个校验和字段,通过该字段可以对传输的数据进行校验,来判断数据在传输的过程中是否出错
- 请求应答机制:我们的TCP报文的传输是基于请求应答机制的,也就是一方发送的报文一定会接受对方对于该报文的确认报文
- 重传机制:当我们的报文在网络中被阻塞或者丢失时会触发发送方的超时重传机制
- 滑动窗口和流量控制:基于滑动窗口的流量控制保证了接受方一致有足够的空间接受发送方的数据
- 拥塞控制:拥塞控制算法可以根据网络状况动态控制发送发发送窗口的大小
下面就对以上的部分原因进行详细介绍
2 重传机制
2.1 超时重传机制
当发送方放松一个报文会开启一个定时器,当定时器时间到了还没有受到报文的ACK报文时就会重传该报文,这个重传定时器的时间为RTO,一般略大于一个RTT时延
超时重传一般发生在发送报文或者接受方确认报文丢失的情况下
2.2 快速重传
快速重传是说当我们发送方反复接收到同一个ACK报文达到一定次数后就会重发原报文;过程示例如下:
- 发送方按序发送了五个序列号的报文seq1~5
- 其中seq2丢失了
- 服务端对于seq1报文回复ACK2报文
- 服务端对于后面的seq3~5报文同样回复ACK2报文
- 客户端发现接受到了3个重复的ACK报文,就知道seq2报文丢失了,开始重发seq2报文
2.3 SACK机制
超时重传机制和快速重传机制都存在一个问题,就是是重传一个报文还是重传后面所有的报文,引入sack即可帮我们解决这个问题;所谓的sack机制就是接收方在给发送方发送ACK报文时,会带上一个一个叫做sack的东西来告诉发送方自己的缓冲区接受数据的情况。就拿上面快速重传的例子来说,服务端对于seq3~5的ACK报文中会加上一个sack
-
<