TCP的可靠性保证机制

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-13 22:31:27

TCP的可靠性保证机制

前言

我们常说,UDP是不可靠的通信协议,而后来发展的TCP弥补了UDP的不可靠缺陷,那么TCP是靠什么来保证可靠性的呢?

0X10 序列号、确认应答、超时重传

当接收方收到报文时就会确认,如果发送方发送一段时间后没有确认就重传

0X11 窗口控制与高速重发控制/快速重传(重复确认应答)

TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定要等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值
如果数据段1001-2000丢失,后面数据每次传输,确认应答都会不停地发送序号为1001的应答,表示我要接收1001开始的数据,发送端如果收到3次相同应答,就会立刻进行重发
接收窗口:在这里插入图片描述
“接收窗口”大小取决于应用(比如说tomcat:8080端口的监听进程)、系统、硬件的限制。图中,接收窗口是31~50,大小为20。
  在接收窗口中,黑色的表示已收到的数据,白色的表示未收到的数据。
  当收到窗口左边的数据,如27,则丢弃,因为这部分已经交付给主机;
  当收到窗口左边的数据,如52,则丢弃,因为还没轮到它;
  当收到已收到的窗口中的数据,如32,丢弃;
  当收到未收到的窗口中的数据,如35,缓存在窗口中。

发送窗口
在这里插入图片描述

0X13 拥塞控制

如果窗口很大,发送端连续发送大量的数据,可能会造成网络的拥堵,TCP为了防止这种情况从而设计了拥塞控制

慢启动:定义拥塞窗口,一开始将该窗口大小设为1,之后每次收到确认应答(经过一个rtt),将拥塞窗口大小*2

拥塞避免:设置慢启动阈值,拥塞避免是指当拥塞窗口大小达到这个阈值,拥塞窗口的值不再指数上升,而是加法增加(每次确认应答/每个rtt,拥塞窗口大小+1),以此来避免拥塞

将报文段的超时重传看做拥塞,则一旦发生超时重传,我们需要先将阈值设为当前窗口大小的一半,并且将窗口大小设为初值1,然后重新进入慢启动过程

快速重传:在遇到3次重复确认应答(高速重发控制)时,代表收到了3个报文段,但是这之前的1个段丢失了,便对它进行立即重传。

然后,先将阈值设为当前窗口大小的一半,然后将拥塞窗口大小设为慢启动阈值+3的大小

这样,在TCP通信中,网络的吞吐量呈现逐渐上升,并且随着拥堵来降低吞吐量,再进入慢慢上升的过程,网络不会轻易发生瘫痪
在这里插入图片描述

0X14 流量控制

简单来说就是接收方处理不过来的时候,就把窗口缩小,并把窗口值告诉发送端在这里插入图片描述
死锁:
当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。但是如果这个窗口不为0的应答在传输过程丢失,发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁

为了避免死锁,TCP采用了持续计时器,每当发送者收到一个零窗口的应答后就启动该计时器。时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回零窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!