TCP怎么保证可靠性?

一、校验和

概念
发送方从要发送的数据段中得到校验和,并填充校验和。接收方以同样方式计算校验和,与发送方进行对比。

结果
如果有误,传输错误,如果无误,不一定传输成功。

计算方式
将发送的数据段都当做一个16位的整数。将这些整数加起来。并且前面的进位不能丢弃,补在后面,最后取反,得到校验和。
在这里插入图片描述

二、序列号、确认应答

序列号
建立连接时由随机数作为初始值,每发送一次就累加一次数据字节数的大小。

确认应答
TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。
在这里插入图片描述

三、重传机制

超时重传
如果发送方发送完数据后,一定时间内没有等到接收方的ACK报文,那么对刚才发送的数据进行重新发送。有两种情况:
●接收方没收到:超时重传后接收方收到重发的数据,会回答ACK
●接收方收到了,回答的ACK丢了:超时重传后会丢弃重发的数据,回答ACK

超时时间:略微大于报文往返时间RTT的值,太大效率低,太小可能没丢就重发

快速重传
发送端如果收到 3 次相同ACK,就会立刻进行重发。
在这里插入图片描述

四、连接管理

三次握手四次挥手,这里不提

五、流量控制

作用
发送方可以根据接收方的实际接收能力控制发送的数据量。

过程
在TCP协议的报头信息当中,有一个16位字段的窗口大小。窗口大小的内容是接收端接收数据缓冲区的剩余大小。接收端会把即时窗口大小填入ACK报文发送过去。
发送方可以根据ACK报文里的窗口大小的值的改变进而改变自己的发送速度。如果接收到窗口大小的值为0,那么发送方将停止发送数据。并定期的向接收端发送窗口探测数据段,让接收端把窗口大小告诉发送端。
在这里插入图片描述

六、拥塞控制

与流量控制区别
流量控制是避免发送方的数据填满接收方的缓存,但是不知道网络中发生了什么。拥塞控制是为了避免发送方的数据填满整个网络。

解决问题
网络出现拥堵时,数据包会延时、丢失,如果继续发送大量数据包,TCP会重传数据,会导致网络负担更重。

拥塞窗口cwnd
发送方维护的一个状态变量,会根据网络的拥塞程度动态变化。

发送窗口的值是拥塞窗口和接收窗口中的最小值。
四个算法
●慢启动:
一点一点提高发送的数据包数量,一上来就发大量数据,就是给网络添堵。

发送方每收到一个ACK,拥塞窗口cwnd的大小就会+1。

慢启动开始发送少,但是增长速度非常快(指数增长)。到达阈值就会进入拥塞避免。

●拥塞避免
慢启动增长非常快,拥塞窗口超过慢启动门限ssthresh,每收到一个ACK时,拥塞窗口cwnd增加1/cwnd,变成了线性增长。

●拥塞发生
网络出现拥塞,会导致数据包重传。
1.出现超时重传(超时未收到):(1)ssthresh设为cwnd/2 (2)cwnd重置为1(一下回到解放前) (3)进入慢启动
在这里插入图片描述

2.出现快速重传(三次相同ACK):(1)cwnd = cwnd/2 (2)ssthresh = cwnd (3)进入快速恢复
在这里插入图片描述

●快速恢复
当出现快速重传时进入快速恢复,是因为收到3个重复ACK说明网络也不那么糟糕,没必要像超时重传一样。

猜你喜欢

转载自blog.csdn.net/qq_36459662/article/details/114269853