网络的救命稻草:重传机制如何确保数据顺利传输?

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 在网络传输中,数据的可靠性和稳定性一直是一个重要的挑战。幸运的是,重传机制应运而生,为我们解决了这个问题。本文将深入探讨重传机制在网络中的应用和工作原理。我们将介绍TCP中最常见的超时重传和快速重传,以及SACK和D-SACK这两种高级重传机制。了解这些机制如何工作可以帮助我们更好地理解数据传输的可靠性和稳定性的保障。

重传机制

在设计架构或涉及网络时,我们都知道网络是不可靠的,可能会发生超时、断开连接、网络分区等各种问题。这些问题对于数据传输的可靠性和稳定性产生了很大的挑战。为了解决这些问题,各个组织都设立了专门的网络部门,致力于研究和解决网络问题。

TCP实现可靠传输的方式之一是通过序列号与确认应答。在TCP中,当发送端的数据包到达接收主机时,接收主机会返回一个确认应答消息,表示已经成功接收到数据。
image

然而,由于网络的不可靠性,有时候确认应答消息可能丢失或延迟到达。为了解决这个问题,TCP引入了重传机制。接下来说说常见的重传机制:

  • 超时重传:当发送端发送了一个数据包后,会启动一个定时器,等待接收端的确认应答。如果在指定的时间内没有收到确认应答,发送端会认为数据包丢失,然后重新发送该数据包。
  • 快速重传:在TCP中,如果发送端连续收到3个重复的确认应答,就会认为有一个数据包丢失了。此时,发送端会立即重传该数据包,而不再等待超时。
  • SACK:SACK是Selective Acknowledgement(选择性确认)的缩写,它允许接收端在确认应答中指定哪些数据包已经收到,哪些数据包还没有收到。这样,发送端就可以根据接收端的确认情况,有选择地进行重传。
  • D-SACK:D-SACK是Duplicate Selective Acknowledgement(重复选择性确认)的缩写,它允许接收端在确认应答中指定哪些数据包是重复接收的。发送端可以根据这些信息来判断哪些数据包需要重传。

超时重传

超时重传是TCP中最简单也是最常见的形式之一,它的工作原理如下:发送方在发送数据后会设定一个定时器,当超过一定时间后,如果发送方未收到接收方发送的ACK数据包,就会触发超时重传机制,即重新发送之前未收到ACK的数据包。

超时重传机制主要应用于以下两种情况中:

  1. 数据包未能到达接收方:在这种情况下,接收方无法发送ACK确认,因为它根本没有收到数据包。
  2. 接收方发送的ACK丢失:在这种情况下,接收方确实接收到了数据包并发送了ACK,但ACK在网络传输过程中丢失了。

image

如果超时重发的数据,再次超时的时候,又需要重传的时候,TCP 会将下一次超时时间间隔设为先前值的两倍。通过将超时时间间隔加倍,TCP 在网络不稳定时能够适当延长等待时间,以期待数据包能够成功传输。这种策略的目的是避免过早地重传数据,从而减少网络拥塞和带宽浪费。

通过观察上述两种情况,我们需要记住:网络传输是双向的,因此在任何时候都需要考虑发送方和接收方之间的传输线路。这样,我们就可以更好地理解下面要介绍的几种重传机制。

超时触发重传存在的一个问题是,超时周期可能相对较长,导致数据传输的延迟。为了解决这个问题,我们可以采用「快速重传」机制,从而缩短重传的等待时间。

快速重传

TCP还有一种称为快速重传(Fast Retransmit)的机制,它不是基于时间而是基于数据的驱动重传。快速重传机制的工作原理其实非常简单,我用一张图来说明:

image

在上图中,发送方发送了1、2、3、4、5五份数据:

  1. 第一份数据Seq1先到达接收方,接收方发送了Ack2回应;
  2. 由于某些原因,第二份数据Seq2未到达,但第三份数据Seq3到达了,接收方仍然发送了Ack2回应;
  3. 后面的Seq4和Seq5都到达了,但接收方仍然发送了Ack2回应,因为Seq2还未到达;
  4. 发送方收到了三个Ack=2的确认,意识到Seq2还未到达,于是在定时器过期之前,重传了丢失的Seq2;
  5. 最后,接收方收到了Seq2,此时因为Seq3、Seq4、Seq5都已经收到,接收方发送了Ack6回应。

至于为什么每次都返回的是ACK=2,而不是下一个返回当前Seq+1,是因为在快速重传机制中,接收方只返回对最后一个按序接收的数据的ACK。当接收方发现有数据丢失时,会重复发送对丢失数据前一个按序接收的数据的ACK,以触发发送方进行快速重传。因此,每次返回的ACK是重复的,以便发送方能够快速识别出数据丢失并进行重传。

因此,在快速重传的工作方式中,当收到三个相同的ACK报文时,发送端会在定时器过期之前重传丢失的报文段。虽然快速重传机制解决了超时时间的问题,但它仍然面临着另一个问题,即在重传时是重传之前的一个报文还是重传所有的报文。

举个例子,对于上述情况,是重传Seq2呢?还是重传Seq2、Seq3、Seq4、Seq5呢?发送端并不清楚这连续的三个ACK2是由哪个传回的。

根据TCP的不同实现,以上两种情况都有可能发生。这就是一把双刃剑。为了解决不知道重传哪些TCP报文的问题,SACK方法应运而生。

SACK 方法

还有一种实现重传机制的方式叫做选择性确认(Selective Acknowledgment,SACK)。SACK需要在TCP头部的"选项"字段中添加一个SACK选项,通过该选项发送缓存地图给发送方,从而让发送方知道哪些数据已经收到,哪些数据还未收到。有了这些信息,发送方就可以只重传丢失的数据。

如下图所示,当发送方收到三次相同的确认报文时,就会触发快速重传机制。通过SACK信息,发送方发现只有200~299这一段数据丢失,因此在进行重传时,只选择重复发送这个TCP段。

image

请记住,SACK记录的始终是当前接收到的数据包的序列号,不像ACK必须按顺序进行。乱序接收也是可以的。此外,还需要注意ACK和SACK这两个值的大小关系。在SACK机制中,ACK的值永远小于SACK的值。

要支持SACK,必须双方都要支持。在Linux系统下,可以通过设置net.ipv4.tcp_sack参数来开启该功能(从Linux 2.4版本开始,默认就是开启的)。

Duplicate SACK

看起来SACK已经很完美了,没有什么需要解决的了。但是你可以想象一下这种网络情况:发送方的数据实际上已经全部到达接收方,但是接收方却没有发送任何ACK应答数据包给发送方。这会导致发送方超时重传,首先触发的是序列号较小的数据包。接收方接收到了重复的数据包并返回给发送方,但是SACK的值小于ACK的值,这与SACK机制不同。你可以看到,D-SACK机制主要使用SACK来告知发送方哪些数据包已被重复接收,而不是像SACK机制一样重发实际上缺少的数据包。

如下图所示:
image

  • 接收方发送给发送方的两个ACK确认应答都丢失了,所以发送方超时后重传了第一个数据包(3000~3499)。
  • 接收方发现数据是重复收到的,于是回复了一个SACK=3000-3500,告诉发送方3000-3500的数据已经被接收了。因为ACK已经到了4000,意味着4000之前的所有数据都已收到,所以这个SACK代表着D-SACK。
  • 这样发送方就知道数据没有丢失,是接收方的ACK确认报文丢失了。此时,发送方就不会再重发剩下的数据包,从而减少了多余的网络传输。

第二种情况:网络延时

image

  • 在发送方发送的数据包(1000-1499)经历了网络延迟,导致发送方未收到Ack 1500的确认报文。
  • 随后,接收方收到了延迟的数据包(1000-1499)并触发了快速重传机制,随后接收方发送了三个相同的ACK确认报文。
  • 由于ACK已经到达3000,接收方在回复中包含了SACK=1000~1500,表示接收方收到了重复的数据包,所以这个 SACK 是 D-SACK,表示收到了重复的包。
  • 这样发送方就明白,快速重传机制被触发的原因不是因为发送出去的数据包丢失,也不是因为回复的ACK丢失,而是由于网络延迟的存在。

可以看出,D-SACK(Duplicate Selective Acknowledgment)具有以下几个优点:

  1. 它可以提供给发送方有关丢包原因的信息,发送方可以知道是发送的数据包丢失了还是接收方的ACK包丢失了。
  2. 它可以帮助发送方判断是否由于网络延迟而导致数据包丢失。
  3. 它可以帮助发送方判断是否网络中的数据包被复制了。

在Linux系统中,可以通过设置net.ipv4.tcp_dsack参数来启用或禁用D-SACK功能(在Linux 2.4版本之后,默认为启用状态)。

总结

重传机制是为了解决网络不可靠性而存在的一种方法。TCP通过序列号与确认应答来实现可靠传输,但由于网络的问题,确认应答可能会丢失或延迟到达。为了解决这个问题,TCP引入了重传机制,包括超时重传、快速重传、SACK和D-SACK。

超时重传是最常见的重传机制,当发送端发送数据包后,等待一定时间内未收到确认应答时,会重新发送数据包。快速重传是基于数据的驱动重传,当发送端连续收到三个重复的确认应答时,会立即重传丢失的数据包。SACK允许接收端在确认应答中指定已收到的数据包,发送端可以根据这些信息有选择地进行重传。D-SACK则是在SACK的基础上,告知发送端哪些数据包是重复接收的。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6天前
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限。它通过设置一系列规则,控制谁可以访问特定资源、在什么条件下访问以及可以执行哪些操作。ACL 可以应用于路由器、防火墙等设备,分为标准、扩展、基于时间和基于用户等多种类型,广泛用于企业网络和互联网中,以增强安全性和精细管理。
36 7
|
1月前
|
监控 安全 网络安全
云计算与网络安全:保护数据的关键策略
【9月更文挑战第34天】在数字化时代,云计算已成为企业和个人存储、处理数据的优选方式。然而,随着云服务的普及,网络安全问题也日益凸显。本文将探讨云计算环境中的网络安全挑战,并提供一系列策略来加强信息安全。从基础的数据加密到复杂的访问控制机制,我们将一探究竟如何在享受云服务便利的同时,确保数据的安全性和隐私性不被侵犯。
65 10
|
2月前
|
存储 安全 网络安全
云计算与网络安全:守护数据,构筑未来
在当今的信息化时代,云计算已成为推动技术革新的重要力量。然而,随之而来的网络安全问题也日益凸显。本文从云服务、网络安全和信息安全等技术领域展开,探讨了云计算在为生活带来便捷的同时,如何通过技术创新和策略实施来确保网络环境的安全性和数据的保密性。
|
6天前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
32 3
|
16天前
|
存储 安全 网络安全
云计算与网络安全:保护数据的新策略
【10月更文挑战第28天】随着云计算的广泛应用,网络安全问题日益突出。本文将深入探讨云计算环境下的网络安全挑战,并提出有效的安全策略和措施。我们将分析云服务中的安全风险,探讨如何通过技术和管理措施来提升信息安全水平,包括加密技术、访问控制、安全审计等。此外,文章还将分享一些实用的代码示例,帮助读者更好地理解和应用这些安全策略。
|
17天前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
1月前
|
网络协议 Java 应用服务中间件
深入浅出Tomcat网络通信的高并发处理机制
【10月更文挑战第3天】本文详细解析了Tomcat在处理高并发网络请求时的机制,重点关注了其三种不同的IO模型:NioEndPoint、Nio2EndPoint 和 AprEndPoint。NioEndPoint 采用多路复用模型,通过 Acceptor 接收连接、Poller 监听事件及 Executor 处理请求;Nio2EndPoint 则使用 AIO 异步模型,通过回调函数处理连接和数据就绪事件;AprEndPoint 通过 JNI 调用本地库实现高性能,但已在 Tomcat 10 中弃用
深入浅出Tomcat网络通信的高并发处理机制
|
21天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:从漏洞到加密,保护数据的关键步骤
【10月更文挑战第24天】在数字化时代,网络安全和信息安全是维护个人隐私和企业资产的前线防线。本文将探讨网络安全中的常见漏洞、加密技术的重要性以及如何通过提高安全意识来防范潜在的网络威胁。我们将深入理解网络安全的基本概念,学习如何识别和应对安全威胁,并掌握保护信息不被非法访问的策略。无论你是IT专业人士还是日常互联网用户,这篇文章都将为你提供宝贵的知识和技能,帮助你在网络世界中更安全地航行。
|
24天前
|
存储 安全 网络安全
云计算与网络安全:如何保护您的数据
【10月更文挑战第21天】在这篇文章中,我们将探讨云计算和网络安全的关系。随着云计算的普及,网络安全问题日益突出。我们将介绍云服务的基本概念,以及如何通过网络安全措施来保护您的数据。最后,我们将提供一些代码示例,帮助您更好地理解这些概念。
|
1月前
|
SQL 安全 测试技术
网络安全与信息安全:保护数据的艺术
【9月更文挑战第36天】在数字化时代,网络安全和信息安全已成为维护个人隐私和企业资产的基石。本文深入探讨了网络安全漏洞、加密技术以及安全意识的重要性,旨在为读者提供一份知识宝典,帮助他们在网络世界中航行而不触礁。我们将从网络安全的基本概念出发,逐步深入到复杂的加密算法,最后强调培养安全意识的必要性。无论你是IT专业人士还是日常互联网用户,这篇文章都将为你打开一扇了解和实践网络安全的大门。
41 2