iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >TCP的重传机制
  • 610
分享到

TCP的重传机制

tcp/ip服务器网络 2023-09-22 09:09:03 610人浏览 安东尼
摘要

        我们都知道基于tcp协议的传输都是相对稳定和安全的,那么它是通过何种方法保证数据的正确性以及安全性呢,其中之一就是因为TCP具有重传机制。由于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

--结束END--

本文标题: TCP的重传机制

本文链接: https://www.lsjlt.com/news/415099.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • TCP的重传机制
            我们都知道基于TCP协议的传输都是相对稳定和安全的,那么它是通过何种方法保证数据的正确性以及安全性呢,其中之一就是因为TCP具有重传机制。由于TCP是基于双方连接的,因此需要接收端和发送端保证连接之后才会发送有效信息,所...
    99+
    2023-09-22
    tcp/ip 服务器 网络
  • TCP的超时与重传机制是什么
    这篇文章主要介绍“TCP的超时与重传机制是什么”,在日常操作中,相信很多人在TCP的超时与重传机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”TCP的超时与重传机制是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-27
  • 详说TCP重传问题的排查思路与实践
    导读本文总结自己工作过程中遇到的TCP重传问题的解决过程 ,侧重于大致的解决问题的思路与具体的实践,理论知识偏少,大家有兴趣的可以多查阅相关文章以便深入了解tcp的工作机制。关于TCP重传...
    99+
    2023-06-04
  • TCP传输协议如何进行流量控制?
     TCP流量控制,简单来说就是让数据传输端传输的速率不要太快,让数据接收端来得及接收,利用滑动窗口机制可以很方便的在TCP连接上实现对数据传输端的流量控制。TCP的窗口单位是字节,不是报文段,数据传输端的发送窗口不能超过接收端给出...
    99+
    2023-06-03
  • 【计算机网络】传输层协议——TCP(下)
    文章目录 1. 拥塞控制慢启动滑动窗口最终大小为什么采用指数增加的方案,来设计对应的拥塞窗口的增加速度? 2. 延迟应答3. 粘包问题4. TCP异常情况(面试题)进程终止机器重启网线断开...
    99+
    2023-09-20
    计算机网络 tcp/ip
  • C++ TCP/IP 关于tcp断线重连的问题
    在工控上经常用到tcp连接,比如串口服务器或某些支持modbustcp协议的仪表等,以前尽量使用串口服务器的虚拟串口功能,现在逐步使用上了tcpserver或tcpclient模式。 搜索了个C++ 的tcp断线重连的案例(http://w...
    99+
    2023-09-18
    tcp/ip 网络 服务器 c++
  • 【计算机网络】传输层协议——TCP(中)
    文章目录 1. 三次握手三次握手的本质是建立链接,什么是链接?整体过程三次握手过程中报文丢失问题为什么2次握手不可以?为什么要三次握手? 2. 四次挥手整体过程为什么要等待2MSL 3...
    99+
    2023-09-20
    计算机网络 tcp/ip 网络
  • CentOS下TCP断线监测机制详解
    本篇内容主要讲解“CentOS下TCP断线监测机制详解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CentOS下TCP断线监测机制详解”吧!TCP正常的断开,通信双方(服务端和客户端)都是能知...
    99+
    2023-06-10
  • 如何使用 Golang 实现 HTTP 文件上传的重试机制?
    使用 go 实现 http 文件上传重试机制:使用 client.do() 方法发送请求。在发生错误时,等待指定的秒数(retrywaitseconds)。最多重试 maxretries...
    99+
    2024-05-14
    golang http
  • kafka的重试机制和ack机制是什么
    Kafka的重试机制是指在消息发送过程中,如果发送失败或者出现异常,Kafka会自动尝试重新发送消息。重试机制的目的是确保消息能够成...
    99+
    2023-10-26
    kafka
  • 【重试】Java 中的 7 种重试机制
    随着互联网的发展项目中的业务功能越来越复杂,有一些基础服务我们不可避免的会去调用一些第三方的接口或者公司内其他项目中提供的服务,但是远程服务的健壮性和网络稳定性都是不可控因素。在测试阶段可能没有什么异常情况,但上线后可能会出现调用的接口因为...
    99+
    2023-08-21
    java php 开发语言
  • JS面试之异步模拟超时重传机制详解
    目录引言题目分析代码设计核心讲解引言 前面我讲解了两篇有关异步的逻辑思维题目,一个是红绿灯转换,还有一个是异步并发限制。有小伙伴私信我说不过瘾,希望还能再出一篇异步超时重传的讲解。为...
    99+
    2024-04-02
  • AndroidHandler消息传递机制
    目录Handler 消息传递机制Handler Looper MessageQueue关系Looper 使用Handler 消息传递机制 Android中每一个应用就是一个进程,Ha...
    99+
    2022-12-16
    Android Handler Android Handler消息传递
  • PHP重写session机制
    众所周知,session在web应用中占有举足轻重的地位。而且,在很多情况下我们需要改变session的存储位置。当然了,改变session存储的位置可以在php.ini文件中直接修改。但是,这需要我们...
    99+
    2024-02-27
  • AndroidBroadcastReceiver传输机制详解
    目录Broadcast广播的种类普通广播(Normal broadcasts)有序广播(ordered broadcasts)异步广播(粘滞性滞留广播)Broadcast 应用程序之...
    99+
    2023-01-31
    Android BroadcastReceiver传输机制 Android BroadcastReceiver
  • Java重点:反射机制的使用
    目录 一、概念 二、类类 1、类类的获取方式 1)类名.Class 2)对象.getClass() 3)Class.forName() 三、反射实例化 1、调用一个公有的无参构造方法 2、调用一个公有的一个参构造方法 3、调用一个公有的两...
    99+
    2023-09-12
    java 开发语言 jvm eclipse java-ee
  • ASP.NET传输机制是什么
    这篇文章主要介绍“ASP.NET传输机制是什么”,在日常操作中,相信很多人在ASP.NET传输机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ASP.NET传输机制是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-18
  • 怎么进行TCP可靠传输的实现
    本篇文章为大家展示了怎么进行TCP可靠传输的实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一.以字节为单位的滑动窗口在TCP里,接收端(B)会给发送端(A)报一个窗口的大小,叫Advertise...
    99+
    2023-06-03
  • 关于spring中事务的传播机制
    目录Spring中的事务准备工作实体类DAO层Service层测试类传播机制REQUIREDREQUIRES_NEWSUPPORTSMANDATORYNOT_SUPPORTEDNEV...
    99+
    2023-05-20
    spring 事务 事务传播机制
  • Python retrying 重试机制详解
    目录循环加判断retrying总结 我们在程序开发中,经常会需要请求一些外部的接口资源,而且我们不能保证每次请求一定会成功,所以这些涉及到网络请求的代码片段就需要加上重试机制。下面来...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作