详细说说 TCP 的滑动窗口?
详细说说 TCP 的滑动窗口?
TCP发送数据时,通常需要等待接收方发送确认应答之后才能继续发送下一个数据。这种方式会导致效率较低,类似于在聊天中等待对方回复才能继续发言。
为了解决这个问题,TCP引入了窗口的概念,它是操作系统为TCP开辟的缓存空间。窗口大小表示发送方无需等待确认应答就可以继续发送数据的最大值。
在TCP报文头部中,有一个名为窗口大小(win)的16位字段,它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以根据窗口大小控制发送数据的速率,实现流量控制的目的。
简单来说,接收方每次收到数据包时,在发送确认报文的同时,还会告知发送方自己的接收缓冲区还有多少空闲空间,这个空闲空间就被称为接收窗口大小。这样发送方就可以根据接收窗口大小来控制发送数据的量。
TCP的滑动窗口可以分为发送窗口和接收窗口。发送窗口包含四个部分:
- 已发送且已收到确认的数据
- 已发送但尚未收到确认的数据
- 未发送但可以发送的数据
- 未发送且不可发送的数据
- 深蓝色框里就是发送窗口。
- SND.WND: 表示发送窗口的大小, 上图虚线框的格子数是 10 个,即发送窗口大小是 10。
- SND.NXT:下一个发送的位置,它指向未发送但可以发送的第一个字节的序列号。
- SND.UNA: 一个绝对指针,它指向的是已发送但未确认的第一个字节的序列号。
接收方的滑动窗口包含三大部分,如下:
- 已成功接收并确认
- 未收到数据但可以接收
- 未收到数据并不可以接收的数据
- 蓝色框内,就是接收窗口。
- REV.WND: 表示接收窗口的大小, 上图虚线框的格子就是 9 个。
- REV.NXT: 下一个接收的位置,它指向未收到但可以接收的第一个字节的序列号。