我的编程空间,编程开发者的网络收藏夹
学习永远不晚

TCP的重传机制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

TCP的重传机制

        我们都知道基于TCP协议的传输都是相对稳定和安全的,那么它是通过何种方法保证数据的正确性以及安全性呢,其中之一就是因为TCP具有重传机制。由于TCP是基于双方连接的,因此需要接收端和发送端保证连接之后才会发送有效信息,所以在介绍TCP的重传机制之前先介绍TCP是怎样保证连接性的,即TCP的三次握手

        TCP的三次握手: 三次握手的目的是保证客户端和服务器端都同时具有发送和接收的功能,具体的步骤如下。

        1,客户端发送连接请求包syn和一个序列号seq到服务器,自身进入发送请求状态

        2,服务器端接收到客户端发送的syn请求包后必须进行确认,并回应一个syn包和确认包ACK以及序列号seq+1,自身进入接收请求状态

        3,客户端收到服务器的回应之后会发送一个ACK确认包,自身进入已连接状态

        4,服务器端收到客户端发送的ACK确认包后自身进入已连接状态,完成三次握手

        在上述描述中客户端是主动进行连接,而服务器端是在收到客户端的连接请求之后被动进入连接 

 具体解释图如下:

          通过这样的三次握手,客户端与服务端建立起可靠的双工的连接,开始传送数据。三次握手的最主要目 的是保证连接是双工的,可靠更多的是通过重传机制来保证的,而所有的重传机制都是依赖于序列号seq以及确认应答ACK。所以解释以下什么是序列号和ACK。

        在使用TCP进行数据传输时每个消息都有带有TCP协议的包头,在包头中就存在seq序列号和ACK确认包。

seq(Sequence Number):32bits,表示这个tcp包的序列号。tcp协议拼凑接收到的数据包时,根据seq来确定顺序,并且能够确定是否有数据包丢失。

ack(Acknowledgment Number):32bits,表示这个包的确认号。首先意味着已经收到对方了多少字节数据,其次告诉对方接下来的包的seq要从ack确定的数值继续接力。

在三次握手中:

  • 起始包的seq都等于0
  • 三次握手中的ack=对方上一个的seq+1
  • seq等于对方上次的ack

        常见的重传机制主要有以下几种:

                超时重传

                快速重传

                SACK

                D-SACK

         例如在正常传输过程中过程如下:

         客户端将带有用户数据的包发送给服务器,序列号seq = 1,服务器收到该数据包后进行确认,ACK的值为数据包的seq值+1代表下一个包的序列号,因此 客户端需要发送的下一个数据包的seq值为服务器回应的ACK+1。

        超时重传 

                假如客户端一共发送了五个包,序列号分别为1,2,3,4,5,假如第三个包在传输过程中失败了那么服务器只收到了1,2,所以回应的ACK为3,但是下次一收到的包的序列号seq为4,该序列号显然不是服务器所期待的因此便不再回应ACK直到发送端发送期待的序列号为止。在发送端这边由于自己已经将序列号seq = 3的包发送出去因此一直在期待对方回应ACK = 4,但是却没有收到,这时双方就开始摆烂了,两个都不发。因此重传就能够打破这种僵局,由发送端再发送一次丢失的包即可。而重发也需要一定的条件,在实际情况中在一定的时间间隔内不管是因为发送端的数据未到达或者是接收端未回应ACK都会造成消息的重传。如下图在RTT的时间间隔内如果发送端没有收到确认信息就会进行消息重传,如果RTO较长就会造成网络延迟,导致接收方在很久之后才会收到对应的包,但是在这个时间段内发送方由于长时间未接收到该包的ACK,因此会进行重传,就会造成同一个包重复被发送。

 

        这时又出现两种重传的情况:

                (1) 发送端重传丢失的包即可

                (2) 发送端重传丢失之后的所有包

        因为发送端并没有接收到发送失败的那个包之后的ACK,因此它就会认为所有的包都丢了,所以会将错误后的所有包都进行重传,但实际情况并不是它想的那样,而是只有一个包发生了错误。所以这种方法比较浪费资源,这种是比较简单的超时重传。

快速重传

        快速重传不以时间作为重发的判断条件,而是以收到的ACK的重复次数作为判断条件。

        如果接收端没有收到自己所期望数据包就会一直发送上一次的ACK,发送三次后发送端便进行重传。例如,发送端发送分别发送1,2,3,4,5五个包,假如第二个包由于某种原因丢失了,那么由于第一个包是成功发送的所以接收端回应的ACK为2,但是一直没有收到这个包,因此便会在发送端发送其他包过来时也一直回应ACK = 2,直到发送了三次,发送端这才直到接收端是没有收到第二个包,于是便会重传,由于3,4,5,在这个过程中已经发送到了接收端,接收端也已经收到了,所以在第二个包被重传之后接收端便会回应ACK = 6。

        但是也有一个问题就是重传的时候是否只需要重传出错的这个还是重传从错误的这个开始之后的所有数据,因为在收到接收端重复回应的ACK时并不知道是对哪一个包的回应。

SACK(selective Acknowledge) 选择性确认

         SACK在快速重传的基础上,接收端会返回最近收到的报文段的序列号范围,这样发送端就知道,哪些数据包已经到达接收端了。

        如下图,发送方收到了三次同样的 ACK 确认报文,于是就会触发快速重发机制,通过 SACK 信息发现只有 200-299这段数据丢失,则重发时,就只选择了这个 TCP 段进行重复。

        DSACK (Duplicate SACK) 重复发送SACK

         DSACK这个机制是在 SACK 的基础上,额外携带信息,告知发送方有哪些数据包自己重复接收了。DSACK 的目的是帮助发送方判断,是否发生了包失序、ACK 丢失、包重复或伪重传。让 TCP 可以更好的做网络流控。

        由于发送方之前发送的两个包都没有得到回应,当时间到达RTT后发送方便进行重发,但是接收方已经接收过该包了只是发送方没有收到ACK而已,因此接收方回应的ACK为最新数据的ACK,这时发送方收到回应信息后便知道之前的消息对方是接收到了只是回应的 ACK丢失了。

        网络延迟:

          由于1000-14999的数据包被网络延迟造成未按时到达,在其他的包到达时接收方便会一直回应ACK = 1000表示没收到这个包,因此发送方便会进行重传,但是当网络延迟结束之后1000-1499包才到达接收端,这时接收方回复的ACK已经到了3000,明显这个包应该在之前就应该到达了,因此便发送了一个SACK,因此该SACK是DSACK,用于供发送方判断出现该情况的原因。

 

来源地址:https://blog.csdn.net/guishangppy/article/details/127055770

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

TCP的重传机制

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

TCP的超时与重传机制是什么

这篇文章主要介绍“TCP的超时与重传机制是什么”,在日常操作中,相信很多人在TCP的超时与重传机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”TCP的超时与重传机制是什么”的疑惑有所帮助!接下来,请跟
2023-06-27

详说TCP重传问题的排查思路与实践

导读本文总结自己工作过程中遇到的TCP重传问题的解决过程 ,侧重于大致的解决问题的思路与具体的实践,理论知识偏少,大家有兴趣的可以多查阅相关文章以便深入了解tcp的工作机制。关于TCP重传
2023-06-04

TCP传输协议如何进行流量控制?

TCP流量控制,简单来说就是让数据传输端传输的速率不要太快,让数据接收端来得及接收,利用滑动窗口机制可以很方便的在TCP连接上实现对数据传输端的流量控制。TCP的窗口单位是字节,不是报文段,数据传输端的发送窗口不能超过接收端给出的接收窗口
2023-06-03

CentOS下TCP断线监测机制详解

本篇内容主要讲解“CentOS下TCP断线监测机制详解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CentOS下TCP断线监测机制详解”吧!TCP正常的断开,通信双方(服务端和客户端)都是能知
2023-06-10

传输层TCP与UDP 的比较

编程学习网:TCP是面向连接的,有比较高的可靠性,而UDP是面向无连接的
传输层TCP与UDP 的比较
2024-04-23

如何使用 Golang 实现 HTTP 文件上传的重试机制?

使用 go 实现 http 文件上传重试机制:使用 client.do() 方法发送请求。在发生错误时,等待指定的秒数(retrywaitseconds)。最多重试 maxretries 次。如果重试次数达到上限,则返回错误 "maximu
如何使用 Golang 实现 HTTP 文件上传的重试机制?
2024-05-14

kafka的重试机制和ack机制是什么

Kafka的重试机制是指在消息发送过程中,如果发送失败或者出现异常,Kafka会自动尝试重新发送消息。重试机制的目的是确保消息能够成功发送到目标主题。Kafka的重试机制包括两个方面:Producer端重试:当Producer发送消息时,
2023-10-26

【重试】Java 中的 7 种重试机制

随着互联网的发展项目中的业务功能越来越复杂,有一些基础服务我们不可避免的会去调用一些第三方的接口或者公司内其他项目中提供的服务,但是远程服务的健壮性和网络稳定性都是不可控因素。在测试阶段可能没有什么异常情况,但上线后可能会出现调用的接口因为
2023-08-21

Android事件传递机制

实验环境 OS X 10.9 Eclipse(ADT) Android源码版本:API Level 19(Android 4.4)Android事件构成 在Android中,事件主要包括点按、长按、拖拽、滑动等,点按又包括单击和双击,另外还
2022-06-06

PHP重写session机制

众所周知,session在web应用中占有举足轻重的地位。而且,在很多情况下我们需要改变session的存储位置。当然了,改变session存储的位置可以在php.ini文件中直接修改。但是,这需要我们对服务器有足够的权限。可是事实却是在很
PHP重写session机制
2024-02-27

AndroidHandler消息传递机制

Handler是一套Android消息传递机制,主要用于线程间通信。用最简单的话描述:handler其实就是主线程在起了一个子线程,子线程运行并生成Message,Looper获取message并传递给Handler,Handler逐个获取子线程中的Message
2022-12-16

AndroidBroadcastReceiver传输机制详解

Android开发的四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(BroadcastReceive),勇于接收广播;内容提供者(ContentProvider),支持多个应用中存储和读取数据,相当于数据库,本篇着重介绍广播组件
2023-01-31

Zookeeper选举机制(重点)

前言半数机制(Paxos 协议):集群中半数以上机器存活,集群可用。所以zookeeper适合装在奇数台机器上。 Zookeeper虽然在配置文件中并没有指定master和slave。但是,zookeeper工作时,是有一个节点为leader,其他则为foll
Zookeeper选举机制(重点)
2017-07-10

ASP.NET传输机制是什么

这篇文章主要介绍“ASP.NET传输机制是什么”,在日常操作中,相信很多人在ASP.NET传输机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ASP.NET传输机制是什么”的疑惑有所帮助!接下来,请跟
2023-06-18

关于spring中事务的传播机制

这篇文章主要介绍了关于spring中事务的传播机制,所谓事务传播机制,也就是在事务在多个方法的调用中是如何传递的,是重新创建事务还是使用父方法的事务,需要的朋友可以参考下
2023-05-20

编程热搜

目录