java网络原理(二)------TCP确认应答和超时重传
一Tcp协议
TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。
二.TCP协议段格式


知道了端口号才能进一步确认这个数据报交给了哪一个程序。16为端口号是2字节,范围是0到65535.如果端口号超过了65535那么这个端口号是不合法的。

tcp的报头是变长的,Tcp报头的最大长度是60字节,前20个字节是固定的,报头最短长度是20字节。选项部分可以有 ,也可以没有,可以是一个,也可以是多个。

当tcp的空间不够用了,可以升级拓展空间。
确认应答
tcp的特点是:有连接,全双工,可靠,面向字节流。那么可靠的传输机制是什么样的呢?确认应答是保证tcp可靠性的重要条件。
比如我给女生发信息,第一条信息是我们一起去吃麻辣烫,第二条是做我女朋友。

正常情况是女生同意和我一起吃麻辣烫但是不做我女朋友,有没有可能是第二条回应先过来,第一条回应后过来

后发先至导致意思全变了,女生拒绝了吃麻辣烫但是答应做我女朋友,那么对我来说更加开心。那么这种后发先至的情况有没有可能存在?一定是存在的,网络从a->b中间的路径很多,每个节点的路由器繁忙程度也不一样,此时就会有后发先至的可能性。解决这个问题针对数据进行编号。

当客户端发送数据时,会把数据转换为一个一个字节,然后对每个字节进行编号,假设第一次发送编号1到1000的,第二次发送1001-2000,第三次2001-3000.

第一次主机A发送编号1-1000的数据,主机B收到后会给A返回一个编号1001的数据(不一定发送的是1到1000的数据,可能编号是1到500,1到600都有可能,但主机B返回的一定是A发送编号的最后一位加1),主机A收到后说明1到1000的数据已经成功发送,下一次发送的数据应该从1001开始。


32位序号是每次发送的第一个字节编号,32为确认序号是最后一个字节编号加1。
搞清楚当前是普通报文和应答报文是很有必要的。

当ack为0时是一个普通报文,此时只有32为序号是有效的。
当ack时1时表示是一个应答报文,这个报文的32为序号和32位确认序号都是有效的。
主机A发送1000到2000的数据时,主机B收到后同样会发送一个TCP数据报,32位确认序号是1001,主机A收到反馈后会把32为确认序号+1和发过来的32为序号进行对比,如果相等说明数据发送成功,如果不相等说明发送失败。保证了数据传输的可靠性。
超时重传
丢包,在网络上很可能出现发一个数据,然后丢了。路由器和交换机就是交通枢纽,数据传输的时要经过很多路由器和交换机,传输的线路结构复杂,传输的数据量也不确定,如果设备太繁忙,后面的数据等待太久就会出现丢包的可能。
超时重传是主机A给主机B发信息,如果主机A收不到确认应答既发送失败,主机A等待一定的时间后会重新给A发送一次。超时重传相等于确认应答进行的重要补充。

不管是应答报文丢失还是数据本身丢失都会重新发送。如果是应答报文丢失,那么同一条信息B收到了2次,本身是有问题的。
接收方收到数据后,需要对数据进行去重,把重复的数据丢失掉。
tcp会在内核中给每个socket对象安排一个内存空间,相当于一个队列,也称为接收缓存区,收到的数据都会被放在内存缓存区中,并且按照序号进行排序,当B主机读数据的时候,会把数据从队列中读走并删除,如果有重复的,下一次主机A发过来的数据编号一定大于队列队首元素的编号,这时候说明上次主机B发给主机A的数据重复发送过去了,把重复的数据删除即可。
为啥重传的时候能传过去?
丢包本来就是一个概率性的问题,假设丢包的概率是10%,那么连续传2次丢包的概率是10%*10%=1%,那么随着重传的次数增多丢包的概率会越来越小,如果重传了很多次都没收到,那么说明是重大网络事故。每次未收到数据都需要等待一定的时间,如果超过等待时间还没有收到,那么就要重传。超时重传不是一个固定的值,会随着时间的轮次增加,而进一步增加。
如果重传到一定的程度会自动放弃。次数就会重置tcp的连接。

rst为1为一个复位报文,如果网络出现严重的故障,复位操作就无法完成,最终放弃连接。
超时重传和确认应答是保证tcp可靠性的关键。
相关文章:
java网络原理(二)------TCP确认应答和超时重传
一Tcp协议 TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。 二.TCP协议段格式 知道了端口号才能进一步确认这个数据报交给了哪一个程序。16为端口号是2字节,范围是0到65535.如…...
机器学习:智能时代的核心引擎
目录 一、什么是机器学习 二、监督学习 三、无监督学习 四、半监督学习 五、强化学习 一、什么是机器学习 机器学习是人工智能的一个分支,它主要基于计算机科学,旨在使计算机系统能够自动地从经验和数据中进行学习并改进,而无需进行明确…...
Docker-Image
Docker Docker 镜像是什么为什么需要镜像镜像命令总览docker imagesdocker tagdocker pulldocker pushdocker rmidocker savedocker loaddocker image inspectdocker historydocker importdocker image prunedocker build Docker 镜像是什么 Docker image 本质上是一个 read-on…...
YOLOv8 如何实现多主干特征融合方式 | GhostNet+ShuffleNet / SwinTransformer+ShuffleNet
文章目录 前言模块添加方法双特征提取例子`GhostNet+ShuffleNet` 双主干结构图代码`Swin+ShuffleNet` 双主干结构图代码参数量与计算量1. 什么是YOLO-Magic框架?2. 如何加入这个框架?3. 加入后如何使用框架?4. GitHub组织是什么?...
工作需求ElementUi组件的使用
加油,新时代打工人! 组件源码 <template><div mouseenter"mousein true" mouseleave"mousein false"><el-input type"text" clearable autocomplete"off" v-model"searchDoc.originName…...
自动驾驶轨迹规划之时空语义走廊(一)
欢迎大家关注我的B站: 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 目录 1.摘要 2.系统架构 3.MPDM 4.时空语义走廊...
[环境配置].ssh文件夹权限修改方法
问题描述: 通过VSCode中的Remote Explorer或者通过CMD等命令行窗口连接远程机器时,会因为提示 "Bad owner or permissions on C:\\Users\\xxx/.ssh/config"而导致失败,最终呈现在VSCode中的效果是,弹窗提示"Could…...
LeetCode刷题【树状数组、并查集、二叉树】
目录 树状数组307. 区域和检索 - 数组可修改406. 根据身高重建队列673. 最长递增子序列的个数1409. 查询带键的排列 并查集128. 最长连续序列130. 被围绕的区域 二叉树94. 二叉树的中序遍历104. 二叉树的最大深度101. 对称二叉树543. 二叉树的直径108. 将有序数组转换为二叉搜索…...
使用POI以OLE对象的形式向excel中插入附件(pdf为例)
前言: 最近在使用easyExcel操作excel文件时,一直想找到一个方法可以往excel中填充附件,但是目前只发现POI可以插入附件,于是将方法记录如下: 实现: 这个方法主要是使用 Apache POI 的 HSSFWorkbook 类来…...
Unity构建详解(2)——SBP的初始设置和脚本编译
【SwitchToBuildPlatform】 核心逻辑如下 EditorUserBuildSettings.SwitchActiveBuildTarget(m_Parameters.Group, m_Parameters.Target); 直接调用切换平台的接口,一般来说,这个步骤不会执行,我们打包时肯定会事先将平台切换好的 【Rebu…...
Matlab使用教程(持续更新)
1. Matlab Matlab被广泛的应用在数据分析,汽车仿真,机器人以及医学研究等众多方面。 它可以帮助我们理解研究复杂的系统。 在60年代和70年代,计算机使得科学家和工程师完成了以前不可能进行的计算;但是需要懂得计算机编程。 C…...
管理能力学习笔记一:角色转身
管理能力学习是为了解决角色转身后面临的更多更复杂的的问题。初晋管理层,需要转变工作习惯,学会分配时间。 角色转身 建立“授权”意识 通过匹配工作内容与下属员工能力,分配工作,避免陷入下属能力不足 -> 不愿授权 -> 下…...
Redis面试题 概要
文章目录 Redis面试题 概要缓存穿透布隆过滤器缓存击穿缓存雪崩数据同步数据持久化数据过期策略Redis的数据淘汰策略Redis + Lau 限流Redis面试题 概要 Redis是一个基于 C 语言开发的开源 NoSQL 数据库,Redis 的数据是保存在内存中的(内存数据库,支持持久化),因此读写速度…...
原型,模板,策略,适配器模式
原型模式 原型模式(创建型模式),核心思想就是:基于一个已有的对象复制一个对象出来,通过复制来减少对象的直接创建的成本。 总结一下,原型模式的两种方法,浅拷贝只会复制对象里面的基本数据类型…...
Ollama 在本地快速启动并执行LLM【大语言模型】
文章目录 1. 什么是Ollama?1.1. SDK库1.2. 提供的api服务1.3. [支持的LLM](https://ollama.com/library)2. 如何安装2.1.下载docker镜像2.2. 启动docker容器3. 如何使用?3.1. 如何加载模型3.2. 使用 Ollama CLI 进行推理3.3. 使用 Ollama API 进行推理参考1. 什么是Ollama?...
ubuntu : 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
往后看,90%能解决你的问题 原文链接:学一下 (suxueit.com) 我相信很多人刚使用ubuntu都遇到过这个问题,如果没有遇到,可能是你运气好使用了正确的软件源 libprotobuf-dev : 依赖: zlib1g-dev 但是它将不会被安装 zlib1g-dev : 依…...
瑞芯微RK3576|触觉智能:开启科技新篇章
更多产品详情可关注深圳触觉智能官网! “瑞芯微,创新不止步!”——全新芯片RK3576即将震撼登场。指引科技风潮,创造未来无限可能!这款芯片在瑞芯微不断创新和突破的道路上,不仅是对过往成就的完美延续&…...
Visual Studio 2013 - 清理
Visual Studio 2013 - 清理 1. 清理1.1. 工程清理1.2. 解决方案清理 References 1. 清理 Debug Release 1.1. 工程清理 (right mouse click on the project) -> 清理 1.2. 解决方案清理 (right mouse click on the solution) -> 清理解决方案 References [1] Yongq…...
1、初识JVM
一、JVM是什么? JVM的英文全称是 Java Virtual Machine,其中文译名为Java虚拟机。它在本质上就是是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 JVM执行流程如下 二、JVM有哪些功能? 2.1 解释和运行 对字节码文…...
JavaScript 权威指南第七版(GPT 重译)(七)
第十六章:用 Node 进行服务器端 JavaScript Node 是 JavaScript 与底层操作系统的绑定,使得编写 JavaScript 程序读写文件、执行子进程和在网络上通信成为可能。这使得 Node 作为以下用途变得有用: 现代替代 shell 脚本的方式,不…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
