TCP 的可靠传输

news2024/11/14 14:52:12

目录

  • 可靠传输有啥用
  • 确认应答
  • 超时重传
  • 总结

可靠传输有啥用

我们知道相比于 UDP, TCP 的传输是可靠的, 啥意思呢?
就是 UDP 发送的数据, 它自己不知道发送的数据对方是否接收到.
而 TCP 发送的数据, 它知道对方是否接收到, 也就是说对方会给个应答.

假设一个场景 :
甲要付款给乙, 甲的账户上明明扣了款, 但是乙却迟迟没收到, 那甲还要付款吗? 甲的账户里已经扣了钱, 再付款就是冤大头了.
TCP 存在的初心就是为了保障数据传输的可靠性, 让这种情况不再发生.

那 TCP 具体是如何实现可靠传输的呢?

有两点 :

  1. 确认应答
  2. 超时重传

确认应答

确认应答是实现可靠性的最核心机制.
我们可以观察TCP报文结构 :
在这里插入图片描述
其实 TCP 针对将要发送的数据都进行一个字节一个字节的编号, 即为序列号.
对于发送方来说, 确认序号无意义, 只有在ack中也就是应答报文中才有意义.
在这里插入图片描述
为了更好理解, 就将数据传输简化如下 :
在这里插入图片描述
确认序号是取发送过来的所有数据的最后一个字节的下一个字节的序号.

确认序号 1001 的含义 :

  1. < 1001 的数据我已经收到了.
  2. 接下来向发送方索要从 1001 开始的数据.

接收方可以通过 ack 的确认序号, 来告诉发送方哪些数据已经收到了.

在数据传输的过程中, 也可能出现 “先来后到” 的情况.
比如 : 客户端连续发了两条数据, 服务端先接收到数据2, 再接收到数据1, 显然这两个数据顺序反了, 如果就这样不管的话显然会出事的.

TCP 其实还有个整队的能力, TCP 会有个接收缓冲区 (一块内核中的内存空间), 每个 socket 都有一份自己的缓冲区.
TCP 将接收到的数据存储在缓冲区, 这样就可以利用序号来对数据进行整队了. (这也是 TCP 序号的一个重要用途).
这样就保证了应用程序读数据时, 读到的一定是有序的数据了.(和发送的顺序一样)

注意
应用程序读取完数据后, 缓冲区的数据就删除了.

超时重传

在数据传输过程中, 并不是一帆风顺的, 可能还会出现丢包情况.
丢包是网络上非常典型的情况.

为什么会丢包呢?
其实数据传输过程并不是简单的两个节点互动, 而是途中会经历很多节点, 就像我们看地图找目标点一样, 到达目标点可能需要经过多个十字路口.
在这里插入图片描述
中间任何一个节点出了问题, 都可能会出现丢包情况.

这中间的每个设备, 都在承担很多的转发任务.
每个设备的转发能力都是有上限的.
当某一时刻, 某个设备的流量达到了峰值, 就可能会出现丢包情况.

如果包丢了, 接收方就收不到了, 也就不会返回 ack, 发送方也就拿不到应答报文, 等待一段时间后, 如果还是没有收到应答报文, 发送方就知道刚才的数据包丢包了, 就会再发一遍.

丢包是个概率事件, 如果发生了丢包, 一般重传还是可以传过去的.

发送方对于丢包的判定 : 一定时间内没有收到 ack.

其实丢包也分为两种情况的 :

  1. 数据直接丢失, 接收方没收到, 自然不会发送 ack.
  2. 接收方收到数据, 但是返回的 ack 丢了.

发送方是区分不了这两种情况的, 只能都重传了.

其实这两种情况 TCP 都考虑到了, 它会在缓冲区中, 根据数据序号来进行去重, 保证应用程序读取到的数据只有一份.

那它如何应对多个包丢失呢?

还是超时重传, 只是每丢包一次, 超时等待时间都变长 (降低重传的频率), 因为 TCP 认为这种情况是网络出现严重故障, 就干脆摆烂了, 节省资源.
如果连续多次重传都没有得到 ack, 此时 TCP 就会重置连接 (也就是重连), 如果重置连接失败, TCP 就会关闭连接, 放弃网络通信.

总结

TCP 可靠传输的基石 :

  1. 一切顺利, 以确认应答保证可靠性.
  2. 出现丢包, 使用超时重传作为补充.

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

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

相关文章

全网最详细,Jmeter性能测试-性能基础详解,接口关联与编写Java脚本(三)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 接口关联 接口关联…

Vector - CAPL - CAN x 总线信息获取(续1)

继续.... 目录 OverLoadFrameCount -- 过载帧数量 代码示例 OverLoadFrameRate -- 过载帧速率 代码示例 StandardFrameCount -- 标准帧数量 代码示例 StandardFrameRate -- 标准帧速率 代码示例 StandardRemoteFrameCount -- 标准远程帧数量 代码示例 StandardRemote…

Java注解编译期处理AbstractProcessor详解

文章目录概述注解处理器注解处理流程AbstractProcessorgetSupportedOptions()getSupportedAnnotationTypesgetSupportedSourceVersioninit初始化process 处理方法如何注册注解处理器如何调试编译期代码Maven相关配置(指定生效的Processor)注意事项自定义注解处理器范例范例一&a…

多线程小知识

多线程 多线程环境使用哈希表HashMapHashtableConcurrentHashMap 死锁死锁是什么两者之间的死锁多人之间的死锁 死锁产生的四个必要条件:互斥使用不可抢占请求和保持循环等待 不同的锁ReentrantLockSynchronized和ReentrantLock之间的区别:具体选择Synchronized加锁工作过程偏向…

using namespace std 是什么意思——C++命名空间

目录 namespace命名空间局部域和全局域namespace展开命名空间指定命名空间 命名空间的嵌套不同文件中的同名命名空间 using namespace std 是什么意思 我们先看一段C代码&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 0;int main() {printf(&quo…

6.2 统计量与抽样分布

学习目标&#xff1a; 我的理解: 统计量是从一个样本中计算得到的数值&#xff0c;用于描述样本的某种特征或性质。统计量可以用来推断总体的特征或性质&#xff0c;因为样本是总体的一部分。 通常&#xff0c;统计量是通过对样本中的数据进行计算得到的&#xff0c;例如平均…

3年轻人20万开店日营业额79.2元,年轻人开店还能赚到钱吗?

最近&#xff0c;河南郑州的蔡先生和2个朋友合伙开一家汉堡店&#xff0c;生意很惨淡&#xff0c;日营业额79.2元。 蔡先生表示&#xff0c;他们开店失败的最大原因就是没有做好前期准备工作&#xff0c;产品没有吸引人的特色&#xff0c;导致正式营业后吸引不到客户。 蔡先生用…

Python 实现海康机器人工业相机 MV-CU060-10GM 的实时显示视频流及拍照功能

一、背景介绍 1、最近项目中需要给客户对接海康机器人工业相机 MV-CU060-10GM&#xff1b; 2、客户要求通过部署的管理平台&#xff0c;可以在页面上实现如下功能&#xff1a; 1&#xff09;相机视频流开始预览&#xff1b; 2&#xff09;相机视频流停止预览&#xff1b; 3&am…

三月份跳槽了,历经阿里测开岗4轮面试,不出意外,被刷了...

大多数情况下&#xff0c;测试员的个人技能成长速度&#xff0c;远远大于公司规模或业务的成长速度。所以&#xff0c;跳槽成为了这个行业里最常见的一个词汇。 前几天&#xff0c;我看到有朋友留言说&#xff0c;他在面试阿里的测试开发工程师的时候&#xff0c;灵魂拷问三小…

NIO非阻塞式网络通信实例

一、概述 1、NIO有三大核心部分&#xff1a;Channel(通道)&#xff0c;Buufer(缓存区)&#xff0c;Selector(选择器) Buffer缓存区 缓冲区本质上是一块可以写入数据&#xff0c;然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象&#xff0c;并提供了 一组方法&am…

❤Linux文件、目录与磁盘格式总结❤

文章目录 Linux文件、目录与磁盘格式总结Linux文件权限chgrpchmodchown文件种类Linux文件扩展名 Linux文件与目录管理常用的目录解释目录树绝对路径与相对路径cd(切换目录)pwd(显示当前目录)mkdir(建立一个新目录)rmdir(删除空目录)执行文件路径变量$PATHls(文件与目录的查看)c…

青藤首提“业安融合”理念,正式发布先进云安全方案CNAPP

4月18日&#xff0c;以“云时代&#xff0c;安全变了”为主题的2023年云安全高峰论坛在北京举行。会上&#xff0c;青藤首次提出“业安融合”理念&#xff0c;正式发布先进云安全方案CNAPP。 中国全面进入云和数字化时代 当前&#xff0c;全球已进入数字经济时代&#xff0c;…

物联感知产品如何助力企业实现智能化转型?

如果您的企业想要实现设备全生命周期管理、设备信息管理、设备监控和数据处理等功能&#xff0c;想要进行智能化数字转型&#xff0c;不妨了解一下物联感知。 物联感知产品是利用物联网技术&#xff0c;实现对物理世界的感知、联接和智能化。物联感知产品一般由四个部分组成&a…

python中的pyc文件了解一下?

基本说明 pyc 文件是 Python 编译过的字节码文件。当你运行一个 Python 程序时&#xff0c;Python 解释器首先将源代码&#xff08;通常是 .py 文件&#xff09;编译成字节码。这个字节码是一种低级的、与平台无关的代码&#xff0c;它可以被 Python 虚拟机&#xff08;Python…

TCP的连接管理机制(三次握手与四次挥手)

目录为啥要三次握手与四次挥手三次握手syn 与 ack三次握手具体流程四次挥手注意为啥要三次握手与四次挥手 相比于UDP, TCP是有连接的, 这个连接就体现在这了. 三次握手就是TCP建立连接, 四次挥手就是TCP断开连接. 三次握手 握手是指通信双方进行网络交互. 三次握手就相当于…

记录上传文件异常 /tmp/tomcat... (No space left on device)

一&#xff0c;问题描述 用postman调用上传接口&#xff0c;基本每两次调用会有一次报错&#xff0c;如下 {"timestamp": "2023-04-11T03:00:15.4690000","status": 500,"error": "Internal Server Error","exceptio…

【活动】想对大学的自己说……

写在前面&#xff1a; 时间过得真的很快&#xff0c;眨眼间我们已经走过了这么多年的大学时光。回想起来&#xff0c;我们曾经有过无数的欢笑和泪水&#xff0c;有过无数的成功和挫败&#xff0c;但是这些经历都让我们变得更加坚强和成熟。如果现在有机会回到大学时光&#xff…

【LInux】进程间通信 -- 匿名管道

前言 我们在学习进程管理&#xff0c;进程替换时&#xff0c;都强调了进程的独立性&#xff0c;那进程间通信是什么&#xff1f;这好像和进程的独立性相矛盾吧&#xff1f; 那么今天&#xff0c;我们就来学习进程间通信&#xff0c;和第一种通信方式 – 管道 文章目录 前言一. …

高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务

目录 前言一、nohup命令详解1-1、nohup命令介绍1-2、语法格式1-2-1、基础语法介绍1-2-2、执行脚本文件1-2-3、执行python文件1-2-4、拓展延申&#xff1a;在服务器上运行后台进程1-2-5、nohup和&的区别 二、进程查看2-1、jobs命令&#xff08;基本不用&#xff09;2-2、ps命…

Android进阶宝典—在Compose中跳转Fragment

使用场景 我们原有的项目中基本采用的是单Activity架构&#xff0c;页面之间的跳转都是通过Navigation进行的&#xff0c;举个简单的例子。 在这种单Activity架构模式下&#xff0c;有一天我们想把MainActivity或者BFragment使用Compose重构&#xff0c;这个时候我们就需要去…