一文带你搞定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获得

接收窗口和发送窗口大小相等么?

接收方窗口约等于发送窗口大小。

相关文章

3000字讲讲TCP协议,握手挥手不是你想的那么简单

专注于Java领域优质技术,欢迎关注作者: tobe 来自:tobe的呓语上一次讲了 UDP 协议,从这次开始,就要讲 TCP 协议了,因为 TCP 协议涉及到的东西很多,一篇文章概括不完,所以我把...

Java编程-TCP JAVA编程手机软件

1.1. Java的TCP面向连接, 数据安全, 区分服务器端和客户端.TCP分为Socket(客户端)和ServerSocket(服务端)需要分别建立客户端和服务器端客户端和服务端建立连接后,通过S...

Java网络编程---TCP通信 java的tcp通讯协议数据传输

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信Java对基于TCP协议的网...

一文带你搞定TCP流量控制 tcp流量控制算法

摘要理想的流量控制实际的流量控制窗口关闭糊涂窗口综合征理想的流量控制什么是流量控制?流量控制就是发送方不能无脑的给接收方发送数据,它需要根据接收方的处理能力来发送数据。理想下的流量控制?理想意味着在实...

有关TCP协议,这是我看过讲的最清楚的一篇文章了!

TCP 协议是网络传输中至关重要的一个协议,它位于传输层。向上支持 FTP、TELNET、SMTP、DNS、HTTP等常见的应用层协议,向下要与网络层的 IP 协议相互配合,实现可靠的网络传输。分层网...

Java的UDP和TCP使用方法和案例 java udp socket编程主要用到的两个类

一.UDP1.UDP发送数据2.UDP接收数据bys若直接转换成String进行输出,若发送的数据没占满数组那么大则会输出一堆空字符串二.TCP1.TCP发送数据Socket 里直接用IP地址,这个构...