2026-10-25 10:03:30
TCP 滑动窗口与接收窗口详解
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP通信中,为了保证数据传输的可靠性和效率,引入了滑动窗口机制。滑动窗口机制包括发送窗口和接收窗口,它们共同协作以控制数据的发送和接收。
一、接收窗口
接收窗口是TCP接收缓冲区的一部分,用于存储尚未被应用程序处理的传入数据。这个缓冲区有一个固定的大小,但其中的数据会随着时间的推移而被应用程序读取和处理,从而释放出空间。
作用:
控制发送端的发送速率,防止接收端缓冲区溢出。
通过告知发送端自己接收窗口的大小(即接收缓冲区中空闲的部分),使发送端能够调整其发送策略。
工作原理:
接收端在回复ACK(确认应答)包时,会带上自己当前的接收窗口大小。
发送端根据接收到的ACK包中的接收窗口大小,调整自己的发送窗口,以确保不会发送超过接收端处理能力的数据。
Wireshark抓包中的显示:
在Wireshark抓包工具中,可以观察到TCP头部中的“win”字段,它表示的就是接收窗口的大小。例如,“win=29312”表示接收窗口的大小为29312字节。
二、发送窗口(滑动窗口)
发送窗口是TCP滑动窗口机制的核心概念,它表示在某个时刻发送端能够拥有的最大未确认数据包的大小。发送窗口的大小决定了发送端在任意时刻能够发送多少数据而不必等待确认。
数据包状态:
已发送且已收到ACK确认的数据包(#1区域)。
已发送但未收到ACK确认的数据包(#2区域)。这部分数据发送端不确定接收端是否已接收,如果在一段时间内没有收到ACK,发送端需要重传这部分数据包。
未发送但接收端已经准备就绪可以接收的数据包(#3区域)。这部分数据是发送端可以立即发送的,因为接收端有足够的接收窗口。
还未发送,且这部分接收端没有空间接收的数据包(#4区域)。
发送窗口大小:
发送窗口的大小等于#2区域和#3区域加起来的总大小。它表示了发送端在任意时刻能够拥有的最大未确认数据包的大小。
可用窗口:
可用窗口是发送端还能发送的最大数据包大小,它等于发送窗口的大小减去在途数据包大小(即#2区域的大小)。对应于上图中的#3号区域。
特殊情况:
TCP Window Full:站在发送端角度,表示在途字节数等于对方接收窗口的情况。此时,发送端不能再发送数据给对方,直到发送的数据包得到ACK确认。
TCP zero window:站在接收端角度,表示接收端的接收窗口已满,告知对方不能再发送数据给自己。此时,发送端会停止发送数据,直到接收端释放出一些接收窗口空间并通知发送端。
总结
TCP滑动窗口机制通过接收窗口和发送窗口的协作,实现了对数据传输速率的精确控制。接收窗口通过告知发送端自己当前的接收能力,防止了接收端缓冲区的溢出;而发送窗口则通过限制发送端在任意时刻能够发送的数据量,保证了数据传输的可靠性和效率。这种机制使得TCP能够在不同的网络环境下,根据接收端的处理能力动态调整发送速率,从而实现高效、可靠的数据传输。