文档章节

TCP可靠传输&流量控制&拥塞控制

满小茂
 满小茂
发布于 2016/01/12 21:47
字数 3230
阅读 9252
收藏 295
点赞 23
评论 7

TCP可靠传输

TCP可靠传输的工作原理

1.无差错

1>:无差错: A发送分组M1,发送就暂停发送,等待B的确认,B收到M1就向A发送确认,A收到对M1的确认后再发送下一个分组。(若A收到连续的M1分组的确认信息,则证明M2缺失)
2>:出现差错:
        A只要超过一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,就重传前面发过的分组,叫超时重传。由重传计时器实现。
        而且:

                (1)A每次发送分组必须暂时保留分组副本;

                (2)分组和确认分组必须进行编号‘

                (3)超时计时器的重传时间应当比数据在分组的平均往返时间更多一些。

3>:如果B收到重复的分组M1,不向上一层交付;而且,向A发送确认。

2.超时重传

        其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。第一次发送后所设置的超时时间实际上为1.5秒,此后该时间在每次重传时增加一倍,一直到64秒,采用的是指数退避算法。一共重传12次,大约9分钟才放弃重传,该时间在目前的TCP实现中是不可变的,Solaris2.2允许管理者改变这个时间,tcp_ip_abort_interval变量。且其默认值为两分钟,而不是最常用的9分钟。

 

3.停止等待协

   优点是简单,但是信道利用率太低了。解决方法是采用连续ARQ协议,发送方维持发送窗口,每次连续发送几个分组,接收方采用累积确认,对按序到达的最后一个分组发送确认。

   缺点是不能向发送方反映出接收方已经正确收到的所有分组信息,例如丢失中间的分组。

 

4.TCP可靠传输的实现

TCP 连接的每一端都必须设有两个窗口——一个发送窗口和一个接收窗口。TCP 的可靠传输机制用字节的序号进行控制。TCP 所有的确认都是基于序号而不是基于报文段。
发送过的数据未收到确认之前必须保留,以便超时重传时使用。发送窗口不动(没收到确认)和前移(收到新的确认)
发送缓存用来暂时存放: 发送应用程序传送给发送方 TCP 准备发送的数据;TCP 已发送出但尚未收到确认的数据。接收缓存用来暂时存放:按序到达的、但尚未被接收应用程序读取的数据; 不按序到达的数据。
必须强调三点:
    1>   A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。

    2>   TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。
    3>   TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销

5.滑动窗口图解

   

    

 

 

TCP拥塞控制和流量控制的差别

     拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能承受现有的网络负荷。

       流量控制往往指的是点对点通信量的控制,是个端到端的问题。流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接受。

 

TCP流量控制

     所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受。利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。

      TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值。

      只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。

 

TCP流量控制原理

   所谓流量控制就是让发送发送速率不要过快,让接收方来得及接收。利用滑动窗口机制就可以实施流量控制。

         原理这就是运用TCP报文段中的窗口大小字段来控制,发送方的发送窗口不可以大于接收方发回的窗口大小。

         考虑一种特殊的情况,就是接收方若没有缓存足够使用,就会发送零窗口大小的报文,此时发送放将发送窗口设置为0,停止发送数据。之后接收方有足够的缓存,发送了非零窗口大小的报文,但是这个报文在中途丢失的,那么发送方的发送窗口就一直为零导致死锁。

         解决这个问题,TCP为每一个连接设置一个持续计时器(persistence timer)。只要TCP的一方收到对方的零窗口通知,就启动该计时器,周期性的发送一个零窗口探测报文段。对方就在确认这个报文的时候给出现在的窗口大小(注意:TCP规定,即使设置为零窗口,也必须接收以下几种报文段:零窗口探测报文段、确认报文段和携带紧急数据的报文段)。

 

TCP拥塞控制

 在某段时间,若对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变化,这种情况叫做拥塞。

拥塞控制设计

       拥塞控制是很难设计的,因为它是一个动态的问题,许多情况下,甚至正式拥塞控制机制本身成为引起网络性能恶化甚至死锁的原因。从控制理论的角度来看拥塞控制这个问题,可以分为开环控制和闭环控制两种方法。开环控制就是在设计网络时事先将有关拥塞发生的所有因素考虑周到,一旦系统运行起来就不能在中途改正。

     闭环控制是基于反馈环路的概念,包括如下措施:

     1)监测网路系统以便检测拥塞在何时何地发生

     2)把拥塞发生的信息传送到可采取行动的地方

     3)调整网络系统的行动以解决出现的问题。

 

拥塞控制方法

特网建议标准RFC2581定义了进行拥塞控制的四种算法,即慢开始(Slow-start)拥塞避免(Congestion Avoidance),快重传Fast Restrangsmit)快恢复Fast Recovery)。我们假定

     1)数据是单方向传送,而另外一个方向只传送确认。

     2)接收方总是有足够大的缓存空间,因为发送窗口的大小由网络的拥塞程度来决定。

 

下图是慢启动和拥塞避免的一个可视化描述。我们以段为单位来显示cwndssthresh,但它们实际上都是以字节为单位进行维护的。

        TCP Tahoe版本已经废弃。

      拥塞窗口概念

       发送报文段速率的确定,既要根据接收端的接收能力,又要从全局考虑不要使网络发生拥塞,这由接收窗口和拥塞窗口两个状态量确定。接收端窗Reciver Window)又称通知窗口(Advertised Window),是接收端根据目前的接收缓存大小所许诺的最新窗口值,是来自接收端的流量控制。拥塞窗口cwndCongestion Window)发送端根据自己估计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制

   (1)慢启动原理

     1)当主机开始发送数据时,如果立即将较大的发送窗口的全部数据字节都注入到网络中,那么由于不清楚网络的情况,有可能引其网络拥塞

     2)比较好的方法是试探一下,即从小到达逐渐增大发送端的拥塞控制窗口数值

     3)通常在刚刚开始发送报文段时可先将拥塞窗口cwnd(拥塞窗口)设置为一个最大报文段的MSS的数值。在每收到一个对新报文段确认后,将拥塞窗口增加至多一个MSS的数值,当rwind(接收窗口)足够大的时候,为了防止拥塞窗口cwind的增长引起网络拥塞,还需要另外一个变量---慢开始门限ssthresh

 

    (2)拥塞控制

  具体过程为:

      1TCP连接初始化,将拥塞窗口设置为1

      2)执行 慢开始算法:cwind按指数规律增长,知道cwind == ssthress开始执行 拥塞避免算法:cwnd按线性规律增长

       3)当网络发生拥塞,把ssthresh值更新为拥塞前ssthresh值的一半,cwnd重新设置为1,按照步骤(2)执行。

 

 

 

 

    (3)快重传和快恢复

     一条TCP连接有时会因等待重传计时器的超时而空闲较长的时间,慢开始和拥塞避免无法很好的解决这类问题,因此提出了快重传和快恢复的拥塞控制方法。

     快重传算法并非取消了重传机制,只是在某些情况下更早的重传丢失的报文段(如果当发送端接收到三个重复的确认ACK时,则断定分组丢失,立即重传丢失的报文段,而不必等待重传计时器超时)。

    例如:M1,M2,M3 -----> M1,M3,缺失M2,则接收方向发送方持续发送M2重复确认,当发送方收到M2的三次重复确认,则认为M2报文丢失,启动快重传机制,重传数据,其他数据发送数据放入队列,待快重传结束后再正常传输。

     快恢复算法有以下两个要点:

     1)当发送方连续收到接收方发来的三个重复确认时,就执行乘法减小算法,把慢开始门限减半,这是为了预防网络发生拥塞。

     2)由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是把cwnd(拥塞窗口)值设置为慢开始门限减半后的值,然后开始执行拥塞避免算法,使拥塞窗口的线性增大

 

备注:重传机制

        超时重传是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。

 

 

‍‍报文丢失重复确认情况‍‍

持续收到重复的ACK号,代表该报文丢失,触发快速重传机制

 

        Seq:就是告诉接收方:我发送的数据是从seq开始的。

        Ack:就是告诉接收方:我希望下次收到对端发过来的seq序号。

当重传主机从发送端接收到3个重复ACK时,它会假设此报文确实在传送中丢失,并且立即发送一个快速重传。一旦触发了快速重传,所有正在传输的其他报文都被放入队列中暂停发送,直到快速重传报文发送完为止。

过程如下图所示:

 

 

TCP三次握手,四次挥手

 

TCP标志位,有6种标示:

SYN(synchronous建立联机)

ACK(acknowledgement 确认)

PSH(push传送)

FIN(finish结束)

RST(reset重置)

URG(urgent紧急)

 

推荐

最后推荐一个不错的TCP/IP协议栈LwIP协议栈,可移植的协议栈

我的github上面有 源代码 ,地址:https://github.com/manmao/lwip_contrib.git

LwIP官网在:https://savannah.nongnu.org/projects/lwip/

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
满小茂
粉丝 65
博文 117
码字总数 126471
作品 0
成都
程序员
加载中

评论(7)

老汉-憨憨
老汉-憨憨
讲得不错,赞
_
_cache
mark
花开莫与流年错
花开莫与流年错
前几天刚考完计算机网络,4,话说英文版比中文版教材好
请叫我龙叔
请叫我龙叔
代码说话
满小茂
满小茂
理论也只能了解大概,最终要的是看协议源代码
mgic
mgic
mark。理论还是很重要的。
51pansou
51pansou
学习一下
计算机网络之运输层

1 运输层的功能 1.1 进程之间的通信 从通信和信息处理的角度看,运输层向应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层 当网络的边缘部分中的两个主机使用网络的...

芥末无疆sss
2017/12/13
0
0
传输层协议UDP和TCP

UDP和TCP的比较: UDP TCP UDP是无连接的 UDP提供不可靠服务 UDP同时支持点到点和多点通信 UDP是面向报文的 UDP首部8个字节 TCP是面向连接的 TCP提供可靠服务 TCP只能进行点到点通信 TCP是面...

Superheros
03/08
0
0
TCP封装的隧道对于拥塞控制的意义

引: 工作上,平时上网,都用到了OpenVPN,事实上我比较喜欢用TCP模式而不用UDP(直到发现了重传叠加),因为自从上学时代,我就会UDP不感冒,它除了多路复用,分解的作用外,和IP几乎一样,而...

晨曦之光
2012/04/10
454
0
计算机网路-传输层详解

一、传输层的服务基本原理 1.多路复用和解复用(分路)技术 复用是指:发送方的不同的应用进程都可以使用同一个传输层协议传送数据; 分路技术是指:接收方的传输层剥去报文首部之后能把这些...

sinat_38321889
01/13
0
0
【网络原理】期末复习笔记 第八章 传输层

第八章 传输层 作者:xuan97916 功能: 可靠传输(超时丢包重传) 拥塞避免(发送自动感知网络是否拥塞) 流量控制(接收端控制发送端的发送速度) 8.1 传输层协议应用场景 TCP (Transmiss...

XuAn97916
06/26
0
0
tcp的流量控制和拥塞控制

TCP的流量控制 1. 利用滑动窗口实现流量控制 如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接...

zhangyujsj
2015/10/16
120
0
Web 性能优化 - TCP

TCP 负责在不可靠的传输信道之上提供可靠的抽象层,向应用层隐藏了大多数网络通信的复杂性能,比如丢包重发、按需发送、拥塞控制及避免、数据完整,等等。采用 TCP 数据流可以确保发送的所有...

三毛丶
2017/12/02
0
0
Udp、Tcp、Http Socket

1.TCP与UDP 面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会...

V_joy
2016/07/26
45
0
java面试-计算机网络传输层知识点全覆盖

点击打开网络通信的七层协议 传输层概述 作用:传输层为它上面的应用层提供通信服务。 在OSI七层参考模型中,传输层是面向通信的最高层,也是用户功能的最底层。 传输层两大重要的功能:复用...

追风筝的猪
03/21
0
0
关于TCP/IP,必知必会的十个经典问题[转]

关于TCP/IP,必知必会的十个问题 原创 2018-01-25 Ruheng 技术特工队 一、TCP/IP模型 TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网...

sunsky303
03/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
2
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
1
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
158
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部