此为面经第四谈!可以关注我,每日带你深入浅出一个新面经。
我们要了解面经要如何“说”!
很重要!很重要!很重要!
我们通常采取总-分-总方式来阐述!(有些知识点,你可以去了解,但是面经并不是需要全部了解的)
码农不易,各位学者学到东西请点赞支持支持!
开始部分:
总:TCP保证可靠性是利用了四个机制。
分:一、重传机制:
用于解决数据丢失的问题。
通过序列号和确认应答机制来实现。
重传的方式有两种:一种是超时重传,启动定时器,指定时间内没有收到将重传(设置一个RTO应答超时时间>RTT往返时间)。第二种是快速重传,超时之前,收到部分确认包,从而发送端知道哪些数据包丢失,立刻重传丢失的数据,这是基于SACK机制来实现的(SACK:接收方将已收到的数据告知发送方,只需要重传丢失的数据)。
基于SACK拓展了一个D-SACK的机制,接收方把重复接收的包通过D-SACK告知对方,然后发送方可以根据D-SACK的信息判断丢失的原因:比如说数据包丢失、ACK包丢失、网络延时等等。
二、滑动窗口
解决无需为每个数据包应答,否则吞吐量太低。
窗口:就是没有应答的情况下,发送方可以发送多少数据。
滑动:收到确认后,发送方移动窗口,发送更多数据。
发送滑动窗口约等于接收滑动窗口。
接收方通过TCP头部字段window就可以告知发送方的窗口的大小为多少合适。
三、流量控制
通过接收方的处理能力来限制发送方发送的数据量,避免丢包。
控制的方法通常有两种:1.通过接收方收缩窗口,通知发送方减缓发送速度。
2.调整缓存区大小:通过调整接收方缓存区的大小,影响其窗口大小,间接控制发送方的发送速率。
四、拥塞控制
通过发送方调整数据发送速率来避免网络过载。
拥塞是如何产生的?超时重传会触发拥塞控制。(如果网络发送拥塞时,继续发送大量的数据包,可能导致数据包延时以及丢失,造成更多的重传从而陷入死循环)。
在了解要如何控制之前,我们要了解一个属性,拥塞窗口(cwnd)表示根据当前网络状况,发送方允许发送最大的数据量。
有四种策略来控制拥塞窗口的大小。
1.慢启动:初始化拥塞窗口为1,每收到接收方的一个ACK包,拥塞窗口+1。
慢启动使拥塞窗口呈指数增加,一直到慢启动的门限(65535)。
2.拥塞避免:超过慢启动门限后,拥塞窗口呈线性增加,减缓发送速率,这种现象叫做拥塞避免。
3.拥塞发生:
分为两种情况:①超时重传:如果发送的数据包超时没有收到确认,说明网络可能出现了拥塞。此时,拥塞窗口(cwnd)被设置为1 (重头开始),并且慢启动门限(ssthresh)设置为当前拥塞窗口的一半。这是为了减少发送速率,缓解网络拥塞。
②快速重传:当接收到三个重复的ACK时,通常表示某个数据包丢失了,但网络拥塞不严重。此时,拥塞窗口减少一半(即cwnd = cwnd / 2
),慢启动门限设置为当前拥塞窗口的值(即ssthresh = cwnd
)。之后,进入快速恢复阶段。
4.快速恢复:
快速恢复是快速重传造成拥塞后采用的策略,其实就是直接进入拥塞避免,避免慢启动低速发送数据的阶段。
总:其实实现TCP的可靠性的四个机制都是围绕控制发送与接收的速率和完整性而设计的。(发送与接收的速率主要体现在后三个机制,第一个机制保证了包的完整性)。