| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 计算机网络 理解流量控制与SACK机制 -> 正文阅读 |
|
[网络协议]计算机网络 理解流量控制与SACK机制 |
文章目录从Telnet协议理解TCP的全双工理解TCP的双工TCP是一个双工协议,因为它连接的两端都可以向对方输出数据。 理解TCP的全双工上一节的内容,我们可以得知最起码TCP是一种半双工的协议。 流量控制解释按照上一章的思路,我们固定住一个发送方向,把两个主机分别当作 发送方、接收方。 每一条TCP连接中,接收方会为连接设置一个接收缓存。当接收方收到了正确的、按序的字节后,它就将数据放入接收缓存中。相关联的应用进程会从该缓存中读取数据,但不一定数据刚一到达就马上被读取。事实上,接收方的应用进程也许正忙于其他任务,甚至要过很长的时间后才去读取数据。 如果应用进程读取数据时相对缓慢,而发送方发送得太多、太快,发送的数据就会很容易地使得接收缓存溢出。所以TCP为它的应用进程提供了流量控制服务(flow-control service)以消除接收缓存溢出的可能性。 流量控制实际上是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。 示意图再按照上一章的思路,我们固定住一个发送方向,把两个主机分别当作 发送方、接收方。假设主机A正在向主机B发送一个大文件。 发送方:
接收方:
接收方的实现既然整个流量控制服务都是为了将就接收方的接收缓存,那就从接收方的接收缓存开始讲起: 现主机B为该TCP连接分配了一个接受缓存,大小为 R c v B u f f e r RcvBuffer RcvBuffer。主机B上的应用程序不时从该缓存中读取数据,那么有以下变量:
一个字节要首先从下层网络中接收到,才可能被上层应用读取到,所以肯定有: 从 L a s t B y t e R e a d LastByteRead LastByteRead到 L a s t B y t e R c v d LastByteRcvd LastByteRcvd之间的数据就是 应用程序还没来得及读取的数据,这些数据自然会被缓存起来。由于TCP不允许以分配的缓存溢出,所以肯定有: L a s t B y t e R c v d ? L a s t B y t e R e a d ≤ R c v B u f f e r LastByteRcvd - LastByteRead \leq RcvBuffer LastByteRcvd?LastByteRead≤RcvBuffer 总的缓存大小再减去 还没来得及读取的数据大小,就是接收方可以接受的数据量大小,也就是接收窗口。接收窗口用
r
w
n
d
rwnd
rwnd表示,根据接收缓存可用空间的大小来设置: 根据每次接收的数据的多少,和上层应用的读取数据的多少,这个可用空间也在随之变化,所以
r
w
n
d
rwnd
rwnd是动态变化的。当然也需要接收方每次接收到数据后,把
r
w
n
d
rwnd
rwnd的值告知给发送方。
r
w
n
d
rwnd
rwnd也就是上图中的 发送方的实现我们知道整个流量控制都是在将就接收方的接收缓存,所以每次发送方从接收方那里收到 如上图,现假设某一时刻下:
此时,发送方的窗口内的序号已经都被使用了,不能再发送数据了,除非接收方反馈ACK和window的信息给发送方,让发送方窗口滑动。 如上图,当发送方收到
综上我们可以看出,流量控制总是在让发送方来同步接收方的窗口信息。同步后,双方的窗口会处于同一个位置。
三次握手时的窗口信息
Window size scaling factor本节将百度当作发送方,本机当作接收方。 如上图,在第三次握手时,本机给出了 其实这个Window size scaling factor在本机的第一次握手给出了: 可以这么理解,Window size scaling factor和ACK、window一样,都是接收方给发送方以同步窗口的信息,只是这个Window size scaling factor如果没有改变的话,那么就只需要发送一次就行了,发送方自己会负责记住这个Window size scaling factor的。 SACK我们知道Acknowledgment Number是累积确认的含义,如果有Acknowledgment Number = x,那么 总之,SACK信息不是单独存在的。接收方反馈SACK信息时,既会反馈ACK信息(累积确认),也会反馈SACK信息(选择确认)。 示意图
如上图,因为SACK的存在:
三次握手时确认SACK能力
Options的构成因为SACK permitted和SACK都是属于TCP header里的Options,所以这里还是讲一下Options的构成。
列举可能的Options
利用No-Operation来填充其他Options由于每一排占的是4字节,但有的选项是不足4字节的,那么那一排的前面部分就要由No-Operation来填充。No-Operation相当于是一种特殊的Options,可以用来填充。 Maximum segment size由于刚好是4字节,那么不需要No-Operation来填充。
wireshark抓包到的SACK
实例分析
第一条数据,本机告诉百度,本机作为接收方,已经接收的区间为
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:36:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |