一文带你搞定TCP滑动窗口 讲一下tcp滑动窗口
什么是滑动窗口?
窗口是操作系统开辟的一块缓存空间,发送方在收到接收方ACK应答之前,必须在缓冲区保留已发送的数据,如果按期收到确认应答,数据就可以从缓冲区移除。
什么是滑动窗口大小?
窗口大小就是指无需等待ACK,可以继续发送数据的最大值。
什么是累计确认?
假设发送方发送了100-199、200-299、300-399的数据包,接收方都收到了,但此时200-299的ACK发生了丢失,但是发送方依然可以通过300-399的数据包的ACK 400知道200-299的数据包已被发送方接收,这种模式就叫做累计确认。
窗口大小由谁决定?
TCP首部中的窗口大小是接收方告诉发送方自己还有多少缓冲区可以接收,发送端会根据这个值来发送数据,避免接收端处理不过来。
窗口大小由接收方的窗口大小决定,通常情况下发送方发送的数据大小不能超过接收方的窗口大小。
发送方滑动窗口
发送方的窗口主要分为四部分:
- #1:已发送并收到ACK确认的数据,1~31字节
- #2:已发送但未收到ACK确认的数据,32~45字节
- #3:未发送但总大小在接收方处理范围内的数据,46~51字节
- #4:未发送但总大小超过接收方处理范围的数据,52以后的字节
发送窗口需要借助三个指针来实现:
- SND.WND:发送窗口的大小(由接收方指定)
- SND.UNA:表示已发送但未收到ACK确认的数据的第一个字节,这里是绝对指针
- SND.NXT:表示未发送但是可以发送范围的第一个字节号,这里是绝对指针:
- #4区域的第一个字节可以通过SND.UNA+SND.WIND计算得出
可用窗口的大小为:SND.WIND - (SND.NXT - SND.UNA)
接收方的滑动窗口
接收方窗口分为三部分:
- #1+#2:已成功接收并确认的数据(等待应用程序读取)
- #3:未收到但是可以接收的数据
- #4:未收到并且无法接收的数据
接收窗口需要借助两个指针实现:
- RCV.WND:接收方的窗口大小,该值会告诉发送方
- RCV.NXT:期望发送方下一次发送过来数据的字节号
- #4的第一个字节号可以使用RCV.NXT + RCV.WND获得
接收窗口和发送窗口大小相等么?
接收方窗口约等于发送窗口大小。