当前位置: 首页 > news >正文

【转】20-TCP 协议(滑动窗口——基础)

https://blog.csdn.net/q1007729991/article/details/70142341

相信大家都遇到过这样的场景:

同学 Luffy 给你打电话,让你记下一串手机号码,可是你记忆力不太好,你跟 Luffy 约定,一次只最多只能报 4 个数字,Luffy 念一遍,如果你听到了就把他说的话重复一遍。接下来:

  • 你:你一次最多报 4 个数字,多了我记不住啊!
  • Luffy:139
  • 你:139 (Luffy 知道你听到了)
  • Luffy:7548
  • 你:7538 (很明显你听错了)
  • Luffy:不对,是7548
  • 你:7548
  • Luffy : 2669
  • 你:2669

最后,你接收到的完整的号码就是 139-7548-2669.

1. 滑动窗口

上面的场景,你一次最多只能接受 4 个数字,表示你的滑动窗口大小就是 4. 在 TCP 协议中,也有这样的滑动窗口,它的大小表示目前还能接收多少字节的数据。

TCP 每次收到对方发来的报文,都会检查窗口大小字段,见图 1.

 


这里写图片描述 
图1 TCP 首部中有一个字段——16 位窗口大小 

 

知道了对方的窗口大小后,就知道对方目前还能接收多少数据,接收的数据字节序号是 TCP 段中的 ACK 的值到 ACK + 窗口大小,即 [ACK,ACK+)[ACK,ACK+窗口大小).

比如,你给对方发送了一个段携带字节序号为 [400, 500) 的数据。对方回送了一个 TCP 段,ack = 500, win = 100,就表示,我已经收到 [400, 500) 的数据我还能接收字节序号为 [500, 600) 之间的数据,见图 2。

 


这里写图片描述 
图2 滑动窗口 

 

如果对方回送了一个 TCP 段,ack = 500, win = 0,就表示,我已经收到了 [400, 500) 的数据,但是我现在不能再接收数据了,你待会再发。

 


这里写图片描述 
图3 对方回送 0 大小的窗口,接收端的反应 

 

2. 滑动窗口的目的

回顾本文开头给出的打电话的例子,为什么你要告诉对方一次最多只能报 4 个数字?原因在于你的接受能力有限,不是说你无法记忆很多数字,只是在短期内,你记不住,你需要一段一段的记忆(一段一段的将数据放入缓冲区)。

所以,在 TCP 中,滑动窗口是为了实现流量控制。如果对方发送数据过快,接收方就来不及接收(你来不急记住),接收方就需要通告对方,减慢数据的发送(图 3)。

需要特别注意的是,在学习滑动窗口的时候,我们假设网络无限好,不拥塞。只要你发送了数据,对方一定可以收到。

再解释一下网络拥塞的含义,它是指你发送的数据滞留在网络中,迟迟未到达接收方。

3. 滑动窗口模拟

 


这里写图片描述 
图4 滑动窗口模拟 

 

修正:图4 中最后一个小图修正一下文字,应该为『发送方收到 ack=41, win=10, 知道对方希望接收序号为 [41, 51) 的数据』

  • 发送方接收到了对方发来的报文 ack = 33, win = 10,知道对方收到了 33 号前的数据,现在期望接收 [33, 43) 号数据。发送方连续发送了 4 个报文段假设为 A, B, C, D, 分别携带 [33, 35), [35, 36), [36, 38), [38, 41) 号数据。
  • 接收方接收到了报文段 A, C,但是没收到 B 和 D,也就是只收到了 [33, 35) 和 [36, 38) 号数据。接收方发送回对报文段 A 的确认:ack = 35, win = 10。
  • 发送方收到了 ack = 35, win = 10,对方期望接收 [35, 45) 号数据。接着发送了一个报文段 E,它携带了 [41, 44) 号数据。
  • 接收方接收到了报文段 B: [35, 36), D:[38, 41),接收方发送对 D 的确认:ack = 41, win = 10. (这是一个累积确认)
  • 发送方收到了 ack = 41, win = 10,对方期望接收 [41, 51) 号数据。
  • ……

需要注意的是,接收方接收 tcp 报文的顺序是不确定的,并非是一定先收到 35 再收到 36,也可能是先收到 36,37,再收到 35.

4. 总结

  • 理解滑动窗口的工作过程
  • 滑动窗口的目的是什么?

下一篇文章,我们得抓个包来分析一下。

相关文章:

  • httpd之apache服务器配置
  • 如何重置migration
  • LVS 之 管理工具ipvsadm介绍
  • JDBC 结构
  • 【以太坊】雷电网络的101网络原理概述
  • @property @synthesize @dynamic 及相关属性作用探究
  • 获取网贷之家数据
  • ES6 新特性之 let, const : JavaScript在变量方面的改进。
  • sqlmap tamter
  • ubuntu apache 配置虚拟主机 与 二级域名
  • ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】...
  • java项目学习
  • 方向导数的计算与梯度
  • 大数据框架hadoop服务角色介绍
  • 谈谈Java程序员未来的出路
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • flask接收请求并推入栈
  • HTTP请求重发
  • JS实现简单的MVC模式开发小游戏
  • mysql_config not found
  • Python中eval与exec的使用及区别
  • 分类模型——Logistics Regression
  • 规范化安全开发 KOA 手脚架
  • 记一次和乔布斯合作最难忘的经历
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 终端用户监控:真实用户监控还是模拟监控?
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​什么是bug?bug的源头在哪里?
  • ${factoryList }后面有空格不影响
  • (007)XHTML文档之标题——h1~h6
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (办公)springboot配置aop处理请求.
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • .gitignore文件---让git自动忽略指定文件
  • .net core控制台应用程序初识
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .py文件应该怎样打开?
  • @ModelAttribute注解使用
  • @ResponseBody
  • [ C++ ] STL_list 使用及其模拟实现
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [1]-基于图搜索的路径规划基础
  • [100天算法】-x 的平方根(day 61)
  • [C/C++]数据结构 深入挖掘环形链表问题
  • [CF226E]Noble Knight's Path
  • [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images
  • [gdc19]《战神4》中的全局光照技术
  • [ICCV2017]Neural Person Search Machines
  • [Java]快速入门优先队列(堆)手撕相关面试题
  • [java]删除数组中的某一个元素