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

TCP滑动窗口模拟实战相关推荐

  1. 计算机网络:TCP滑动窗口的流量控制和拥塞控制

    1. 前言 最近在研究网络通信底层通信原理,所以不得不复习一波计算机网络传输控制协议.那么对于程序开发人员,了解底层网络通信原理,对于我们理解BIO.NIO网络通信十分重要.所以对于程序开发人员来说, ...

  2. TCP滑动窗口(发送窗口和接受窗口)

    TCP窗口机制 TCP header中有一个Window Size字段,它其实是指接收端的窗口,即接收窗口.用来告知发送端自己所能接收的数据量,从而达到一部分流控的目的. 其实TCP在整个发送过程中, ...

  3. tcp滑动窗口_面试必备TCP(三):滑动窗口

    之前说过TCP协议头部的组成,不清楚可以点击这里,TCP滑动窗口技术通过动态改变窗口大小来调节两台主机间数据传输. 每个TCP/IP主机支持全双工数据传输,因此TCP有两个滑动窗口:一个用于接收数据, ...

  4. TCP滑动窗口原理终于清楚了!

    我们在学习计算机网络的时候,遇到很多知识点.即便是背的滚瓜烂熟,让你去辨别知识点背后的深层逻辑的时候,可能就手足无措了. 比如小邱去面A公司的时候就被问到: 事实上,这个问题很大程度弥补我计算机网络的 ...

  5. TCP三次握手和四次挥手?TCP如何保证可靠性?什么是TCP滑动窗口?

    TCP三次握手和四次挥手? 三次握手 tcp3handshake.gif tcp3handshake2.gif tcp3handshake3.gif tcp3handshake4.gif 四次挥手 t ...

  6. TCP滑动窗口协议与流量控制

    谈到TCP的滑动窗口协议与流量控制,便会想起当年面试时的场景.那时刚刚毕业,匆匆学了一点TCP的皮毛,仅仅是知道了TCP是面向连接的协议,以对每个报文都进行确认+超时重传的机制来保证端到端的可靠传输: ...

  7. 4.18、TCP滑动窗口

    4.18.TCP滑动窗口 1.滑动窗口的介绍 2.滑动窗口通信的例子 1.滑动窗口的介绍 滑动窗口(Sliding window)是一种流量控制技术.早期的网络通信中,通信双方不会考虑网络的拥挤情况直 ...

  8. TCP/IP(十一)TCP滑动窗口和拥塞控制

    目前建立在TCP协议上的网络协议特别多,有telnet,ssh,有ftp,有http等等.这些协议又可以根据数据吞吐量来大致分成两大类:(1)交互数据类型,例如telnet,ssh,这种类型的协议在大 ...

  9. linux内核TCP 滑动窗口,TCP滑动窗口和流控

    TCP的滑动窗口是一个很重要的概念,也是很晦涩的一个知识点.下面就大概介绍下TCP滑动窗口为什么出现?它是怎么工作的的? 什么是TCP窗口 首先,要理解,client和server各自协议栈都有自己的 ...

最新文章

  1. 详细的多维度测评,看看哪个 Python 版本速度最快!
  2. PHP怎么读写XML?(四种方法)
  3. python自带的idle优点_python新手入门使用自带的IDLE、用pycharm还是visual studio ?
  4. NSUserDefaults的用法(轻量级本地数据存储)
  5. 教育部:2006年江西高职(专科)院校名单
  6. CPU中的Little Endian与Big Endian
  7. thinkphp 按指定字段统计数据条数
  8. Atitit 设计模式与算法,与流程的关系
  9. 中国气象局所有城市代码
  10. 【老生谈算法】matlab实现模拟退火算法——模拟退火算法
  11. Google Chrome 启动 0x0000005 崩溃问题的解决方法
  12. 单元二:全桥MOS/IGBT电路(后端全桥电路的搭建)
  13. python论坛签到_python简单实现网站打卡签到
  14. win10升级助手链接
  15. 一款好看的个人工作室主页源码
  16. 芝士粉和芝士的区别_它是芝士吗?
  17. 学习与尝试 --> 事件风暴
  18. 长沙立坤文化怎么样?是骗子公司吗?网友想知道!
  19. 字母上一横怎么word里打出来
  20. 技能Get·PC及手机微信聊天记录的备份与还原

热门文章

  1. 华为云平台架构名词解释
  2. 电路邱关源学习笔记——1.4电阻元件
  3. w ndows无法识别usb,Vista操作系统为什么无法识别USB设备?
  4. 航测大数据量处理_【应用案例】徕卡HxMap软件并行处理环境 在大数据量、高效率处理要求下的应用...
  5. arm汇编标号globel和word解释
  6. 顺利解决org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException!
  7. 锐速 (lotServer) 一键安装脚本
  8. excel转换 txt竖线分隔符 为 xlsx 转换为 csv
  9. 课程7 :PLC常见指令详解:比较指令(工控PLC工程师入门必读,5天可上手调试)
  10. 解决 nginx 反向代理时 session 丢失 无效的问题