众所周知,TCP协议是一个基于字节流的传输层协议,它位于应用层之下和网络层之上,它提供了可靠的机制,能保证数据有序、可靠地到达对方系统。TCP连接首先会经过三次握手,三次握手成功之后连接就建立起来。此时发送方会将数据发送给接收方,接收方的系统内核接收到数据之后,一般会先将数据放到系统缓冲区中,直到系统发生中断后再处理。
在网络传输过程中,IP头部占用了20字节,TCP头部占用了20字节,换言之,每一次传输TCP报文都会有40字节的固定消耗。因此通信双方总是倾向于发送尽可能大的报文以提高网络效率。
由于通信双方处理数据的性能有所差异,如果接收到的数据大于自己的处理能力,就会引起问题。为了避免对方无限量地推送信息过来,在数据传输的过程中要进行流量控制,接收方在接收数据后,会发送ACK确认,此时就需要告知对方自己能够一次最多处理的字节数,以便对方能按照自己设定的数据大小来传输数据,这就是【滑动窗口】。
假设通信双方建立了一条TCP连接,我们就可以对某一时刻的数据进行快照,这时我们的发送方的窗口可以分为以下四部分:
如图所示,发送方的窗口快照可以将窗口分为四个部分:
Category 1:已发送且已收到ACK确认的部分:1-31字节
Category 2:已发送但未收到ACK确认的部分:32-45字节
Category 3:未发送且在接收方范围内的部分:46-51字节(这部分数据仍在对方系统处理能力之内)
Category 4:未发送但数据大小超过对方系统处理范围之外的部分:52以后的字节