TCP 可靠传输与流量控制的实现
TCP 可靠传输与流量控制的实现
一、TCP可靠传输的实现
现在所讲的可靠传输是根据之前所说的可靠传输原理的实现,是现实中应用的技术。
1.1.以字节为单位的滑动窗口
如图A端一份文件分为了多个字节,每个字节用带有字节号的方块表示。A需要把这份文件发个B,发送时文件先放入A的发送缓存中排队,准备发送。B中有一个接收缓存,用于存放接收到的由文件分成的多个字节数据。
- 通信时,B要与A建立会话(连接)(TCP是面向连接的),建立连接时B计算机要根据自己的接收缓存的大小设定合适的接收窗口,单位为字节,并告诉A计算机。如图中B的接收窗口设为20字节。
- A根据B告知的接收窗口大小设定字节的发送窗口为20个字节,二者要一致。
- 随后A开始向B发送数据,第一个发送的数据包可以是由26~28字节组成,不用等待B回复确认信息,继续发送发送窗口中剩下的29~45字节数据。于是可以发出由29~32字节组成的第二个数据包、由33~35字节组成的第三个数据包、由36~45字节组成的第四个数据包(组成一个数据包的字节数是不固定的)。
- A发出总共包含26~45二十个字节的四个数据包,A在没有收到B的确认信息前不能把发送窗口中26~35字节的数据删除,因为由于网络原因可能需要重发这些字节的数据。但是发送窗口外的数据不能继续发送。
- 当B收到了前两个数据包发现编号是连续的,就向A发送一个确认信息,表示已正确无误接收了前7个字节数据并要求A发送第36个字节之后的数据,即确认号ACK=36;
- A收到B发出的确认信息之后,发送窗口删除窗口中26~32字节数据的缓存,并向右移动到33字节处。即46~52字节的数据进入发送窗口可以以数据包的形式向B发送。
- 紧接着B陆续接收到数据包2、3,并向A发送确认信息。由于已发送了数据包1的确认信息,所以B的接收窗口向右移动,把数据包1包含的26~32字节数据移出接收窗口。这就相当于B计算机已经接收到了文件的26~32字节部分,相当于下载东西时的临时文件,应用进程可读取该部分。
如此循环,A的发送缓存和B的接收缓存会动态地清理空间,供发送窗口和接收窗口循环使用,直至把文件传输完成。这就是以字节为单位的滑动窗口实现的TCP可靠传输。
注意:
A中,P3 – P1 = A 的发送窗口(又称为通知窗口);
P2 – P1 = 已发送但尚未收到确认的字节数;
P3 – P2 = 允许发送但尚未发送的字节数(又称为可用窗口)。
- A 的发送窗口内的序号都已用完,但还没有再收到确认,必须停止发送。
1.2.当存在数据包丢失情况下实现可靠传输
- A向B发送3个数据包,再发送过程中第二个数据包丢了,只有第一个和第三个数据包到达B。
- 26~29连续字节数据到达B后,B向A发送确认数据包,其中ACK=30,A收到后相应地移动发送窗口;B只接收到30~35字节数据中的33~35字节,于是向A发送确认数据包,其中有一个选择性确认号SACK,告诉A端收到了33~35字节,只需要发送缺失的30~32字节数据即可。最终B收到30~35连续的字节了,再向A发送确认数据包,其中ACK=36,A收到后再次移动发送窗口。
补充说明:
- A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。
- TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。
- TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销。
二、超时重传时间的选择
2.1.加权平均往返时间RTT
TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。
由于网络的通畅情况随时间变化,所以数据往返时间RTT是变化的。采用以下公式计算新的平均往返时间。
- 式中RTTs表示加权平均往返时间 (又称为平滑的往返时间),即传输数据时多次往返时间RTT的平均值。
- 式中,0 < a < 1。若 a 接近于零,表示新RTTs值较依赖旧RTT值,说明 RTT 值更新较慢,网速稳定;若选择 a 接近于 1,表示新RTTs值较依赖新RTT值,说明 RTT 值更新较快,网速不稳定。
- RFC 2988 推荐的 a 值为 1/8,即 0.125。
2.2.超时重传时间 RTO (RetransmissionTime-Out)
RTO 应略大于上面得出的加权平均往返时间 RTTs。
RFC 2988 建议使用下式计算 RTO:
RTO = RTTs + 4 x RTTd
RTTd 是 RTT 的偏差的加权平均值。
RFC 2988 建议这样计算 RTTd。第一次测量时,RTTd 值取为测量到的 RTT 样本值的一半。在以后的测量中,则使用下式计算加权平均的 RTTd:
- β 是个小于 1 的系数,其推荐值是 1/4,即 0.25。
往返时间的测量相当复杂
- TCP 报文段 1 没有收到确认。重传(即报文段 2)后,收到了确认报文段 ACK。
- 如何判定此确认报文段是对原来的报文段 1 的确认,还是对重传的报文段 2 的确认?
2.3.Karn 算法
- 在计算平均往返时间 RTT 时,只要报文段重传了,就不采用其往返时间样本。
- 这样得出的加权平均平均往返时间 RTTS 和超时重传时间 RTO 就较准确。
2.4.修正的 Karn 算法
- 报文段每重传一次,就把 RTO 增大一些:
系数 g 的典型值是 2 。
当不再发生报文段的重传时,才根据报文段的往返时延更新平均往返时延 RTT 和超时重传时间 RTO 的数值。
实践证明,这种策略较为合理。
2.5.选择确认 SACK (Selective ACK)
- 接收方收到了和前面的字节流不连续的两个字节块。
- 如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据。
- RFC 2018 的规定:
- 如果要使用选择确认,那么在建立 TCP 连接时,就要在 TCP 首部的选项中加上“允许 SACK”的选项,而且双方必须都事先商定好。
- 如果使用选择确认,那么原来首部中的“确认号字段”的用法仍然不变。只是以后在 TCP 报文段的首部中都增加了 SACK 选项,以便报告收到的不连续的字节块的边界。
- 由于首部选项的长度最多只有 40 字节,而指明一个边界就要用掉 4 字节,因此在选项中最多只能指明 4 个字节块的边界信息。
三、TCP的流量控制
3.1.利用滑动窗口实现流量控制
一般说来,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。
流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。
流量控制举例:
A 向 B 发送数据。在连接建立时,B 告诉 A:“我的接收窗口 rwnd = 400(字节)”。
由图可知,利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。
TCP 可靠传输与流量控制的实现的更多相关文章
- TCP可靠传输及流量控制实现原理
一.为什么TCP是可靠传输? 1. 停止等待协议 通过确认与超时重传机制实现可靠传输 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数 ...
- 计算机网络概述 传输层 TCP可靠传输的实现
TCP可靠传输的实现 TCP的可靠性表现在:它向应用层提供的数据是 无差错的.有序的.无丢失的,简单的说就是:TCP最终递交给应用层的数据和发送者发送的数据是一模一样的. TCP采用了流量控制.拥塞控 ...
- 运输层6——TCP可靠传输的实现
目录 1. 以字节为单位的滑动窗口 2. 超时重传时间的选择 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3- ...
- TCP可靠传输
1. TCP 可靠性如何保证? 信道可靠:用三次握手.四次挥手保证连接正确: 数据正确:分区编号.校验和.超时重传: 传输控制:流量控制.拥塞控制 2. 重传机制 TCP可靠传输方式是序列号与确认应答 ...
- TCP可靠传输原理
停止等待协议 "停止等待"就是发送方在发送完一个分组后停止发送,等待接收方的确认后再继续发送. 超时重传 发送方在等待一定时间后如果还没有收到接收方的确认,此时发送方将认定分组没有 ...
- 计算机网络(9)-----TCP可靠传输的实现
TCP可靠传输的实现 以字节为单位的滑动窗口 滑动窗口的滑动是以字节为单位的,发送方A和接收方B在TCP三次握手的前两次握手时协商好了发送窗口和接受窗口的大小,发送方A根据B发送来的确认连接报文中标明 ...
- TCP可靠传输的实现
TCP可靠传输的实现 1.概述 为方便描述可靠传输原理,假定数据传输只在一个方向上进行,即A发送数据,B给出确认 2.以字节为单位的滑动窗口 TCP的滑动窗口是以字节为单位的.为了 ...
- TCP可靠传输的工作原理
TCP可靠传输的工作原理 一.停止等待协议 1.1.简介 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数据在分组传输的平均往返时间更 ...
- 计算机网络传输层之TCP可靠传输
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105524592 学习课程:<2019王道考研计算机网络> 学习目的 ...
随机推荐
- Java操作redis客户端Jedis连接集群(Cluster)
创建JedisCluster类连接redis集群. @Test public void testJedisCluster() throws Exception { //创建一连接,JedisClust ...
- Linux使用/proc/stat计算CPU使用率
在Linux下,CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间,三者之和就是CPU的总时间,当没有用户进程.系统进程等需要执行 ...
- Leetcode1_两数之和
题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同 ...
- cs231n spring 2017 lecture5 Convolutional Neural Networks
1. 之前课程里,一个32*32*3的图像被展成3072*1的向量,左乘大小为10*3072的权重矩阵W,可以得到一个10*1的得分,分别对应10类标签. 在Convolution Layer里,图像 ...
- [LC] 303. Range Sum Query - Immutable
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...
- SHELL用法八(Grep语句)
1.SHELL编程Grep语句案例实战 1)Find是Linux操作系统文件和目录的路径检索.查询工具,而Grep是Linux系统下文本文件内容检索或者匹配工具,Grep称为全局正则表达式检索工具,在 ...
- 关于使用css变量实现主题的切换效果
现在要实现网页主题的切换成本较小的一种方案就是使用css的变量来实现 HTML 在HTML的body标签上先定义一个id元素属性 <body id="sm-theme"> ...
- CAD卸载/完美解决安装失败/如何彻底卸载清除干净cad各种残留注册表和文件的方法
在卸载cad重装CAD时发现安装失败,提示是已安装或安装失败.这是因为上一次卸载后没有清理干净,系统会误认为已经安装过了.有的同学是新装的系统也会出现安装失败的情况,这是因为C++ 或者.NET的原因 ...
- 安装centos7后不能联网
我们在安装centos的minimal版本后,在使用yum安装工具时会提示:cannot find a valid baseurl or repo:base/7/x86_64 这是因为不能联网导致的, ...
- 数据库三大范式和反范式 · oldmee
后一个范式都是在满足前一个范式的基础上建立的. 1NF 无重复的列.表中的每一列都是不可分割的基本数据项.不满足1NF的数据库不是关系数据库.如联系人表(姓名,电话),一个联系人有家庭电话和公司电话, ...