【计网】05.TCP可靠性、UDP
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0
TCP可靠性
83.TCP相比UDP为什么是可靠的?:heart:
TCP的可靠性
TCP怎么保证可靠性
TCP为什么是可靠连接?
- 校验和:发送数据报的二进制相加然后取反,检测数据在传输过程中的变化,有差错则丢弃。
- 确认应答:接收方收到正确的报文就会确认。
- 超时重传:发送方等待一定时间后没有收到确认报文则重传。
- 序列号:发送方对每一个数据包编号,接收方对数据包排序,保证不乱序、不重复。
- 流量控制:滑动窗口机制,双方会协调发送的数据包大小,保证接收方能及时接收。
- 拥塞控制:如果网络拥塞,发送方会降低发送速率,降低整个网络的拥塞程度。
校认时序流拥
84.可以解释一下RTO,RTT和超时重传分别是什么吗?
RTO (Retransmission Timeout) 重传超时时间
RTO指的是在TCP协议中,发出数据包后等待接收确认ACK包的时间。如果在这个时间内没有接收到ACK包,TCP会认为数据包已经丢失,会启动重传机制。RTO时间的计算方式通常是基于最近的几次RTT(Round-Trip Time)的统计结果,如上图。出现超时重传时,为保证计算基本准确,不采用超时重传时的RTT,新RTO直接等于2倍的旧RTO。
RTT (Round-Trip Time) 往返时间
RTT指的是数据包从发送端到接收端返回的时间,也就是数据包从发送到接收,再从接收到发送的时间差。TCP通常会通过发送一个数据包,然后计算发送到接收再到回传的时间,来确定网络的传输延迟。RTT的值通常是不断变化的,因为它受到网络延迟、拥塞和带宽等因素的影响。
超时重传 (Timeout Retransmission)
超时重传是指在TCP协议中,如果在RTO时间内没有接收到ACK确认包,TCP会认为数据包已经丢失,会启动超时重传机制。TCP会将丢失的数据包进行重传,以保证数据的可靠性。超时重传的时间通常是由RTO时间决定的。
85.你了解流量控制原理吗?
TCP 利用滑动窗口实现流量控制的机制?
流量控制用于控制数据发送的速率,避免发送过多的数据导致网络拥塞和数据丢失。
TCP是全双工协议,双方可以同时通信,所以发送方接收方各自维护一个发送窗和接收窗。
- 发送窗:用来限制发送方可以发送的数据大小,其中发送窗口的大小由接收端返回的TCP报文段中窗口字段来控制,接收方通过此字段告知发送方自己的缓冲(受系统、硬件等限制)大小。
- 接收窗:用来标记可以接收的数据大小。
其原理如下:
- 接收方根据处理能力和缓冲区大小调整窗口大小
接收方的窗口大小不仅取决于它的处理能力,还取决于它的缓冲区大小。如果接收方的处理能力很强,但是缓冲区较小,那么它需要及时通知发送方缓冲区已经满了,以避免数据丢失。反之,如果接收方的处理能力比较弱,但是缓冲区很大,那么它可以适当增加窗口大小,以便更快地接收数据。
- 接收方通告窗口大小
接收方会向发送方发送一个通告窗口大小的值,用来告诉发送方它当前可接收的数据量大小。
- 发送方根据窗口大小控制发送速率
发送方会根据接收方通告的窗口大小来控制自己的发送速率。如果接收方通告的窗口大小为0,发送方就不能发送任何数据,直到接收方通告窗口大小变为非0值。如果接收方通告的窗口大小比发送方已经发送但未被确认的数据量小,发送方就需要暂停发送数据,等待接收方处理后再继续发送。
86.什么是TCP拥塞控制?以及达到什么情况的时候开始减慢增长的速度?
拥塞控制
我们发送到网络中的数据,当达到网络中的一个节点时(假设是路由器),它会根据数据包含的地址,帮我们将数据转发到离目的地更近的路由器,或直接转发到目的地。但是,这些路由器不是直接就可以转发的,它们需要先将接收到的数据放入自己的内存,再从中取出进行转发。
这里就面临一个问题:路由器的内存是有限的,若同一时间到达某个路由器的数据太多,这个路由器将无法接收所有的数据,只能将一部分丢弃;或者同一台路由器数据太多,后面到达的数据将要等待较长的时间才会被转发。网络中的数据太多,导致某个路由器处理不过来或处理地太慢,这就是网络拥塞。(可以理解为高速路上有车撞了,后面都动不了了,或者车太多了,走不动了)
所以TCP为了防止这种情况而进行了拥塞控制。
达到以下情况的时候开始减慢增长的速度(具体解释看下面几题)
- 达到重传计时器超时的时候开始使用拥塞避免算法减慢增长的速度
- 收到三个重复应答的时候开始使用快重传和快恢复算法减慢增长的速度
87.TCP四大拥塞控制算法?
所谓慢开始,也就是TCP连接刚建立,一点一点地提速,试探一下网络的承受能力,以免直接扰乱了网络通道的秩序。
- 连接建好的开始先初始化拥塞窗口cwnd大小为1,表明可以传一个MSS大小的数据。
- 每当收到一个ACK,cwnd大小加一,呈线性上升。
- 每当过了一个往返延迟时间RTT(Round-Trip Time),cwnd大小直接翻倍,乘以2,呈指数让升。
- 还有一个ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”
拥塞避免算法 – Congestion Avoidance
当拥塞窗口大小cwnd大于等于慢启动阈值ssthresh后,就进入拥塞避免算法。算法如下:
- 收到一个ACK,则cwnd = cwnd + 1 / cwnd。
- 每当过了一个往返延迟时间RTT,cwnd大小加一。
过了慢启动阈值后,拥塞避免算法可以避免窗口增长过快导致窗口拥塞,而是缓慢的增加调整到网络的最佳值。
快重传-拥塞发生状态时的算法
超时重传:RTO超时,TCP会重传数据包。TCP认为这种情况比较糟糕,反应也比较强烈:
- 由于发生丢包,将慢启动阈值ssthresh设置为当前cwnd的一半,即ssthresh = cwnd / 2.
- cwnd重置为1
- 进入慢启动过程
最为早期的TCP Tahoe算法就只使用上述处理办法,但是由于一丢包就一切重来,导致cwnd又重置为1,十分不利于网络数据的稳定传递。
所以,TCP Reno算法进行了优化。当收到三个重复确认ACK时,不用等到RTO超时再进行重传,TCP开启快速重传算法:
- cwnd大小缩小为当前的一半
- ssthresh设置为缩小后的cwnd大小
- 然后启动快速恢复算法。
对于丢包有两种判定方式,一种是超时重传RTO超时,另一个是收到三个重复确认ACK。
超时重传是TCP协议保证数据可靠性的一个重要机制,其原理是在发送一个数据以后就开启一个计时器,在一定时间内如果没有得到发送数据报的ACK报文,那么就重新发送数据,直到发送成功为止。
但是如果发送端接收到3个以上的重复ACK,TCP就意识到数据发生丢失,需要重传。这个机制不需要等到重传定时器超时,所以叫做快速重传,快速重传后启动快速恢复算法。
快速恢复算法 – Fast Recover
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础【本专栏】 3.硬件篇 4.嵌入式Linux (建议PC端查看)