前文介绍了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. python中break可以用在for和if中吗_Python的for和break循环结构中使用else语句的技巧...
  2. 【Python学习】使用Pyinstaller将py文件导出为exe文件
  3. 神策数据丨IPTV/OTT 精细化运营体系构建指南
  4. 修改linux系统用户最大线程数限制
  5. C++模板剖析:函数模板、类模板解析
  6. python收集数据程序_基于Python语言的互联网数据收集软件的设计
  7. Navicat工具导出Mysql数据表结构到Excel文件中
  8. 系统运维tips 3 之 innodb
  9. 采用批处理命令对文件进行解压及采用SQLCMD进行数据库挂载
  10. 拼多多2018校招内推编程-大整数相乘
  11. Osql\sqlcmd工具管理 SQL Server
  12. Android:什么是签名、为什么要给应用程序签名、如何给应用程序签名
  13. java odbc timesten_TimesTen 使用ODBC连接数据库的程序问题
  14. 曼昆微观经济学第8版笔记和课后习题答案
  15. ThinkPad 鼠标 滚轮左右倾斜切换win10 虚拟桌面
  16. 写论文需要使用一个Github上的模型取数据,具体要求在代码里
  17. mysql-cluster安装与配置
  18. python找与7相关的数字_Python 入门系列 —— 7. 数字类型介绍
  19. A performance evaluation of local descriptors——局部描述子评估译文(1,2,...)
  20. 解决office2010安装过程出错的问题

热门文章

  1. 蓝鲸ERP标准版-进销存-采购管理子系统操作说明1
  2. 借鉴一下人家辞职申请
  3. nero刻录软件linux,下载:Linux平台刻录工具NeroLINUX 3.5.2.0版
  4. 微型计算机原理及应用考试重点,微型计算机原理及应用考试重点.doc
  5. 计算机音乐的制作流程,Premiere制作音乐电子相册的方法和流程 计算机类数媒...
  6. 导出到word时,报错
  7. SuperScan扫描器
  8. 没有密码怎样删除officescan
  9. officescan使用apache跳轉設置
  10. php cc攻击代码,PHP DDOS的UDP攻击,TCP攻击,和CC攻击的核心代码