为实现可靠传输,需要考虑数据破坏,丢包,重复以及分片顺序混乱等问题。TCP通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠传输。
重传机制
- 超时重传
- 发送数据时设定一个定时器,指定时间后没有收到对方ACK,就会触发超时重传。
- 超时重传RTO应该略大于报文往返RTT的值。
- 如果超时重发的数据再次超时,又需要重传,TCP的策略是超时时间加倍。
- 快速重传
- 不以时间为驱动,以数据为驱动。
- 当收到3个相同的ACK报文是,会在定时器过期之前,重传丢失的报文段。
- 解决了超时时间问题,但是不知道重传时需要重传一个还是重传所有。
- ASCK
- 选择性确认。在TCP头部字段里加一个SACK,将已收到的数据信息发送个发送方,这样发送方就可以知道哪些数据没收到,进而重发。
- Duplicate SACK
- 使用SACK告诉发送方有哪些数据被重复接收
滑动窗口
- 引入窗口概念的原因
- 一收一发传输方式有缺点,数据包往返时间越长,通信效率越低。
引入窗口后,即使在往返时间较长的情况下,也不会降低网络通信的效率。窗口大小,指的是无需确认应答,而可以继续发送数据的最大值。发送方机器在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
- 窗口大小有哪一方决定
- 接收方,发送方发送的数据大小不能超过接收方的窗口大小,否则接收方无法正常接收大奥数据。
流量控制
发送方不能无脑的发送数据给接收方,要考虑接收方的处理能力。如果一直无脑发送给对方,但对方处理不过来,那么就会触发重传,从而导致网络流量无端浪费。
拥塞控制
只要发送方没有在规定时间内接受到ACK报文,也就是发生了超市重传,就会认为网络出现了拥塞。
- 慢启动
- 指数性增长
- 慢启动门限前使用慢启动算法,门限后使用拥塞避免算法
- 拥塞避免
- 线性增长
- 拥塞发生
- 超时重传:门限设为cwnd/2,cwnd重置为1。激进,会造成网络卡顿
- 快速重传:cwnd=cwnd/2,门限=cwnd
- 快速恢复