TCP滑动窗口模拟实战

article/2025/9/30 20:00:12

1.TCP滑动窗口机制

客户端与服务端之间的通信是一个数据传输的过程,消息以数据包形式进行传输。

在传输的过程中,通过滑动窗口机制来同时传输多个数据包;发送端根据接收端的处理能力,适当控制发送窗口大小,实现流量控制。

1.1 数据包单独发送

在数据包较大的情况下,需要将大的数据包拆分成多个小的数据包进行传输。

接收端确认接收到一个数据包之后,发送端才能发送下一个数据包。整个过程如下图所示:

很明显,这种方式方式的数据传输效率非常低,发送端只有等到接收端确认收到之后才能发送下一个数据包。

为了改进这种情况,引入了窗口的概念。

1.2 数据包窗口批量发送

窗口大小是指:不需要等待确认包而可以继续发送的数据包的最大值

在以下的示例中,我们假定窗口大小为3。整个过程如下所示:

 

从上图中可知:发送端在发送1-1000数据包之后,并没有等待接收端返回确认包,就开始发送1001-2000和2001-3000数据包。

通过这种方式,就可以省去多个数据包的数据传输时间。

1.3 数据包窗口流量控制

在使用窗口批量发送时,发送方需要根据接收方的处理能力在实时调整发送窗口大小。

当接收方没有多余空间再接收数据时,发送方调整窗口大小为0(如果发送方不调整,则接收方则会丢弃到接收到的数据包),依此来实现TCP流量控制。

我们假定接收方窗口大小默认为5,在传输的过程中,窗口大小有调整,整个过程如下:

 

在接收端窗口调整后,发送方则最多一次只能发送窗口大小的数据。

通过一组图来展示下整个窗口滑动过程:

 

在三次握手之后,发送端了解到接收端窗口大小为5。

第一次发送数据为3000个字节

 

接收端接收到3000个字节后,返回ACK确认收到。

此时由于某些原因调整窗口大小为3

 

发送端接收到第一次ACK后,窗口向前滑动,开始发送4000 5000两个数据包

发送端接收到调整后的窗口大小后,滑动窗口大小调整为3

 

接收端确认接收到4000 5000两个数据包,接收窗口此时又调整为5 

同样,发送端接收到ACK包后,窗口前移,开始发送6000 7000两个数据包 

总结:通过一组图来展示下发送端与接收端整个处理过程。

发送端的可发送窗口大小即为接收端可用窗口大小

2.wireshark抓包窗口变化过程

笔者通过一个示例,来展示下接收端的窗口变化。

正常情况下,接收方在接收到请求数据包之后,立即处理掉,那么可接收窗口大小就又恢复到原来大小。

笔者在这里为了模拟窗口变化,使接收方在接收到请求数据包之后,不再处理,此时发送方依旧每秒发送10KB数据。

代码及抓包结果如下

2.1 发送方及接收方代码

2.1.1 发送方代码

public class ClientTest {public static void main(String[] args) throws Exception {byte[] one_kb = new byte[10 * 1024];byte a = 'a';Arrays.fill(one_kb, a);Socket client = new Socket("127.0.0.1", 10000);OutputStream outputStream = client.getOutputStream();for (int i = 0; i < 1000; i++) {try {outputStream.write(one_kb);outputStream.flush();Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}}}
}

 2.1.2 接收方代码

public class SocketTest {public static void main(String[] args) throws Exception {ServerSocket server = new ServerSocket(10000, 5);int acceptCount = 0;while (true) {Socket client = server.accept();System.out.println("new connection has connected, num=" + acceptCount++);// 连接成功后,不处理该连接的任何请求}}
}

2.2 wireshark抓包

2.2.1 三次握手

发送方与接收方在三次握手时交换窗口大小

接收方Win=65535 发送方Win=2619648

2.2.2 数据发送过程中的窗口变化

第一次发送后 133行,接收方返回窗口大小为2609408,该窗口大小为(初始窗口大小[2619648]-接收数据大小[10240]=2609408)

同理,第一次发送后 152行,接收方返回窗口大小为,该窗口大小为2599168(上次窗口大小[2609408]-接收数据大小[10240]=2599168)

同理,第一次发送后 154行,接收方返回窗口大小为2609408,该窗口大小为(初始窗口大小[2599168]-接收数据大小[10240]=2588928)

2.2.3 最终接收方消耗完所有的窗口缓存

 

最终,接收方Win=0 (1322行),此时发送方再发送任何数据都无法被接收。

而且,此时发送方的发送窗口大小也等于0,此时便不再发送数据。

参考:

TCP滑动窗口机制深度剖析

Linux-TCP之深刻浅出send和recv - JavaShuo

 


http://chatgpt.dhexx.cn/article/nZEeJvSZ.shtml

相关文章

TCP滑动窗口机制(附图例)

文章目录 前言一、滑动窗口的引出二、流量控制2.1 16位窗口大小2.2 发送缓冲区2.3 逐步解析滑动窗口运作 三、快重传机制四、拥塞控制&#xff08;仅供参考&#xff09;五、延迟应答与捎带应答&#xff08;略&#xff09;总结 前言 博主个人社区&#xff1a;开发与算法学习社区…

TCP 滑动窗口(快速重传)

目录 一、滑动窗口的来由 二、滑动窗口 1、滑动窗口模型 2、滑动窗口可能出现的状况 (1) 客户端发送的报文丢了&#xff08;快重传机制&#xff09; (2) 服务端发送的ACK丢了&#xff08;先收到了排序靠后的ACK&#xff09; 三、滑动窗口大小为0时&#xff0c;何时才能继…

TCP滑动窗口

1、滑动窗口的概念 TCP每发送一个数据&#xff0c;都需要进行一次应答。当收到了上一个应答&#xff0c;在发下一个数据&#xff0c;但这种方式效率比较低。数据包往返时间越长&#xff0c;通信的效率就越低。   为了解决这个问题&#xff0c;TCP引入了窗口概念。即在接收窗口…

TCP 滑动窗口详解(非常实用)

一、滑动窗口简介 滑动窗口&#xff08;Sliding window&#xff09;是一种流量控制技术。早期的网络通信中&#xff0c;通信双方不会考虑网络的 拥挤情况直接发送数据。由于大家不知道网络拥塞状况&#xff0c;同时发送数据&#xff0c;导致中间节点阻塞掉包&#xff0c; 谁也发…

TCP滑动窗口机制(重要)

本文参考了一些优秀的书籍->图解TCP/IP,TCP协议卷一,小林coding,还有等等的知乎,百度. 小林coding 小林coding 知乎牛客的文章 : 万字长文 | 23 个问题 TCP 疑难杂症全解析_技术交流_牛客网 这篇文章是关于TCP的又一个重要机制-->滑动窗口,下面是这篇文章的思维导图: 目…

TCP滑动窗口详解

相较于UDP&#xff0c;TCP有以下区别&#xff1a; 1、可靠传输 2、流量控制 这两个功能都是依靠滑动窗口来实现的&#xff0c;本文就来解密TCP中的滑动窗口。 TCP实现可靠传输依靠的有 序列号、自动重传、滑动窗口、确认应答等机制。 序列号 首先我们说下序列号&#xff0c…

计算机视觉——SIFT图像匹配算法

第二章&#xff1a;SIFT&#xff08;尺度不变特征变换&#xff09; 1. SIFT简介1.1 SIFT算法特点1.2 SIFT特征检测的步骤 2. 尺度空间3. 高斯模糊3.1 高斯模糊3.2 高斯金字塔 4. DoG金字塔4.1 DoG局部极值检测4.2 DoG去除边缘响应4.2.1低对比度的响应点4.2.2不稳定的边缘响应点…

SIFT图像匹配原理及python实现(源码实现及基于opencv实现)

写在前面 黄宁然&#xff0c;看过你看过的算法&#xff0c;数学不好是硬伤。 问题来源&#xff1a; An***** xue100: https://bbs.csdn.net/topics/*********?spm1001.2014.3001.**77 &#xff08;1&#xff09;相机置于地面&#xff0c;离天花板的高度始终不变。在某位置拍…

计算机视觉——sift特征匹配+opencv(包含sift的低于3.4.3的opencv安装方法)

文章目录 实验环境环境配置&#xff08;低于3.4.3的opencv安装方法&#xff09;虚拟环境的搭建&#xff08;非必要&#xff09;局部图像描述子Harris 角点检测基本原理SIFT特征提取代码实现运行实例匹配图像展示匹配结果和分析 实验环境 系统&#xff1a;Ubuntu16.04 语言&…

使用 Javascript 和 OpenCV.js 进行人脸检测

大家好&#xff0c;我们将研究如何使用常规 Javascript、HTML Canvas 和 OpenCV.js 库从图像中检测人脸。 让我们先看一些例子&#xff0c;然后我们将继续编写代码并解释 如果您需要查看完整的代码库刚刚获得我的 github 存储库 GitHub - reactcodes/face-detection-javascript…

图像处理:局部描述子SIFT算法

目录 0、关于SIFT的介绍 1、兴趣点 2、描述子 SIFT算法实现 1.实例化sift 2.利用sift.detectAndCompute()检测关键点并计算 3.将关键点检测结果绘制在图像上 Opencv实现 总结 0、关于SIFT的介绍 SIFT&#xff0c;即尺度不变特征变换&#xff0c;一种局部特征描述子&…

SIFT3D点云关键点提取详细介绍

1.引言 SIFT3D的理论基础完全是从图像特征SIFT2D中迁移类比过来的&#xff0c;类似的还有Harris3D和Harris6D的理论也是来源于Harris2D的&#xff0c;这些点云特征在PCL库中都有具体的实现。Harris3D和Harris6D目前已经有很好的博客和视频讲解了但是SIFT3D却没有一个比较好的介…

java sift 图片相似度,简单快速的图像相似性比较方法

我最近也面临同样的问题,为了解决这个问题(简单快速的算法比较两个图像),我贡献了 img_hash module 要打开“控制”,您可以从 this link . img_哈希模块提供六种图像哈希算法,非常容易使用。 代码示例 起源Lena 模糊莉娜 调整Lena的大小 移动Lena #include #include #include…

图像特征提取(二)——SIFT算法详解

转载自:http://blog.csdn.net/zddblog/article/details/7521424尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT)Just For Fun zdd zddmailgmail.com or (zddhubgmail.com) 对于初学者&#xff0c;从David G.Lowe的论文到实现&#xff0c;有许多鸿沟…

Matlab实现sift特征检测+图像拼接

Matlab实现sift特征检测图像拼接共有12个m文件&#xff0c;其中main为主程序&#xff0c;点击运行即可。 一、部分代码示例 close all; clear; clc;im1imread(test3.png); im2imread(test4.png);gray1img2gray(im1); gray2img2gray(im2);[des1,loc1]sift(gray1); [des2,loc2]…

sfm算法之三角化(三角测量)

sfm算法流程一般是特征点提取、特征点匹配、计算本质矩阵/基础矩阵&#xff0c;最后三角化。但是利用机械臂去观察周围&#xff0c;前后帧姿态变化参数是具有的&#xff0c;所以不需要通过基础矩阵获取。 即利用机械臂的信息直接进行深度估计。已知&#xff1a;手眼标定、相机外…

简述人脸识别技术

简介 人脸识别技术是一种生物识别技术&#xff0c;可以用来确认用户身份。人脸识别技术相比于传统的身份识别技术有很大的优势&#xff0c;主要体现在方便性上。传统的身份认证方式诸如&#xff1a;密码、PIN码、射频卡片、口令、指纹等&#xff0c;需要用户记住复杂密码或者携…

Python机器视觉--OpenCV进阶(核心)-边缘检测之SIFT关键点检测

SIFT关键点检测 SIFT&#xff0c;即尺度不变特征变换&#xff08;Scale-invariant feature transform&#xff0c;SIFT&#xff09;&#xff0c;是用于图像处理领域的一种描述。这种描述具有尺度不变性&#xff0c;可在图像中检测出关键点&#xff0c;是一种局部特征描述子。 …

图像特征与描述子(直方图, 聚类, 边缘检测, 兴趣点/关键点, Harris角点, 斑点(Blob), SIFI, 纹理特征)...

1.直方图 用于计算图片特征&#xff0c;表达&#xff0c; 使得数据具有总结性&#xff0c; 颜色直方图对数据空间进行量化&#xff0c;好比10个bin 2. 聚类 类内对象的相关性高 类间对象的相关性差 常用算法&#xff1a;kmeans&#xff0c; EM算法&#xff0c; meanshift&#…

SIFI尺度不变特征变换算法

SIFT 尺度不变特征变换算法 David Lowe关于Sfit算法&#xff0c;2004年发表在Int. Journal of Computer Vision的经典论文中&#xff0c;对尺度空间&#xff08;scal space)是这样定义的 &#xff1a; It has been shown by Koenderink (1984) and Lindeberg (1994) that un…