TCP学习 | 青训营笔记
这是我参与「第四届青训营」笔记创作活动的第7天。今天笔记内容是TCP 重传、滑动窗口、流量控制、拥塞控制
参考书籍:《图解网络》v3.0
TCP如何实现可靠性传输
TCP 是通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输的。
TCP重传机制
TCP 针对数据包丢失的情况,会用重传机制解决。 常见的重传机制:
- 超时重传
- 快速重传
- SACK
- D-SACK
超时重传
在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的 ACK 确认应答报文,就会重发该数据。TCP会在以下两种情况发生超时重传:
- 数据包丢失
- 确认应答丢失
RTT 是Round-Trip Time 往返时延,数据从网络一端传送到另一端所需的时间;
RTO 是Retransmission Timeout 超时重传时间;
当RTO较大时,重发就慢,没有效率,性能差;当RTO较小时,会导致可能并没有丢就重发,于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。因此RTO的值应该略大于RTT的值。
快速重传
超时触发重传存在的问题是,超时周期可能相对较长。而快速重传(Fast Retransmit)机制,它不以时间为驱动,而是以数据驱动重传。
快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。然而重传的时候,不知道该重传哪些 TCP 报文。
SACK
SACK(Selective Acknowledgment 选择性确认),在 TCP 头部「选项」字段加⼀个 SACK,它可以将缓存的地图发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。
D-SACK
Duplicate SACK使用了SACK来告诉发送方有哪些数据被重复接收了。
TCP滑动窗口
TCP每发送⼀个数据,都要进行一次确认应答。而数据包的往返时间越长,通信的效率就越低。所以TCP引入了窗口这个概念,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。
TCP 头有⼀个字段叫 Window ,也就是窗口大小。 这个字段是接收端告诉发送端还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。
发送方的窗口
可用窗口大小 = SND.WND -(SND.NXT - SND.UNA)
接收方的窗口
TCP流量控制
TCP 提供一种机制可以让发送方根据接收方的实际接收能力控制发送的数据量,这就是所谓的流量控制。运用TCP报文段中的窗口大小字段来控制,让接收方指明希望从发送方接收的数据大小(窗口大小)。发送方的发送窗口不可以大于接收方发回的窗口大小。
接收方若没有缓存足够使用,就会发送零窗口大小的报文,窗口大小为 0 时,就会阻止发送⽅给接收方传递数据,直到窗口变为非 0 为止,这就是窗口关闭。
如果接收方返回的窗口非0报文在中途丢失,那么发送方的发送窗口就一直为零导致死锁。
TCP为每一个连接设置一个持续计时器(persistence timer)。只要TCP的一方收到对方的零窗口通知,就启动该计时器,周期性的发送一个零窗口探测报文段。对方就在确认这个报文的时候给出现在的窗口大小.
TCP拥塞控制
流量控制是避免发送方的数据填满接收方的缓存;拥塞控制的目的就是避免发送方的数据填满整个网络。
拥塞控制主要是四个算法:
- 慢启动
- 拥塞避免
- 拥塞发生
- 快速恢复