前文介绍了TCP建立连接和断开连接的方式。那在连接建立之后,TCP如何保证数据的可靠传输的呢?毕竟现实的网络环境是这样的复杂,出错、超时和丢包的种种问题时有发生,背后的秘密在哪里呢?跟随我们的文章,一起探究一下吧。

TCP重传机制

TCP协议是一种面向连接的可靠的传输层协议,它保证数据可靠传输的基本原理是在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到刚才发送数据的ACK确认报文(是通过确认序号的方式进行确认,即刚才发送数据的序列号+1),则对该报文进行重传。如果一直失败,满一定次数后就会放弃并发送一个复位信号。

显而易见,这个定时器的时间(RTO)相当关键,关系着网络资源是否被有效利用。

如果RTO设置过小,部分报文可能遇到网络拥堵或者延迟比较大的情形,这样就会频繁重传,浪费带宽。如果RTO设置过大的话,发送端需要等待过长时间才能发现数据丢失,影响网络的传输效率,造成的表象就是后端系统响应时间过长甚至超时,显然会给用户造成恶劣的影响,这是我们需要坚决规避的。

那设置RTO是否有依据呢?

一般RTO是根据网络中的RTT(传输往返时间)来自适应调整的。具体算法这边就不赘叙了。

接下来让我们通过两幅图来了解一下重传机制吧。

主机A发送数据给B之后, 可能因为网络拥堵等原因, 数据无法到达主机B。
如果主机A在一个特定时间间隔内没有收到B发来的确认应答, 就会进行重发。

但是主机A没收到确认应答也可能是ACK丢失了,如下图所示。

这种情况下, 主机B会收到很多重复数据。

那么TCP协议需要识别出哪些包是重复的, 并且把重复的丢弃。那TCP是如何去重的呢?

答案就是序列号(TCP将每个字节的数据都进行的编号),如下图所示:

每次主机B的确认应答都带有对应的确认序列号, 用来告知主机A, 我已经收到了哪些数据(收到的数据为确认序列号-1以下的字节数据),下一次你要从哪里开始发送,而已经接收的数据序列号会缓存在本地等待上层应用程序消费,如果已经重复了,则会丢弃。

比如, 主机A向主机B发送了1005字节的数据, 服务器返回给客户端的确认序号是1003, 那么说明服务器只收到了1-1002的数据. 1003的数据肯定没有收到,至于1004, 1005则不确定,即使收到了,也会暂时缓存, 等主机A重发1003收到后,直接向主机A确认应答,此时确认序列号应该为1006。

重传定时器

上面的定时器被称作重传定时器(Retransmission Timer),其在TCP发送报文段时,就会被创建(与该特定报文相关)。可能发生以下两种情况:

1.若在计时器截止时间到之前收到了对此特定报文段的确认,则撤销此计时器。

2.若在收到了对此特定报文段的确认之前计时器截止时间到,则重传此报文段,并将计时器复位。

是否还有其他定时器呢?如果有,它们又分别应用在什么场景呢?

(1)坚持计时器

先来考虑以下情景:发送端向接收端发送数据包直到接收窗口填满了,然后接收窗口告诉发送方接收窗口填满了,请停止发送数据。此时的状态称为“零窗口”状态,发送端和接收端窗口大小均为0。直到接收TCP发送确认并宣布一个非零的窗口大小,但这个确认会丢失。

众所周知,TCP对确认是不需要发送确认的。若确认丢失了,接收TCP并不知道,而是会认为它已经完成了任务,并等待着发送TCP接着会发送更多的报文段。但发送TCP由于没有收到确认,就一直等待对方发送确认来通知窗口大小,由此导致双方的TCP都在永远的等待着对方。要打开这种死锁,TCP需要为每一个链接使用一个坚持计时器。

当发送TCP收到窗口大小为0的确认时,就启动坚持计时器。当坚持计时器期限到时,发送TCP就发送一个特殊的报文段,叫做探测报文。这个报文段只有一个字节的数据。它有一个序号,但它的序号永远不需要确认;甚至在计算机对其他部分的数据的确认时该序号也被忽略。探测报文段提醒接收TCP:确认已丢失,必须重传。坚持计时器的值设置为重传时间的数值。但是,若没有收到从接收端来的响应,则需发送另一个探测报文段,并将坚持计时器的值加倍和复位。发送端继续发送探测报文段,将坚持计时器设定的值加倍和复位,直到这个值增大到门限值(通常是60秒)为止。在这以后,发送端每隔60秒就发送一个探测报文,直到窗口重新打开。

(2)保活计时器

保活计时器使用在某些实现中,用来防止在两个TCP之间的连接出现长时间的空闲。假定客户端建立了到服务器的连接,并传送了一些数据,然后就保持静默了。也许是这个客户出故障了。在这种情况下,这个连接将永远的处理打开状态。

要解决这种问题,在大多数的实现中都是使服务器设置保活计时器。每当服务器收到客户的信息,就将计时器复位。通常设置为两小时。若服务器过了两小时还没有收到客户的信息,他就发送探测报文段。若发送了10个探测报文段(每一个75秒)还没有响应,就假定客户除了故障,因而就终止了该连接。这种连接的断开当然不会使用四次握手,而是直接硬性的中断和客户端的TCP连接。

(3)时间等待计时器

时间等待计时器是在四次握手的时候使用的,上文已经提到过,这边就不重复了。

以上是关于TCP超时重传的探索,希望可以给大家带来收获。

其他文章可以关注微信公众号测试架构师养成记,还有价值999的资料可以领哦~

secoclient隧道保活超时或协商超时_绕不开的TCP之超时重传相关推荐

  1. secoclient隧道保活超时或协商超时_推荐:承德市隧道led大屏厂家电话【联丰智慧科技】...

    通过为大型隧道施工建设搭建全覆盖式的定位,可以有效施工的效率.项目现场的保障能力.安装隧道门禁能解决哪些问题?近年来,我国交通建设正处于高速发展的阶段,在交通建设中,工程安防工作也越发受到,越来越多的 ...

  2. nc提示java过期_用友U8 软件经常出现“超时已过期”的提示

    用友U8 软件经常出现"超时已过期"的提示用友U8 软件经常出现"超时已过期"的提示 问题原因:同解决方案 解决方法:请将SQL server中的属性中的效超时 ...

  3. TCP/IP传输层协议实现 - TCP的超时与重传(lwip)

    (参考<TCP-IP详解卷 1:协议> 第21章 TCP的超时与重传) 1.往返时间测量(RTT) 1.1.分组交换和RTT测量示例 <TCP-IP详解卷 1:协议>中分组交换 ...

  4. 【转】TCP/IP协议--TCP的超时和重传

    TCP是可靠传输.可靠之一体现在收到数据后,返回去一个确认.但是不能完全避免的是,数据和确认都可能丢失.解决这个办法就是,提供一个发送的重传定时器:如果定时器溢出时还没收到确认,它就重传这个报文段. ...

  5. java事务超时时间,java – 如何在WebSphere Liberty Batch中配置事务超时?

    > javax.transaction.global.timeout的作用是什么? >我是否需要在CheckpointAlgorithm中实现checkpointTimeout()方法? ...

  6. tcp前4字节消息长度_网络基础篇之TCP

    ​网络分层 什么是 TCP TCP 是面向连接的.可靠的.基于字节流的传输层通信协议. - 面向连接:通过三次握手建立一对一的连接( UDP 协议 可以一个主机同时向多个主机发送消息,即一对多): - ...

  7. tcp假连接_总结的23 个 TCP高频面试问题

    每个时代,都不会亏待会学习的人. 这篇文章我想由浅到深地过一遍 TCP,不是生硬的搬出各个知识点,从问题入手,然后从发展.演进的角度来看 TCP. 起初我在学计算机网络的时候就有非常非常多的疑问,脑子 ...

  8. tcp硬件校验和rxtx开启是啥意思_一文读懂 TCP/IP 网络模型

    前言 互联网是怎么构成的,又是怎么运作的?什么面试官老喜欢问 TCP/IP 网络?为什么远隔万里的计算机可以互相通信?计算机网络作为 IT 行业的基石,是工程师永远绕不开的话题. 网络的分层体系结构 ...

  9. 隧道保活超时或协商超时_丰巢快递柜超时收费的法律分析

    导读深圳市丰巢科技有限公司(以下简称"丰巢公司")4月末正式宣布快递柜"超时收费"办法:超过12小时之后每12小时收取5毛钱,直至3元封顶.此收费办法一经宣布便 ...

  10. 隧道保活超时或协商超时_隧道人员定位系统和隧道门禁系统

    公路.铁路隧道的建筑施工环境艰苦恶劣,工种危险系数高,工作人员人数多,使隧道建筑施工企业面临巨大的管理困难,迫切需求一种能够高效.准确的人员管理和安全管理系统.这种需求主要包括人员考勤.跟踪定位.灾后 ...

最新文章

  1. Dubbo常见面试题及答案汇总1000道(春招+秋招+社招)
  2. oracle数据库查表_oracle数据库常用的99条查询语句
  3. mysql count if 去重_MYSQL数据去重
  4. C语言中不检查数组下标是否越界。
  5. PL/SQL批处理语句:BULK COLLECT 和 FORALL
  6. 解决Spring Boot集成Shiro,配置类使用Autowired无法注入Bean问题
  7. Visio主题与样式
  8. python通过pcie读数据_PCIE硬盘能否直接被CPU读取?
  9. gson 解析json_Gson示例教程解析JSON
  10. [NOI 2010]超级钢琴
  11. php常见问题辨析(二)
  12. [原创].Net中绑定到DataView的问题
  13. 如何设置迪文DGUS屏的字体效果?
  14. Java零基础入门路径学习
  15. 中国水泥工业节能减排行业竞争力现状与投资前景规划研究报告2022-2027年新版
  16. 浅谈ES6后的TDZ时间死区
  17. 原装苹果手机_苹果手机换个屏水这么深!嘉兴警方揭开“原装屏”真相
  18. 移动端+京东移动端首页制作
  19. BT源代码学习心得(五):统一网络服务接口--RawServer -- 转贴自 wolfenstein (NeverSayNever)
  20. openresty中应用murmurHash

热门文章

  1. 【机器视觉】独家盘点:详解国内外34家物联网机器视觉技术企业
  2. ELK性能优化实战总结:java私塾初级模拟银源代码
  3. Cubase Elements v11.0.0 WiN 23GB含音色库 中文完整版编曲录音软件
  4. 关于PHP自定义采集图片脚本
  5. NERO9注册机使用
  6. 计算机组成原理试题和答案2017,【2017年整理】计算机组成原理试题及答案9.doc...
  7. Tapestry5之页面显示
  8. windows通过注册表修改IP
  9. 电脑在线时间调整服务器是多少,电脑时间校准服务器
  10. 数字系统——实验一:常用元器件的识别与简单测试