TCP滑动窗口机制

TCP通过滑动窗口机制检测丢包,并在丢包发生时调整数据传输速率。滑动窗口机制利用数据接收端的接收窗口来控制数据流。

接收窗口值由数据接收端指定,以字节数形式存储于TCP报文头,并告知传输设备有多少数据将会存储在TCP缓冲区。缓冲区就是数据暂时放置的地方,直至传递至应用层协议等待处理。因此,发送端每次只能发送Window Size字段指定的数据量。为了使发送端继续传送数据,接收端必须发送确认信息:之前的数据接收到了。同时必须对占用缓冲区的数据进行处理以释放缓存空间。下图显示了接收窗口是如何工作的:

上图中,客户端向服务器发送数据,服务器接收窗口是5000字节。客户端发送了2500字节,服务器缓冲区还剩2500字节,之后又发送了2000字节,从而缓冲区只剩500字节。服务器发送确认信息。对缓存中数据进行处理并清空缓存。此过程重复进行,客户端又发送3000字节和1000字节,服务器缓存减少至1000字节,客户端再次确认数据并处理缓存中内容。

更多信息

调整窗口大小:

当TCP堆 栈接收到数据的时候,生成一个确认信息并以回复的方式发送,但是放置在接收端缓存中的数据并不总是立即被处理。当服务器忙于处理从多个客户端接收的报文, 服务器很有可能因为清理缓存而变得缓慢,无法腾出空间接收新的数据,如果没有流控,则可能会造成丢包和数据损坏。好在,接收窗口所设定的速率无法使服务器 正常处理数据时,能够调整接收窗口大小。通过减小返回给发送端的ACK报文的TCP头窗口大小值来实现。如下图所示:

上图中,服务器初始窗口大小为5000字节。客户端发送2000字节,之后又发送了2000字节,缓冲区中只有1000字节可用。服务器意识到缓冲区正在快速填满,它知道如果数据继续以此速率传输,很快会有报文丢失。为了防止报文丢失,服务器发送确认信息给客户端,更新窗口大小为1000字节。结果,客户端减少数据发送,服务器以可以接受的速率处理缓存内容,即保持数据流以稳定的速率传输。

调整窗口大小在两个方向都是可行的。当服务器能够更加快速的处理报文时,它会发送一个较大窗口的ACK报文。

零窗口暂停数据流:

某些情况下,服务器无法再处理从客户端发送的数据。可能是由于内存不足,处理能力不够,或其他原因。这可能会造成数据被丢弃以及传输暂停,但接收窗口能够帮助减小负面影响。

当上述情况发生时,服务器会发送窗口为0的报文。当客户端接收到此报文时,它会暂停所有数据传输,但会保持与服务器的连接以传输探测(keep-alive)报文。探测报文在客户端以稳定间隙发送,以查看服务器接收窗口状态。一旦服务器能够再次处理数据,将会返回非零值窗口大小,传输会恢复。下图示例了零窗口通知过程。

服务器初始接收数据窗口为5000字节大小。从客户端接收4000字节数据之后,服务器负载变得非常繁重,无法继续处理客户端任何数据。服务器于是发送窗口大小值为0的报文。客户端暂停数据传输并发送一个探测报文。探测报文之后,服务器回复以告知客户端现在可以接收数据的报文,以及窗口大小为1000字节。客户端恢复传送数据。




TCP滑动窗口机制



我们可以大概看一下上图的模型:
  1. 首先是AB之间三次握手建立TCP连接。在报文的交互过程中,A将自己的缓冲区大小(窗口大小)3发送给B,B同理,这样双方就知道了对端的窗口大小。
  2. A开始发送数据,A连续发送3个单位的数据,因为他知道B的缓冲区大小。在这一波数据发送完后,A就不能再发了,需等待B的确认。
  3. A发送过来的数据逐渐将缓冲区填满。
  4. 这时候缓冲区中的一个报文被进程读取,缓冲区有了一个空位,于是B向A发送一个ACK,这个报文中指示窗口大小为1。
    A收到B发过来的ACK消息,并且知道B将窗口大小调整为1,因此他只发送了一个单位的数据并且等待B的下一个确认报文。
  5. 如此反复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NLP文本相似度 - LCS(最长公共子序列)java代码

LCS是Longest Common Subsequence的缩写,即最长公共子序列。一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列。 比如,对于char x[]"aabcd";有顺序且相互相邻的aabc是…

MTU最大传输单元

最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据报大小(以 字节 为单位)。最大传输单元这个参数通常与 通信接口 有关(网络接口卡、串口等)。

CDH中文文档下载,Cloudera中文手册,CM中文文档

CDH中文文档下载 链接:https://pan.baidu.com/s/1G-8WCafpPZ3p7ZDeXLcgug 提取码:ubxz

ERROR: cuda_runtime_api.h: No such file or directory

include_directories(/usr/local/cuda/include) link_directories(/usr/local/cuda/lib64)

关于TCP的粘包问题

简单的说就是通过TCP协议发送了多条独立的数据,但接收的时候,有些数据不幸的合并成了一个。比如客户端向服务器发送两个命令:”Start”、”Parameter[x.x.x]”,第一个命令的含义是开始,第二个命令的含义是启动参数。但…

运行第一个node.js文件

安装node.js 链接:https://nodejs.org/en/ 选择downloads 再选择对应的版本,Windows Installer (.msi):表示需要安装后才能运行node.js文件,安装完后在(cmd)控制台输入node -v查看版本,不用配置环境安装完成后自动配置。Windows Binary (.zip…

spark异常 - Null value appeared in non-nullable field

主要代码如下 val rddsc.newAPIHadoopRDD(hBaseConf, classOf[TableInputFormat], classOf[ImmutableBytesWritable],classOf[Result])import spark.implicits._val value :RDD[UserSchemaClass] rdd.map(convertHive)val tempDS value .toDF()tempDS.createTempView("te…

关于回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件…

Java 汉字转拼音 Scala 汉字转拼音

汉字转拼音 Maven引用 <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version></dependency> Scala Demo: import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFor…

中科慧眼双目安装pcl

1 step 安装依赖 sudo apt-get update //更新ubuntu的软件源 //安装依赖 sudo apt-get install git build-essential linux-libc-dev sudo apt-get install cmake cmake-gui sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev …

链式调用-普通调用

var http require(http);/*创建一个web服务器-链式调用*/ http.createServer(function (req, res) {/*给服务器传入一个匿名的回调函数&#xff0c;req获取请求相关的信息&#xff0c;例如&#xff1a;请求的类型是get还是post&#xff0c;res告诉服务器给请求响应内容*/res.w…

Spark 调用 hive使用动态分区插入数据

spark 调用sql插入hive 失败 &#xff0c;执行语句如下 spark.sql("INSERT INTO default.test_table_partition partition(province,city) SELECT xxx,xxx md5(province),md5(city) FROM test_table") 报错如下&#xff0c;需动态插入分区 Exception in thread &q…

cmakelists 指定opencv版本

利用以下命令查看版本&#xff1a; locate OpenCVConfig.cmake 打印&#xff1a; /opt/ros/kinetic/share/OpenCV-3.3.1-dev/OpenCVConfig.cmake /usr/local/lib/cmake/opencv4/OpenCVConfig.cmake 指定版本&#xff1a; set(OpenCV_DIR "/usr/local/lib/cmake/openc…

nodejs异步读取文件与同步读取文件的区别

var fsrequire(fs);//引入他的模块之后调用读取文件的方法 fs.readFile(file.txt,utf-8,function(err,data){//回调函数有两个参数&#xff0c;一个是err表示错误信息&#xff0c;一个是读取文件的内容if(err){console.log(err);}else{console.log(data);} }); console.log(&qu…

phoenix-sqlline 连接失败

报错如下 [rootxxx bin]# phoenix-sqlline.py xxx.xxx.xxx:2181:/hbase Traceback (most recent call last):File "/opt/cloudera/parcels/APACHE_PHOENIX-4.14.0-cdh5.13.2.p0.3/bin/../lib/phoenix/bin/sqlline.py", line 25, in <module>import phoenix_ut…

TCP解决connect函数的超时问题

在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未完成;同时TCP的三路握手操作继续进行;在这之后,我们可以调用select来检查这个链接是否建立成功;非阻塞connect有三种用途:1.我们可以在三路握手的同时做一些其…

node.js异步式IO与事件式编程

Node.js最大的特性就是异步式I/O与事件紧密结合的编程模式。这种模式与传统的同步式IO线性的编程思路有很大的不同&#xff0c;因为控制流很大程度上要靠事件和回调函数来组织&#xff0c;一个逻辑要拆分为若干个单元格。内容&#xff1a;阻塞和线程1.同步式I/O或阻塞式I/O线程…

几个重要库函数的实现

面试官很喜欢让求职者写一些常用库函数的实现&#xff0c;有很多是和字符串相关的&#xff0c;有一些是关于内存拷贝的。一般&#xff0c;常会让写的函数有以下几个&#xff1a; strcpy &#xff0c; strncpy&#xff0c; memcpy。 memset一般不会让去写&#xff0c;但这个函数…

CDH 5.13.0 集成 Phoenix

1.下载Phoenix http://phoenix.apache.org/download.html 找到对应版本 点击parcels (cdh可安装版本) http://www.apache.org/dist/phoenix/apache-phoenix-4.14.0-cdh5.13.2/parcels/ 下载好这三个文件 -rw-r--r-- 1 root root 364830720 7月 26 16:15 APACHE_PHOENIX-…

四元数,欧拉角,旋转矩阵相互转换

#include <TransForms3d/TransForms.h>/*---------------------------------------角度弧度转换----------------------------------------*/ /*** description: 角度转为弧度* param {double} angle 角度值* return 返回对应弧度值,一般在-3.14~3.14之间*/ double Trans…