TCP的滑动窗口是怎么回事,不来了解一下吗?

2022-11-18 15:26:38 浏览数 (1)

前言

我们知道tcp协议是可靠传输的协议,而tcp的可靠传输与滑动窗口协议密不可分,那么今天罗师傅就和大家一起探讨一下tcp的滑动窗口,tcp的滑动窗口到底是怎么回事?

TCP报文段的首部格式

在了解tcp的滑动窗口之前,我们需要先了解一下tcp报文的头部信息。

对于滑动窗口,我们需要关注的有以下几个字段。

1. 序号

在tcp连接中,数据是以字节流的形式进行发送,而传送的字节流中的每一个字节都需要按顺序编号,而tcp头部的序号字段保存的就是字节流的第一个字节的序号。该字段占4个字节。

2.确认号

接收方期望发送方下次发送报文段的第一个数据字节的序号,占4个字节。

3.窗口

该字段表示接收端的能接收数据的窗口的大小。这个窗口值会告诉发送端能够发送的最大的数据量(字节为单位),所以发送端发送的数据大小是需要小于该值的。占用两个字节,窗口值在0-2^16-1。

4.紧急指针

表示本次报文段中的紧急数据额字节数,占用2个字节。

好了,接下来我们步入正题。

滑动窗口协议

在发送端和接收端都维护了一个滑动窗口。

发送窗口:在没有接收到接收端的确认的情况下,发送端可以连续的发送窗口内的数据,发送出去的数据,在没有接收到接收端的确认时,需要暂时保存,以便在超时之后进行重传。发送窗口在接收到确认之后,就可以将成功接收的数据丢弃,并且向右移动窗口。

接收窗口:只有在接收窗口中的序号的数据才能被接收,接收窗口在接收到了数据之后,需要向发送端发送确认号,而且接收端需要按顺序对数据进行接收,例如,如果接收到了3,5,6,没有接收到4,那么只能确认3,而不能确认5,6,直到接收到4,才可以进一步确认数据4,5,6。接收窗口确认完数据之后就可以向右移动。

注意:tcp是全双工的,所以客户端和服务端既是发送端也是接收端,所以客户端有发送窗口也有接收窗口,服务端同样有发送窗口和接收窗口。

超时重传机制

根据前文我们已经知道了发送端只有在接收到接收端的确认号的时候,才算真正的将数据发送成功了。但是如果确认的报文丢失了,那么发送端该如何处理呢?如果没有收到接收端的确认报文,那么就需要进行超时重传才能保证协议的可用性,而接收端在每次接收到发送端的数据都需要进行确认。

超时重传时间的选择

超时重传的时间选择很关键,超时重传的时间是tcp最复杂的问题之一了。因为如果超时重传时间过小,那么就可能会导致数据多次重传,导致资源的浪费,而如果超时时间过大,那么就会导致空闲时间过大,网络传输的效率过低。

那么tcp是如何选择超时重试时间的呢?

tcp采用了一种自适应算法,它会记录每一个报端往返的时间RTT。tcp会根据RTT计算出一个加权平均往返时间,而tcp设置的超时时间就比加权平均往返值稍大。具体的计算是有公式的,感兴趣的同学可以自己研究下。

TCP的流量控制

什么是流量控制?简单来说就是发送端发送的数据的速度需要小于接收数据的速度,发送端不能发送的太快了,要让接收方来得及处理。

tcp通过滑动窗口进行流量控制,正是基于tcp首部的窗口字段,接收方会发送一个报文段,报文段会在首部设置窗口字段,表示接收端还能接收的数据的窗口大小,而tcp发送端会根据这个字段控制下次发送数据的大小。这样也就达到了流量控制的目的。

但是,同学们可以思考一下,这样会出现什么样的问题?

没错,如果只是这样,那么是有可能出现死锁问题的。我们举一个例子:

如果接收端向发送端发送了0窗口报文,那么此时发送端不能再发送数据,此时接收端的数据处理完,有了一定的存储空间,就向发送端发送一个非零窗口通知,而恰巧这个非零窗口的通知丢失了,那么发送端就会一直等待接收端的非零窗口通知,而接收端一直等待发送端发送数据,这样也就导致了死锁。

那么tcp是如何解决这个问题的呢?

tcp为每一个连接都设置了一个持续计时器,只要tcp接收到一次零窗口通知,那么就会启动计时器,如果计时器超时了,那么就会发送一个零窗口探测报文,而接收端接收到这个探测报文之后就会返回自己当前最新的可接收窗口值。

注意:即便接收端的接收窗口值为0,也必须要接收零窗口探测报文,确认报文以及携带紧急数据的报文,所以通过零窗口探测机制是可以打破死锁问题的。

最后

今天,罗师傅和大家一起探讨了TCP的滑动窗口机制,如果有任何疑问,欢迎在下方评论区留言。原创不易,如果本文对你有所帮助,那么点个赞再走吧。

相关文章# TCP是怎么实现可靠传输的

tcp

0 人点赞