🍑滑动窗口
滑动窗口存在的意义就是在保证可靠性的前提下,尽量提高传输效率!!!
先来看如果不使用滑动窗口,传输是怎样进行的
如上图所示,我们这样发送一次,收到确认后再发送一次,这样重复的操作是很费时间的。我们把大量的时间都花费在了等待ACK响应上。
于是就有了滑动窗口这样一个机制——一次发送一波数据,然后等待接收方的响应ACK(表示当前接收方已经收到了第xxx个字节的数据,你接着发送就好,窗口就进行了滑动)
上面这段话,你可能不同理解,没关系,接着往下看就好——让我们看看什么是窗口?什么是滑动?
看到这里,想必你已经对滑动窗口这个概念有了一个初步的认识,但是这里还是有些小问题。滑动窗口是提示了发送效率。但是如果出现了丢包该怎么办?
丢包分为两种情况
第一种:ACK丢了
第二种:数据包丢了
总结:
滑动窗口提高发送效率(但可能会影响数据的可靠性)
于是就有了流量控制、拥塞控制来对滑动窗口的发送速率做一个限制(让滑动窗口的大小在一个合理的范围,让他别一次发那么多数据,接收方可以来不及接收,容易造成丢包)
那么具体是怎样来限制呢?
🍑流量控制
对于流量控制——就是根据接收方的处理能力(接收缓冲区剩余空间大小)通过ACK确认报文段来告知发送方当前接收缓冲区中的剩余空间大小是多少,然后发送方就根据这个数据来不断的改变当前滑动窗口的大小。
那么问题来了,这个所谓的接收缓冲区大小是个什么东东?
那么如何让我们的发送方知道当前接收方的接收缓冲区的大小呢?
理论说完了,我我们来看一个例子
如上图所示:第一次收到接收方的ACK时候,此时的接收缓冲区的大小还是3000字节,然后随着发送方数据的不断发送,这个值不断的减小。终于当接收发收到了发送方的第4000个字节(下一个要接收的字节是4001的时候,此时接收缓冲区满了,发送方就会暂停发送数据.....就这样通过接收缓冲区来动态的调整发送方滑动窗口的大小。
🍑拥塞控制
流量控制是站在接收方的角度来控制发送速率的(滑动窗口大小)的, 但是对于整体的网络传输而言,不光有发送方和接收方,还有中间各自转发设备。
既然知道了拥塞控制—— 就是从中间这一系列的转发设备来考虑,进而来限制发送方的发送速率(滑动窗口大小)的,那么他处理的具体流程是什么呢?
中间可是有很多设备的,又多又杂,不好处理呀!
总结:
总结
TCP三大核心特性:
面向连接
可靠传输(通过确认应答、超时重传、流量控制、拥塞控制、延迟捎带应答等机制实现)
字节流传输