四、滑动窗口控制
上面介绍了TCP将数据分段发送,虽然提高了传输的可靠性,但是存在着一个致命的缺点,那就是效率非常低,因为每送一段都要等待接收端的确认应答,若整个数据的分段较多,那么通信的性能可能就会很低了,因此TCP引入了窗口这个概念
所谓窗口,表示的是无需等待确认应答而可以连续发送的连续多段数据的区域,如图
我们假设每段数据长度为1000,这里的窗口大小为4段,因此发送端可以将这四段数据都分别发送出去并且不需要发送一段数据以后等待一个确认应答,如图
此时的窗口包含4个段,即窗口内包含4000个字节的数据,我们称之为窗口大小
接收端在返回相应的确认应答给发送端时,发送端会根据收到的确认应答,继续发送比该确认应答中序列号大4000的数据,如图所示
五、滑动窗口的重发控制
若使用了滑动窗口控制这一技术后,即使某段数据出现了丢包现象,也不会造成太大的影响,因为接收端会一边接收发送端传过来的数据,一边用某种方式告知发送端刚才丢失了哪段数据
接下来我们来介绍一下其作用过程,如图所示
图中,在发送第二段数据(1001 ~ 2000)时发生了丢包,因此接收端没有接收到对应的包,所以当发送端传过来第三段数据的时候,接收端返回的仍是第二段的确认应答,紧接着发送端分别发送了第四段、第五段数据,可接收端都返回的是第二段的确认应答
就这样连着三次发送了同一个确认应答给发送端,所以发送端得知刚才传输数据的过程中第二段数据发生了丢包,因此此时会将丢失的数据重发一份
然后接收端在接收到之前丢掉的那段数据以后,因为之前的数据都成功接收了,所以下一次就开始请求 5001 ~ 6000 这段数据了
六、流控制
有时,发送端发送给接收端的数据超过了接收端的最大承载能力,因此会造成数据无法接收的情况,从而导致之后会进行数据重发,这非常得浪费性能。
为了防止上述情况得发生,TCP提供了一种机制可以使发送端每次发送的数据尽可能得在接收端得承载能力之内,而其实现得方式就是接收端向发送端告知自己能够接收的数据大小,因此发送端每次发送的数据就都不会超过该值,我们称该值为窗口大小
一旦接收端暂时无法接收任何数据,它会告知发送端,因此发送端会暂停数据的发送,但为了后续数据的正常发送,发送端会不时地向接收端发送一个窗口探测,试探性地看一下接收端是否能继续接收数据了
具体的过程如下图所示
七、拥塞控制
因为出现了窗口控制,数据不再是一段一段发送,而是连续发送多段数据包,因此有时如果遇到网络拥堵的情况,而我们又同时发送了大量的数据包,可能会导致网络瘫痪
TCP运用了一种叫做慢启动技巧缓解了上述情况,何为慢启动呢?就是不要在一开始就瞬间发送大量数据包,而是先发送一部分,然后根据收发情况再发送更多的数据包
具体过程我们来看一下
如图中,发送端的窗口大小为1000,因此只发送了一段长度为1000字节的数据包,此时接收端收到数据并返回一个确认应答,因此发送端将窗口大小加一,即窗口大小为2000 ;发送端又发送了两段长度为1000的数据包,接收端收到数据并返回两个确认应答,因此发送端将窗口大小加二,即窗口大小为4000 ;以此类推
总结:
发送端每次发送的数据包会以1,2,4的指数型增长
但窗口大小也不会无限指数型增大,而是会在达到某个值时进行一些调整,该值称为慢启动阈值