网络协议 TCP 滑动窗口

2024-08-31 05:58
文章标签 窗口 tcp 滑动 网络协议

本文主要是介绍网络协议 TCP 滑动窗口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网络协议 TCP 滑动窗口

  • 1.滑动窗口机制的理解
  • 2.滑动窗口的实现原理
    • 2.1 为啥用滑窗

TCP是一种可靠的数据发送协议,但他的模式也使得大量的资源出现浪费,为了更好的利用硬件多核资源,同时又保证tcp发送的可靠性基础上,出现了滑窗机制,说白了就是将原本发送一条数据然后就等待对方确认,改为发送多条再等待确认。

1.滑动窗口机制的理解

滑动窗口机制中“窗口”是指发送端和接收端的缓存空间大小,“滑动”的意思就是指缓存空间中存放的未处理帧数是变化,发送端在收到确认帧后会删除原本保存在缓存中的待重发帧,而接收端向网络层提交一个帧后也会删除原本保存在缓存中的帧,至于缓存空间大小,缓存越大成本越高,当然这里的窗口大小分为:物理窗口大小和可用窗口大小,对于主机而言,物理窗口大小是固定的,要视主机所配置的缓存大小而定;而可用窗口的大小是变化的,他是在物理窗口的基础上变化的,一端会根据另一端的“接收窗口”大小调整本端的“发送窗口“大小。

2.滑动窗口的实现原理

滑动窗口大多是用来做流量控制的,比如说我现在有10包数据,编号分别是0 ,101,201,301,401,501,601,701,801,901.每包数据大小都为100,在发送的时候我们不可能一次性把所有数据都发送出去,假设我们的窗口大小为300(事实上窗口比这个要大的多),那么就是0,101,201,发送出去,接收端收到第一包数据就会返回确认数据,并且会返回了接收端窗口大小,如果先接收到0,那么接收端返回的窗口大小就是300,发送端收到编号为0的确认数据后,从窗口缓存中删除0的数据,同时将窗口向右移动,但是此时还有101和201 没有收到确认数据,所以窗口只能向右移动一位,即发送301,此时虽然接收端告诉发送端可以发送300大小数据,但是发送端本身还有两包数据即200缓存,所以只能再发送一包数据。
在这里插入图片描述红色虚线框代表发送端已经发送出去的数据,蓝色虚线框内代表收到编号0确认码101后,向右移动后的窗口,这时发送了数据301这包数据。绿色线框内代表还未发送的数据。
相对应的,在接收端也会有这样的类似。接收端会将收到的连续序号的数据提交到应用层,并且清理当前接收到的数据,将窗口释放出来,不连续的则会缓存。

2.1 为啥用滑窗

为啥设计这个样子,这是由tcp的基本特性决定的,我们都知道tcp是保证有序的接收数据的,但是每次发送一包数据就等待接收端返回确认,这明显效率低下,浪费资源,但是又不能毫无估计的,将所有数据都发送出去,这样就无法保证有序,并且可能会造成网络拥堵,所以才有了滑窗机制,在保证数据效率的同时,也保证了网络效率。

这篇关于网络协议 TCP 滑动窗口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123078

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

VC网络协议

// PCControlDlg.cpp : 实现文件//#include "stdafx.h"#include "PCControl.h"#include "PCControlDlg.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框#ifde