TCP的滑动窗口算法_ly695908698的博客-程序员资料_tcp滑动窗口协议与窗口大小的计算

IP层协议属于不可靠的协议,IP层并不关系数据是否发送到了对端,TCP通过确认机制来保证数据传输的可靠性。

   它本质上是描述接收方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据,如果发送方收到接收方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接收方发送窗口大小不为0的数据报的到来

假设A和B之间新建立了一条TCP连接。设备A需要传送一长串数据流,但设备B无法一次全部接收,所以它限制设备A每次发送分段指定数量的字节数,直到分段中已发送的字节数得到确认。之后,设备A可以继续发送更多字节。每一个设备都对发送,接收及确认数据进行追踪。
如果我们在任一时间点对于这一过程做一个“快照”,那么我们可以将TCP buffer中的数据分为以下四类,并把它们看作一个时间轴:

  1. 已发送已确认数据流中最早的字节已经发送并得到确认。这些数据是站在发送设备的角度来看的。如下图所示,31个字节已经发送并确认。
  2. 已发送但尚未确认 已发送但尚未得到确认的字节。发送方在确认之前,不认为这些数据已经被处理。下图所示14字节为第2类。
  3. 未发送而接收方已Ready 设备尚未将数据发出 ,但接收方根据最近一次关于发送方一次要发送多少字节确认自己有足够空间。发送方会立即尝试发送。如图,第3类有6字节。
  4. 未发送而接收方Not Ready 由于接收方not ready,还不允许将这部分数据发出。

    四种类型TCP buffer的数据

发送窗口与可用窗口
整个过程关键的操作在于接收方允许发送方一次能容纳的未确认的字节数。这称为发送窗口,有时也称为窗口。该窗口决定了发送方允许传送的字节数,也是2类和3类的字节数之和。因此,最后两类(接收方准备好而尚未发送,接收方未准备好)的分界线在于添加了从第一个未确认字节开始的窗口。本例中,第一个未确认字节是32,整个窗口大小是20。

可用窗口的定义是:考虑到正在传输的数据量,发送方仍被允许发送的数据量。实际上等于第3类的大小。左边界就是窗口中的第一个字节(字节32),右边界是窗口中最后一个字节(字节51)。概念的详细解释看下图。

发送窗口与可用窗口示意图

窗口滑动过程

初始状态
关于窗口的滑动过程:初始状态假设如下图所示,即当上图中第三类的6字节立即发送之后,这6字节从第3类转移到第2类。字节变为如下:

  1. 已发送已确认字节1至31。
  2. 已发送但尚未确认字节32至51。
  3. 未发送而接收方已Ready字节为0。
  4. 未发送而接收方Not Ready字节52至95。

初始状态


传输过程
例如,假设已发送未确认字节(32至45)分为4段传输:32-34,35-36,37-41,42-45。第1,2,4段已经到达,而3段没有收到。接收方只会发回32-36的确认信息。接收方会保留42-45但不会确认,因为确认42-45会表示接收方已经收到了37-41(默认采用累加的确认方式)。这是很必要的,因为TCP的确认机制是累计的,只使用一个数字来确认数据。这一数字是自上一次成功接收后的最长字节数。假设目标设备同样将窗口设为20字节。
调整窗口
当发送设备接收到确认信息,则会将一部分第2类字节转移到第1类,因为它们已经得到了确认。由于5个字节已被确认,窗口大小没有改变,允许发送方多发5个字节。结果,窗口向右滑动5个字节。同时5个字节从第二类移动到第1类,5个字节从第4类移动至第3类,为接下来的传输创建了新的可用窗口。因此,在接收到确认信息以后,看起来如下图所示。字节变为如下:

  1. 已发送已确认字节1至36。
  2. 已发送但尚未确认字节37至51。
  3. 未发送而接收方已Ready字节为52至56。
  4. 未发送而接收方Not Ready字节57至95。

滑动后的窗口

处理丢失确认信息
但是丢失的42-45如何处理呢?在接收到第3段(37-41)之前,接收设备不会发送确认信息,也不会发送这一段之后字节的确认信息。发送设备可以将新的字节添加到第3类之后,即52-56。但是发送设备之后会停止发送,窗口停留在37-41。
TCP包括一个传输及重传的计时机制。对于丢失的seg3,如果超过一定时间,TCP就会重新传送(重传机制),重传成功会seg3 seg4一块被确认,不成功,seg4也将被丢弃。TCP重传丢失的片段,但有一个缺陷是:因为它不会对每一个片段分别进行确认,这可能会导致其他实际上已经接收到的片段被重传(比如42至45)。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ly695908698/article/details/97259436

智能推荐

wait和waitpid详解_白日梦想家_pf的博客-程序员资料_wait waitpid

wait和waitpid详解wait()就是得到子进程的返回码,等于就是为子进程“收尸”,否则子进程会变僵尸进程(关于僵尸和孤儿进程的区别,之前有总结过),如果父进程结束了,init进程会为僵尸进程收尸的。SIGCHLD信号处理函数:进程一章讲过用wait和waitpid函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式)。采用第一种方式,父进程阻塞了就不能处理自己的工作了;采用第二种方式,父进程在处理自己的工作的同时还要记得时不时地轮询一下,

精选|2018年10月R新包推荐_R语言中文社区的博客-程序员资料

作者:Joseph Rickert翻译:黄小伟,先后从事游戏、社交及金融数据研究及应用,目前就职杭州有赞,欢迎有兴趣的同学加入有赞分析团队2018年10月份,共有185个...

【生产实践总结】支撑百万连接的系统应该如何设计其高并发架构?【石杉的架构笔记】..._b10l07的博客-程序员资料

欢迎关注个人公众号:石杉的架构笔记(ID:shishan100)周一至周五早8点半!精品技术文章准时送上!精品学习资料获取通道,参见文末目录1、到底什么是连接?2、为什么每次发送请求都要建立连接?3、长连接模式下需要耗费大量资源4、Kafka遇到的问题:应对大量客户端连接5、Kafka的架构实践:Reactor多路复用6、优化后的架构是如何支撑大量连接的“ 这篇文章,给大家聊聊:如果你设计一个系统...

2021Hubei ProvincialCollegiateProgrammingContestDAF+一道acwing_菜鸡一号¥的博客-程序员资料

比赛链接地址。先做出来的是F题这道题目的话我用的优先队列(battery)配一个sort后的location数组然后挨个遍历battery里面最小的用来先解决location里面最小的值,最后得到最优解。这道题目的话因为location全是2的倍数的大小,似乎还可以借助这个性质来做。#include <bits/stdc++.h>using namespace std;typedef long long ll;int n,m;const int maxn = 3e5+1000;

Java IO小结_孙硕SunShuo的博客-程序员资料_如果len是0,没有字节读取,返回0;否则至少读取一个字节。如果因为流到达文件末尾没

此博客总结与百度百科和java API 1.6,如果有错误望指正。IO基本概念java.io包 java的核心库java.io提供了全面的io接口。包括文件读写,设备输入输出等,java中IO是以流为基础进行输入输出的,所有的数据被串行化写出到输出流(Output)或者从输入流(Input)读入。 流的概念 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源

随便推点

【Codeforces Round 375 (Div 2) E】【欧拉回路Fleury算法 或网络流】One-Way Reform 每条边定向使得最多的点满足入度=出度_snowy_smile的博客-程序员资料

E. One-Way Reformtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputThere are n cities and m two-way roads

SqlServer中Distinct和Top一起使用_thre3stone的博客-程序员资料_distinct top

SqlServer中Distinct和Top一起使用SELECT distinct top 2 LastName FROM [dbo].[Employees] order by LastNamedistinct要放到top前面,这样取出的结果是先将数据Distinct去重复,然后再取其中的前两行...

Informix12 Linux(CentOS 7) 安装步骤_诺凸凸诺的博客-程序员资料_informix12 安装

informix Linux(centOS 7) 安装步骤安装环境Linux版本:CentOS-7-x86_64-DVD-1908.iso虚拟机:VMwareinformix安装包:iif.12.10.FC12DE.linux-x86_64.tarinformix服务名: tramsserver (这个可以随意指定)安装步骤整个安装过程都以root用户运行创建informix...

apt get安装mysql扩展,Ubuntu mysql 扩展pdo安装_tangzhangzheng的博客-程序员资料

摘要ubuntu上为php添加pdo和pdo_mysql扩展由于ubuntu默认的安装不支持pdo,需要自己添加扩展,具体如下:sudo apt-get install php7.0-devsudo apt-get install php-pearsudo apt-get install libmysqlclient15-dev完成以上安装之后,开始安装pdosudo pecl install p...

Informix数据库安装配置_高尔夫golf的博客-程序员资料

目录(?)[+] 1.1.1.1              安装文件准备版本:IBM Informix Dynamic Server             Version  9.40.UC8              IBM Informix CSDK                     Version  2.90将安装文件以informix用户上

7-3 复数四则运算 (15 分)_王睿丶的博客-程序员资料

7-3 复数四则运算 (15 分)本题要求编写程序,计算2个复数的和、差、积、商。输入格式:输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部。题目保证C2不为0。输出格式:分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,...

推荐文章

热门文章

相关标签