TCP的重传机制

TCP 是一个可靠的传输协议,解决了IP层的丢包、乱序、重复等问题。这其中,TCP的重传机制起到重要的作用。

序列号和确认号

之前我们在讲解TCP三次握手时,提到过TCP包头结构,其中有序列号确认号
而TCP 实现可靠传输的方式之一,就是是通过序列号和确认应答。

  1. 序列号(Sequence Number):

    • TCP是基于数据流的,序列号用于标识数据流中的字节位置,它表示数据包中的第一个字节在整个数据流中的位置。
    • 接收方在接收到数据包后,会根据序列号对数据包进行排序和重组,确保数据的顺序正确
  2. 确认号(Acknowledgement Number):

    • 确认号用于确认接收方已经成功接收了数据,并且期望下一个接收到的数据包的序列号是多少。

    • 在TCP通信中,接收方会向发送方发送一个确认数据包,其中包含了确认号,表示接收到的数据包中的最后一个字节的下一个字节的序列号。

      在这里插入图片描述

我们可以用wireshark抓包来看一下TCP的序列号和确认号:
在这里插入图片描述

通过上图我们可以看到:

  1. 进行三次握手时,客户端的初始序列号是2924706275,服务端的初始序列号是1859008164。
  2. 发送第一个包时,序列号是2924706276,是初始序列号+1,表示当前数据是第一个字节,数据长度8字节。
  3. 服务端回复ACK时,确认号是2924706284,是客户端的初始序列号+9,表示已经接收到前8个字节,现在期待第9个字节。
  4. 客户端继续发第二个包,序列号2924706284,表示当前数据是第9个字节。
  5. 服务端回复ACK时,确认号是2924706292,是客户端的初始序列号+17,表示已经接收到前16个字节,现在期待第17个字节。

在wireshark中,可以显示相对的序列号,可以更直观地看到序列号的变化:
在这里插入图片描述

这里我们可以看到,服务端发的包,序列号一直是1,因为当前服务端只是接收数据,并没有发送数据,所以服务端的序列号一直是1,而客户端的确认号也一直是1,表示期待服务端发送第一个字节过来。

重传机制

正常情况下,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息。
但在复杂的网络下,并不一定能顺利的进行数据传输,万一数据在传输过程中丢失了呢?针对数据包丢失的情况,TCP会用重传机制解决。

超时重传

重传机制的其中一个方式,就是在发送数据时,设定一个定时器,当超过指定的时间后,如果还没有收到对方的ACK确认应答报文,就会重发该数据,也就是我们常说的超时重传。
在这里插入图片描述

那么这个指定的时间,应该是多久比较合适呢?
这里先介绍两个概念:RTTRTO

  • RTT(Round-Trip Time) 往返时延,指的是数据发送时刻到接收到确认的时刻的差值,也就是包的往返时间
  • RTO(Retransmission Timeout),就是超时重传时间。

通常RTO应该略大于RTT

  • 如果RTO太短,有可能数据没有丢失就重发,增加网络拥塞。
  • 如果RTO太长,重发就慢,性能差。

由于网络的不稳定,RTT是经常变化的,导致RTO也会是一个动态变化的值。

如果超时重发的数据,再次超时的话,下一次重传的时间间隔则会加倍。
超时重传存在的问题是,超时周期可能相对较长。那是不是可以有更快的方式呢?

TCP用快速重传机制来解决超时重发的时间等待。

快速重传

发送方发包的时候,并不总是等待ACK的响应再发送下一个包,而是会在窗口大小内,连续发多个包:
在这里插入图片描述

如果其中一个包丢失了,而后续的包到达时,接收方会发丢失的包的ACK给发送方。当发送方连接收到三个相同的ACK时,就知道这个包丢失了,于是不用等重传定时,直接就可以重新发送了:
在这里插入图片描述

通过wireshark抓包,在过滤器中输入tcp.analysis.fast_retransmission,我们可以观察到快速重传的现象:

在这里插入图片描述
在这里插入图片描述

SACK

快速重传机制解决了超时时间的问题,但是它面临着另外一个问题:那就是重传的时候,是重传一个包,还是重传所有的包?像上面的例子,客户端发出19个包,当触发快速重传的时候,客户端只知道第2个包丢失了,那其他包是否丢失,客户端并不清楚,这时候有两种选择:

  • 重发2~19所有的包,显然会造成数据的浪费,因为后面17个包都是已经收到的。
  • 只重发第2个包。但如果第3个包也丢失的话,那么又得等到三次ACK才能重发第3个包,效率较低。

这时候,SACK(Selective Acknowledgment),选择性确认,就可以起作用了。
这种方式需要在TCP头部选项字段里加一个SACK的选项,它可以将已收到的数据的信息发送给发送方 ,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据了 。
在这里插入图片描述

在这个例子中,SACK表示15870601~15873581之间的数据是已经收到的,所以客户端只需要重发15869201~15870600之间的数据就行了。

由于TCP头部大小的限制,在选项中最多能支持四组SACK的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分析案例一使用Python进行红酒与白酒数据数据分析

源码和数据集链接 以红葡萄酒为例 有两个样本: winequality-red.csv:红葡萄酒样本 winequality-white.csv:白葡萄酒样本 每个样本都有得分从1到10的质量评分,以及若干理化检验的结果 #理化性质字段名称1固定酸度fixed acidity2挥发性酸度volatile acidity3柠檬酸…

Lesson6--排序(初级数据结构完结篇)

【本节目标】 1. 排序的概念及其运用 2. 常见排序算法的实现 3. 排序算法复杂度及稳定性分析 1.排序的概念及其运用 1.1排序的概念 排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来…

Thread的stop和interrupt的区别

Thread.stop Thread.stop()方法已被废弃。 因为本质上它是不安全的,使用该方法可能会导致数据、资源不一致的问题, public class ThreadDemo {static class MyThread extends Thread {Overridepublic void run() {while (true) {try {Thread.sleep(10…

解决Windows 10通过SSH连接Ubuntu 20.04时的“Permission Denied”错误

在使用SSH连接远程服务器时,我们经常可能遇到各种连接错误,其中“Permission denied, please try again”是较为常见的一种。本文将分享一次实际案例的解决过程,帮助你理解如何排查并解决这类问题。 问题描述 在尝试从Windows 10系统通过SS…

面试题 17.05. 字母与数字(前缀和)

给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。 返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。 示例 1: 输入: ["…

openssl 常用命令demo

RSA Private Key的结构(ASN.1) RSAPrivateKey :: SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- …

嵌入式人工智能开发:基于TensorFlow Lite和OpenCV的实时姿态估计算法实现

文章目录 引言环境准备人工智能在嵌入式系统中的应用场景代码示例常见问题及解决方案结论 1. 引言 在嵌入式系统中集成人工智能(AI)技术已经成为一种重要的发展方向。实时姿态估计是AI在嵌入式领域的一个高级应用,能够在资源受限的环境中实…

海外动态IP代理可以用来批量注册邮箱吗?

无论是个人还是企业,都需要使用邮箱进行沟通、注册账号、接收通知等多种用途。然而,由于互联网服务商为了防止滥用和垃圾邮件的传播,通常对注册邮箱设置了一定的限制,如IP限制、验证码验证等。为了解决这些问题,海外动…

GPT LoRA 大模型微调,生成猫耳娘

往期热门专栏回顾 专栏描述Java项目实战介绍Java组件安装、使用;手写框架等Aws服务器实战Aws Linux服务器上操作nginx、git、JDK、VueJava微服务实战Java 微服务实战,Spring Cloud Netflix套件、Spring Cloud Alibaba套件、Seata、gateway、shadingjdbc…

关于ida如何进行远程linux调试(详解)

首先我们需要安装工具软件VMware虚拟机和finalshell,并在虚拟机中安装centos 7系统,还要将finalshell连接到该系统中,具体操作可以去b站搜黑马Linux学习,学完该课程的p5,p6,p8即可,我接下来讲的…

[Linux]vsftp配置大全---超完整版

[Linux]vsftp配置大全---超完整版 以下文章介绍Liunx 环境下vsftpd的三种实现方法 一、前言 Vsftp(Very Secure FTP)是一种在Unix/Linux中非常安全且快速稳定的FTP服务器,目前已经被许多大型站点所采用,如ftp.redhat.com,ftp.kde.org,ftp.gnome.org.等。…

js:flex弹性布局

目录 代码&#xff1a; 1、 flex-direction 2、flex-wrap 3、justify-content 4、align-items 5、align-content 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewp…

Python自然语言处理(NLP)库之NLTK使用详解

概要 自然语言处理(NLP)是人工智能和计算机科学中的一个重要领域,涉及对人类语言的计算机理解和处理。Python的自然语言工具包(NLTK,Natural Language Toolkit)是一个功能强大的NLP库,提供了丰富的工具和数据集,帮助开发者进行各种NLP任务,如分词、词性标注、命名实体…

Excel 将分组头信息填入组内明细行

Excel由多个纵向的分组表组成&#xff0c;组之间由空白行隔开&#xff0c;每组第1、2行的第2格是分组表头&#xff0c;第3行是列头&#xff0c;第1列和第6列数据是空白的&#xff1a; ABCDEF1ATLANTIC SPIRIT2Looe3VesselSpeciesSizeKgDateLocation4POLLACK22.523/04/20245POL…

华为 CANN

华为 CANN 1 介绍1.1 概述1.2 CANN 是华为昇腾计算产业的重要一环1.3 昇腾系列处理器1.4 昇腾 AI 产业1.5 从 AI 算法到产品化落地流程1.6 多样性计算架构1.7 人工智能各层级图示1.8 人工智能技术发展历史 2 CANN vs CUDA支持平台优化方向编程接口生态系统与应用性能与功能 3 C…

SwiftUI中SafeArea的管理与使用(ignoresSafeArea, safeAreaPadding, safeAreaInset)

SafeArea是指不与视图控制器提供的导航栏、选项卡栏、工具栏或其他视图重叠的内容空间。 在UIKit中&#xff0c;开发人员需要使用safeAreaInsets或safeAreaLayoutGuide来确保视图被放置在界面的可见部分。 SwiftUI彻底简化了上述过程&#xff0c;除非开发者明确要求视图突破安…

Java—— StringBuilder 和 StringBuffer

1.介绍 由于String的不可更改特性&#xff0c;为了方便字符串的修改&#xff0c;Java中又提供了StringBuilder和Stringbuffer类&#xff0c;这两个类大部分功能是相同的&#xff0c;以下为常用方法&#xff1a; public static void main(String[] args) {StringBuilder sb1 n…

百度中心之星

目录 新材料 星际航行 新材料 直接模拟&#xff1a;因为要考虑上次出现的位置&#xff0c;所以使用map映射最好&#xff0c;如果没有出现过就建立新映射&#xff0c;如果出现过但是已经反应过就跳过&#xff0c;如果出现过但是不足以反应&#xff0c;就建立新映射&#xff0c;…

react 怎样配置ant design Pro 路由?

Ant Design Pro 是基于 umi 和 dva 的框架&#xff0c;umi 已经预置了路由功能&#xff0c;只需要在 config/router.config.js 中添加路由信息即可。 例如&#xff0c;假设你需要为 HelloWorld 组件创建一个路由&#xff0c;你可以将以下代码添加到 config/router.config.js 中…

parallels版虚拟机Linux中安装parallels tools报错

按照一个博客的教程安装的可还是安装不了&#xff0c;请指点指点 1.先是输入name -a 输出&#xff1a;Linux user 6.6.9-arm64 #11 SMP Kali 6.6.9-1kali1 (2024-01-08) aarch64GNU/Linux2.按照版本号找对应的文件并下载 第一个文件&#xff1a; linux-headers-6.6.9-arm64_…