这里写目录标题
TCP保证可靠性一般有以下几种方法:
(1)确认应答:ACK和序列号
(2)超时重传:发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送
(3)流量控制:控制发送方发送窗口的大小来实现流量控制
(4)拥塞控制:控制传输上流量
确认应答
TCP通过ACK实现可靠的数据传输。当发送端将数据发出之后会等待对端的确认应答,如果有确认应答,说明数据已经成功到达,如果没有,那么数据有可能丢失了,发送端就会进行重发。未收到确认应答也并不意味着数据一定丢失,有时也有可能是因为数据收到,但是ACK却在传输的途中丢了。因此这种情况也会导致发送端因没有及时收到ACK,而认为数据没有到达目的地,从而进行重传。
确认应答有时可能会延时到达,此时发送端会误认为数据丢失,所以会反复触发重传。因此接受主机就会反复接收到相同的数据。为此就必须要引入一种机制,使其能够识别是否已经接受数据,又能判断是否需要接受。序列号是按照顺序给发送数据的每一个字节都标上号码的编号。接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接受的序号作为确认应答返送回去。就这样,通过序列号和确认应答号,TCP可以实现可靠传输。
超时重传
在讨论超时重传之前,我们需要了解RTT和RTO:
- RTT(Round Trip Time):一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值。
- RTO(Retransmission Time Out):重传超时时间,即从数据发送时刻算起,超过这个时间便执行重传。
RTT和RTO 的关系是:由于网络波动的不确定性,每个RTT都是动态变化的,所以RTO也应随着RTT动态变化。
超时重传指的是如果在收到ACK之前,定时器到期,协议栈就会认为这个片段丢失,需要重新传送数据。这个等待时间即为RTO,其开始是一个预设的值(Linux 规定为1s),随着通讯的变化以及时间的推移,这个定时器的溢出值也应随着RTT动态变化,有很多算法计算RTO。
流量控制
如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。
所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
滑动窗口机制概述
滑动窗口技术通过动态改变窗口大小来调节两台主机间数据传输,相互连接的主机间存在两个滑动窗口:一个用于接收数据,另一个用于发送数据。根据接收端的接收情况,动态去调整窗口大小,然后来控制发送端的数据流量。
- 发送窗口:在任意时刻,发送方都维持一组连续的