这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记。
这一篇,依旧是计算机网络的深入学习,这篇文章的主题是TCP如何保证可靠传输。
重传机制
超时重传
重传机制的其中一个方式,就是在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的 ACK 确认应答报文,就会重发该数据,也就是我们常说的超时重传。
TCP 会在以下两种情况发生超时重传:
- 数据包丢失
- 确认应答丢失
超时重传时间 RTO 的值应该略大于报文往返 RTT 的值,过快或者过慢都不行,会导致传播速率降低、以及不必要的重传的问题。
快速重传机制
当数据包丢失,而又收到了后续的seq序列的报文,接收方的ACK不会累加,而是停留在“期望”接收到的序列号,当发送方接收到三次同样的ACK时,就会触发重发机制(无论定时器是否超时)
- SACK方法可以在缓存的地图发送给对方,这样子就可以确定具体的重传内容
流量控制
如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。
这时候就需要有一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。
TCP通过以字节为单位的滑动窗口实现流量控制。
- 当滑动窗口为0时,发送端有一个定时器,到时会发送具有1窗口探测报文,避免死锁问题
滑动窗口
为什么要有窗口?窗口的具体实现是什么?
一应一答的效率,会在数据包的往返时间久时被放大。于是引进了窗口的概念。
窗口的实现是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据(以便在超时重传使用)。如果按期收到确认应答,此时数据就可以从缓存区清除。
当收到对方对已收到报文的确认时,窗口向前滑动。
拥塞控制也属于“如何保证可靠传输”,但由于篇幅问题,我将在第四篇叙述。