TCP如何保证可靠性

确认应答机制

TCP将每个字节的数据都进行了编号,即为序列号

每个ACK都带有对应的确认序列号,意思告诉发送者,我已经收到了哪些数据,下一次你从哪里发

缺点:对每一个发送的数据段,都要给ACK确认应答,收到ACK后再发送下一个数据段,这样性能较差,尤其是数据往返的时间较长的时候。

超时重传机制

可能性一:

主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B。

如果主机A在一个特定的时间间隔内没有收到B发来的确认应答,就会进行重发。

可能性二:

主机发送完数据未收到B发来的确认应道,可能是ACK丢失了

那么会导致主机A再次发送上一次发送的数据,因此主机B会受到很多重复数据,TCP就可以利用序列号来做到去重的效果。

滑动窗口

采用一次发多条数据,收到第一个ACK后,滑动窗口往后移动,直接发送第二部分数据。

会存在其中一个或多个数据没有应答的问题,操作系统内核为了维护滑动窗口,开辟发送缓冲区来记录当前还有哪些数据没有应答,只有确认应答过的数据才能从缓冲区删掉。

优点:网络吞吐量大

可能出现的情况

1,数据包抵达,ACK被丢了

    这种情况不要紧,会有后续的ACK进行确认。

2.数据包直接丢了


    这种情况接收端会反复提醒发送端下一次要收1001,如果发送端主机连续三次同样受到1001这样的应答,就会重新发送1001那一段数据。

流量控制

根据接收端的处理能力,来决定发送端的发送速度。

处理方法:接收端将自己可以接受的缓冲区大小放入TCP首部的“窗口大小”字段,通过ACK短通知发送端。

发送端会根据这个窗口大小来改变自己的发送速度。当窗口大小为0,发送方不再发送数据,但会定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。

拥塞控制

滑动窗口能够可靠高效饿发送大量的数据,但是如果在刚开始阶段就发送大量的数据会造成网络拥堵,

在不清楚当前网络状态下,贸然发送大量数据是不安全的。

TCP引入慢启动机制,先发送少量的数据探探路,再决定按照多大速度传输数据。

慢启动->线性增长->阈值->慢启动...

延迟应答

因为窗口越大,网络吞吐量就越大,传输效率就越高。

如果接受数据的主机立即返回ACK应答,这时候返回的窗口可能比较小。可以稍作延迟等待接收端处理数据后把一个更大的窗口返回。

延迟应答规则:每隔2个包就应答一次。

                        超过最大延迟时间就应答一次,超时时间一般取200ms


猜你喜欢

转载自blog.csdn.net/moralin_/article/details/80378230