引言
TCP巨复杂!同时在八股计算机网络中也经常被问到,必须会!这篇文章将让小白有个大体框架,知道怎么个事,面试中可以有话说,也能让佬更加巩固知识点。
TCP是一个可靠的传输协议,为了保证它的可靠性,出现七七八八的机制,它可能有数据的破坏、丢包、重复以及分片顺序混乱等问题,TCP通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制来实现可靠性传输。
有什么问题,或者疑惑,欢迎评论留言,开始进入正题
重传机制
简要:针对数据包丢失进行重传
在网络传输的过程中,难免有包丢失情况,这时就需要重传,也就是重传机制去管控。
TCP实现可靠传输的方式之一就是通过序列号和确认应答保证。
常见的重传机制有:超时重传、快速重传、SACK、D-SACK
超时重传:数据包丢失或者确认信息丢失,超过一定时间后进行数据重传。
快速重传:在接收到三次相同的ACK值,就找到对应位置进行重传后面发送的报文,但是会导致发送已经接收到的数据,做了无用功浪费资源。
SACK方法:选择性确认,需要在TCP头中加入SACK的东西,可以将已收到的数据信息发送给发送方,就可以知道哪些数据没传,只重传丢失的数据
DSACK:直接发送SACK信息来告诉发送方有哪些数据被重复接受了。
滑动窗口
简:在接收窗口大小内不断发数据,避免发一个等确认信息才能再发
发送方每次等待一个确认消息才能继续发送,效率太低,于是采用滑动窗口,在接收窗口大小内可以不断发送数据。无需等待确认信息。通常窗口是由接收方决定的,告诉发送方自己有多少缓冲区来接收数据。一般发送窗口约等于接收窗口,因为传输过程存在时延
TCP头中有个window字段(表示窗口大小),告诉发送端自己还有多少缓冲区可以接收数据。于是发送端根据接收端处理能力发送数据,不会到时接受端处理不过来
流量控制
简:控制发送数据速率,避免对方处理不过来
让发送方根据接收方的实际接受能力控制发送的数据量的机制
栗子:
A对B发送数据,B对A进行流量控制(下面数据为举例)
发送窗口范围(4条,一条100字节)内发送3条数据,就收到B的累计确认,并发送rwnd=300 进行流量控制(接受窗口改成3条,发送窗口相应变成3条)。
A收到累计确认会删除前面三条缓存(如果有丢失,后面继续传丢失文件)然后在窗口范围(3条)内发送3条。收到B累计确认,并发送rwnd=100进行流量,(接受窗口改成3条,发送窗口相应变成3条)。
反复,若rwnd=0,A不能再发送,等B有缓存处理时,又会发送rwnd=300(有三条缓存)然后A再发送数据,但如果A没收到,AB无线等待对方,会有持续计时器,一定时间发送1字节探测,等待B回应 。
拥塞控制
简:面对网络中发生拥塞的机制
在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失,这时重传只会加重网络负担,导致更大延迟和包丢失,就陷入二性循环,发生超时重传就认为网络出现堵塞。
拥塞控制主要包括四个算法:慢启动,拥塞避免,拥塞发生,快速恢复
慢启动
TCP刚刚建立有个慢启动的过程,就是一点点提高发送数据包的数量,当发送方每收到一个ACK,拥塞窗口(cwnd)的大小就会加1表示可以比之前多发1个,cwnd数量呈指数倍增加,1248。当cwnd>= 慢启动门限ssthresh就会使用拥塞避免算法。
指数倍增加:
初始cwnd若为1,加1,为2.,可以发两个ACK,(cwnd两个,最多发2个)。
收到两个ACK,加2,为4,可以发四个ACK。
收到四个ACK,加4,为8,可以发八个ACK。
拥塞避免算法
每当收到一个ACK时,cwnd增加1/cwnd。因为可以发cwnd个,所以cwnd*(1/cwnd)=1个,这样cwnd数量就会变成线性增长。我们可以看到前面两种算法都是让他增加,网络慢慢进入拥塞状态,于是出现丢包现象,需要对丢失的包重传,进入拥塞发送算法
拥塞发生算法
发生后进行数据包重传
超时重传:门限变成cwnd/2,再重置cwnd为初始值
快速重传:认为只是少部分数据丢失,cwnd设置原来一半,门限=cwnd。进入快速恢复算法
快速恢复算法
-
拥塞窗口
cwnd = ssthresh + 3
( 3 的意思是确认有 3 个数据包被收到了); -
重传丢失的数据包;
-
如果再收到重复的 ACK,那么 cwnd 增加 1;
-
如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;
借用小林的图:
标签:窗口,重传,ACK,TCP,发送,拥塞,机制,cwnd From: https://blog.csdn.net/qq_62097431/article/details/137206136