很多程序员朋友最近都在找工作,年底了领完年终奖,过完年就到新的公司上班,美滋滋。在程序员面试中,特别是后台开发工程师与运维工程师,计算机网络都是每回必问的,而TCP协议,更是面试中的重中之重。 说起TCP协议,很多程序员都对三次握手、四次挥手都已经背得滚瓜烂熟,但是对于TCP一些其他的特性却没能掌握好,今天我们来讲另外一个常见的面试问题,TCP滑动窗口协议。 大家都知道,我们从一台机器向另外一台机器发送数据的时候,数据并不是一口气也不可能一口气传输给接收方。这个并不难理解,因为网络环境特别的复杂,有些地方快有些地方慢。所以,操作系统把这些数据写成连续的数据包,并且以一定的速率发给对方。 一定的速率怎么理解呢?网络环境就像复杂的交通链路。就好比一个沙漏,中间可能有一个地方流量非常的小,这个最小的口径决定了网络传输的真正速度。我们要考虑到带宽缓冲区等因素,如果一下子发送所有的数据只会加大网络压力,造成丢包重试,轻则传输更慢,重则网络奔溃。 因为TCP是顺序发送的,操作系统将这些数据包一批一批的发送给对方,就像一个窗口,不停地往后移动,所以,我们称之为TCP滑动窗口协议。 在TCP中,窗口的大小是在TCP三次握手后协定的,并且窗口的大小并不是固定的,而是会随着网络的情况进行调整。这个也不难理解,原本你女朋友在家独享10M的宽带,你下班要上虎牙看网址荣耀直播,两个人就要共享这个宽带。TCP为了更好的传输效率,就会调整窗口的大小。 我们通过一个图来解释下滑动窗口的工作流程,对于发送端来说,即将要发送的数据包排成一个队列,对于发送者来说,数据包总共分成四类。分别是在窗口前的,已经发送给接收方,并且收到了接收方的答复,我们称之为已发送。在窗口中的,有两种状态,一个是已经发送给接收方,但是接收方还没确认送达,我们称之为已发送未确认,另外一个是可以发送了,但是还没有发送,我们称之为允许发送未发送。最后的是在窗口外面的,我们称之为不可发送,除非窗口滑到此处,否则不会进行发送。 就这样,一旦前面的数据已经得到服务端确认了,这个窗口就会慢慢地往后滑,如下图所示,P1,P2两个数据包被确认之后,窗口就往后移动,后面新的数据包就由不可发送待发送变成了可发送状态了。 TCP的滑动窗口协议有什么意义呢?首先当然是可靠性,滑动窗口只有在队列前部的被确认之后,才会往后移动,保证数据包被接收方确认并接收。其次是传输效率,假如没有窗口,服务端是杂乱无章地进行发包,因为TCP的队首效应,如果有前面的包没有发送成功,就会不停的重试,反而造成更差的传输效率。最后是稳定性,TCP的滑动窗口大小,是整个复杂网络商榷的结果,会进行动态调整,可以尽量地避免网络拥塞,更加稳定。 |