上一次我们知道了TCP协议通过连接管理机制保证可靠性,今天我们继续来看一看TCP协议中其他几种保证可靠性的方法。

· 确认应答机制 
· 超时重传机制 
· 流量控制 
· 拥塞窗口

确认应答机制 
在将这部分的内容之前我们应该首先知道的一点就是,在TCP中,TCP将每个字节的数据都进行了编号,即为序列号(对每一个数据的编号)。 
 
 
由图分析:当主机1给主机2发送了1~1000这么多数据时,主机2如果收到了就会给主机1应答(ACK报文段,每一个ACK都带有对应的确认序列号),表示你给我发的1~1000的数据我已经全部收到了(收到哪些数据),下次你再给我发就给我从1001数据开始发(下次从哪里开始发)。那么主机1收到应答之后就知道对方已经收到了1~1000的全部数据,所以再一次发送数据的时候他就会从1001开始发,后面都是依此类推的情况。

当然了,当我们的主机1给主机2发送了数据之后,经过一端时间主机1并没有收到主机2的应答的情况也是有的,所以这个时候为了确保数据的准确到达,TCP就有了超时重传机制。 
超时重传机制 
主机1没有收到主机2的确认应答有以下两种情况: 
1、数据根本就没有传送到达主机2,因此主机2就不会回传一个确认应答的报文。 
 
由图分析:主机1给主机2发送了数据,可能因为其他的原因数据无法到达主机2.(比如网络拥堵)。这个时候主机1等待了一个特定的时间间隔之后发现主机2还没有确认应答,于是就再一次将上一次的数据重新发送过去。

2、主机2收到了数据,也回传了确认应答报文,但是该报文丢失了。 
 
由图分析:主机2收到了主机1发来的数据,但是发给主机1的确认应答并没有准时到达主机1,所以主机1也会因为没有收到确认应答而再次重新将数据发送过去。但实际情况却是我们的主机2第一次就已经收到了主机1的数据。但是主机1依旧会重发数据已确保主机2已经收到数据,从而进行下一次的数据转发。可想而知主机2就会收到很多的重复数据,但是重复的数据显然是不需要的,那么TCP协议就需要能够识别那些重复的数据并且要将冲符的数据丢弃掉,这个时候序列号就发挥他的一项作用了——去重。每一个数据都有自己的序列号,如果主机2收到重复的数据那么必然机会产生多个序列号相同的数据,那么序列号相同的数据就必然是重复的数据。

我们提到一个特定的时间间隔,这个时间又是如何规定的?

最理想的情况下,找到一个最小的时间保证确认应答一定能在这时间内返回 
但是这个时间的长短,随着网络环境的不同,也是有差异的。 
如果超时时间设得太长,会影响整体的重传效率 
如果超时时间设的太短,有可能平凡的发送冲符的数据包。 
TCP为了抱枕个无论在何种环境下都能比较高性能的通信,因此会动态计算这个最大超时时间: 
Linux中,超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。 
如果重发一次,任然得不到应答,就等待2*500ms后在进行重传 
如果还得不到应答,等待4*500ms再重传,一次类推,以指数形式递增。 
累积到一定的重传次数,TCP认为网络或者对端主机出现异常,就会强制关闭连接。

流量控制 
接收端处理数据的速度是优先的,如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送就会造成丢包,继而引起丢包重传等一系列连锁反应。因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制就叫做流量控制。

接收端将自己可以接受的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK段通知发送端; 
窗口大小字段越大,说明网络的吞吐量越高 
接收端一旦发现自己的缓冲区快满了就会将窗口大小设置成一个更小的值通知发送端。 
发送端接收到窗口大小以后,就会减慢自己的发送速度。 
如果接收缓冲区满了,就会将窗口置为0,这时发送方不再发送数据。 
但是需要定期的发送一个试探窗口,,目的是为了取探测数据段,是接收端把窗口大小告诉发送端。

接收端是如何把窗口大小告诉发送端的呢?现在,我们回过头去看一看,在上一篇博客中我们给出了TCP的报头格式,在TCP的首部中有一个16位的窗口大小的字段,就是存放的窗口大小的信息。另外在TCP的首部中的40字节选项中还包含了一个窗口扩大因子M,实际的窗口大小是窗口字段的值左移M位。

拥塞窗口 
在后面会讲到TCP提高性能的滑动窗口,滑动窗口能够高效可靠的发送大量的数据,但是如果在一开始就发送大量的数据任然可能引发问题。要知道在网络上有很多的计算机,有可能当前的网络状态已经很拥堵,在不清楚当前的网络状态下,贸然发送大量的数据,这样对于已经很拥堵的网络来说无疑是雪上加霜。 
由此,TCP引入了慢启动机制:先发送少量的数据,由此取探测当前的网络的拥堵状态,在决定按照多大的速度传输数据。 

拥塞窗口: 
发送开始的时候定义拥塞窗口大小为1 
每当收到一个ACK应答以后拥塞窗口加1 
每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小作比较,取较小值作为实际发送的窗口。 
如图,拥塞窗口的增长速度呈指数形式增长,我们提到说慢启动,只是说出事的时候慢而已,但是增长速度非常的快。为了增长的不呢么快,因此我们不能让拥塞窗口单纯的加倍,这里引入一个慢启动的阈值,当同色窗口超过这个阈值的时候,不再按照指数方式增长,而是改为按照线性的方式增长。 
当TCP开始启动的时候,慢启动阈值等于窗口最大值,在每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置为1。

少量的丢包,仅仅只会触发超时重传,而大量的丢包就认为是网络拥堵,当TCP通信开始后,网络吞吐量会逐渐的上升,随着网络发生拥堵,吞吐量会立刻下降,拥塞控制说到底就是TCP协议想尽可能快的将数据传输给对方,但又要避免给网络造成太大的压力的折中解决办法。

至此,TCP协议保证可靠性的极大机制我们已经全部学习完成。 
总结一下: 
为了确保可靠的数据传输,TCP协议通过连接管理机制,确认应答机制,流量控制以及拥塞控制这些方法让可靠性得以很大程度上的保证,另外,序列号保证了数据的按序到达,就知道哪些数据已经收到,那些没有收到需要重传。而校验和通过CRC校验,如果接收端校验不通过则认为数据有问题,此举也保证了数据的可靠性传输。

TCP协议可靠性保证(确认应答机制,超时重传机制,流量控制,拥塞窗口)相关推荐

  1. 【TCP 协议2】确认应答、超时重传机制

    文章目录 前言 一.确认应答 1, 什么是确认应答 2, 序列号和确认应答号 二.超时重传 1, 什么是超时重传 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:

  2. 网络原理 --- 传输层Ⅱ TCP协议中的确认应答,超时重传和连接管理

    文章目录 网络原理 传输层 TCP 协议 TCP的基本特性 1.确认应答 2.超时重传 3.连接管理 ❗❗①建立连接(三次握手) ②断开连接(四次挥手) 总结 网络原理 介绍TCP/IP协议中每一层里 ...

  3. 确认应答机制超时重传机制序列号延迟应答捎带应答

    序列号 一.什么是序列号? TCP会对每个字节的数据都进行编号,数据的编号就是数据的序列号,每个字节都有自己独一无二的编号,故序列号具有唯一性 二.序列号的作用? 接收端为了区别重复的报文段(报文段也 ...

  4. 4-5:TCP协议之确认应答(ACK)机制和超时重传机制

    文章目录 一:TCP的确认应答(ACK)机制 二:超时重传机制 一:TCP的确认应答(ACK)机制 在TCP中,当发送端的数据达到接收主机时,接收端主机会返回一个已收到消息的通知,这个消息叫做ACK( ...

  5. TCP协议-如何保证传输可靠性

    TCP协议传输的特点主要就是面向字节流.传输可靠.面向连接.这篇博客,我们就重点讨论一下TCP协议如何确保传输的可靠性的. 确保传输可靠性的方式 TCP协议保证数据传输可靠性的方式主要有: 校验和 序 ...

  6. TCP协议-TCP超时重传机制

    一.前言 在TCP通信中,既要保证在网络正常的情况下提供可靠的交付服务,又要保证在网络异常的情况下也提供可靠的交付服务.而TCP的超时重传机制就是解决在网络异常情况下的可靠传输问题的. 二.通过序列号 ...

  7. TCP/IP,TCPsocket,tcp协议的特点,tcp报文段最长字节数,tcp头内容,确认号和超时时限的设定细节,tcp协议是GBN和SR的混合体,

    TCP/IP,TCPsocket,tcp协议的特点,tcp报文段最长字节数,tcp头内容,确认号和超时时限的设定细节,tcp协议是GBN和SR的混合体, 一.TCPsocket 1.TCP是面向连接的 ...

  8. TCP/IP协议栈:TCP超时重传机制

    目录 基础概念 重传超时时间RTO RTO的设定 连接往返时间RTT RTT的计算 Karn算法 往返时间测量 重传 拥塞避免算法 快速重传和快速恢复算法 重新分组 网络数据包丢失,重传和重复确认 是 ...

  9. 计算机网络超时重传时间,TCP超时重传机制

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

最新文章

  1. Docker Hub 官方仓库发布编程语言包
  2. 消息中间件的实现方案
  3. ios 阅览器html5,HTML5测试:iOS 8浏览器Safari提升明显
  4. 2018-2019-1 20189213《Linux内核原理与分析》第四周作业
  5. 狄慧201771010104《面向对象程序设计(java)》第八周学习总结
  6. c语言程序报告的前言,C语言 程序代码编写规范前言
  7. 11-Container With Most Water
  8. 右键tomcat 选择 add and remove,出现的对话框里面没有我们的项目解决方法
  9. 时间序列预测算法总结
  10. C#调用电脑的默认图片浏览器软件打开图片
  11. Kettle使用 js 文件生成节假日表文件 附带2019-2020节假日文件
  12. 这才是在线Word转PDF的正确姿势
  13. 多项式回归分析之预测成本和利润
  14. 机器学习课堂笔记-作业二基本实现思路
  15. 基于android平台的语音机器人服务娱乐系统
  16. 通过耳道形状来验证用户身份?苹果:未来,AirPods可能实现
  17. postcss-px2vw-pv 利用postcss实现 viewport 全新单位 pv
  18. 片选,怎么看时序图,电路原理图
  19. JavaScript 生命周期
  20. Python3基础教程2——Python的标准数据类型

热门文章

  1. Chapter1 CLR的执行模式
  2. left join on 后and 和 where 的区别
  3. ecshop在PHP 5.4以上版本各种错误问题处理
  4. Mac 开发中如何设置 关闭 以及最小化 最大化按钮事件处理
  5. 可称之为“伟大”的公司
  6. StoryBoard学习..(很详细.)
  7. GridView 激发了未处理的事件“RowEditing”
  8. 64位以内Rabin-Miller 强伪素数测试和Pollard rho 因数分解解析
  9. Tomcat 8.5.29启动报TldScanner.scanJars错误问题解决办法
  10. 26.Silverlight多线程技术ThreadPool的使用