TCP(1)

传输层的两大协议是TCP 和 UDP ,他们在传输数据的时候起到了不可替代的作用。那么什么是TCP呢?

首先TCP是一个网络传输协议,这个协议保证了可靠的数据传输。TCP是面向字节流的,全双工的(也就是通信双方互相发消息)。往往应用于对实时性要求没那么高的场景,但是又要要求把数据完全传输过去(不是确保100%能传过去,传不过去就超时重传)。

Socket clientSocket = serverSocket.accept();
InputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();

相反UDP是保证的不可靠的传输,面向数据报的,但是UDP可以保证实时性,UDP说:实在不行就丢包呗,反正我把大部分数据准时传到就行。因此在我们所看的抖音直播,王者荣耀,吃鸡,这些实时性要求比较高的app中应用的主要是UDP协议,你们有没有感觉一整直播就卡了,然后那段主播说了啥咱也不知道。王者遇到过这种情况吧,走不动,走到界外去了,吃鸡的时候你还没开枪就被秒了。最直观的例子,老师上网课,上着上着发现老师没画面了。

总结来说UDP协议适用于需要快速传输实时数据的场景,它具有较低的延迟和较小的传输开销。由于UDP不提供确认和重传机制,它能够更快地传输数据,但也可能导致数据的丢失或乱序。

但是今天的主角是TCP,上面的例子就是要理解一下TCP和UDP的区别

如图所示就是TCP报文段的结构:

(1)首先就是作为传输层协议,必须知道端口号是啥。源端口和目的端口各占2B,表示发送方和接收方使用的端口号。

(2)序号:占4B TCP连接中传送的字节流中每个字节都要按照顺序编号。比如说一个报文段的序号字段值是301,而携带的数据共有100B,表明本报文段的数据的最后一个字节号是400,下一个报文段的数据序号要从401开始。有这个序号就像我们都有名字是一个道理,如果涉及到两个数据重复传输的时候,这个序号就起到了至关重要的作用。

(3)确认号,也要占4B,若确认号为N,则表示前N-1个数据都收到了。

(4)这里的数据偏移其实指的是首部长度,占4位。指的是TCP报文段的数据起始处距离TCP报文段的起始处有多远,因为有选项这个东西,因此可以说,如果选项完全没有,TCP报头长度是20个字节。4个比特位最多能表示15,而首部的长度是4个字节(一个字节表示四个比特位),因此我们得出结论,首部最大的长度是60,如果去掉20个固定的,剩下的选项部分最多占40个字节。因此首部长度是20-60个字节,

(5)保留位:占6位,保留以后使用,万一以后有一天TCP需要扩展一些新的功能,就可以使用这个保留位来表示了。

TCP的机制

(1)确认应答机制:对于TCP协议来说,要解决一个很重要的问题,那就是可靠传输,可靠传输并不能保证100%把数据发送到对方手里,但是会尽可能给发送方知道接收方是否接受到消息。下图就是一个应答机制。

 在网络通信中,会出现后发先至现象,如果不加控制,有时候会很容易误解发送方的意思。

因此就有了解决方法:

  1. 序列号与确认机制:TCP协议通过使用序列号和确认机制来确保数据的有序传输。接收方会按照序列号的顺序重新组装数据包,并发送确认消息给发送方,告知已经收到的数据包序列号,从而保证数据的有序性。

确认序号的特点:连续递增,确认序号就是应答数据的最后一个字节的序号+1

比如说接收序号是1-1000,此处应答报文的确认序号是1001.也可以理解成小于1001的数据都确认收到了。

确认位 ACK=1时,我们说确认号字段有效,当ACK=0时,确认号无效。

总结一下TCP的确认应答机制有保证TCP最核心的功能的作用,即可靠传输。而为什么TCP可靠传输也不一定能保证百分百传输到位呢?举例来说:每个交换机/路由器的转发能力存在着上限,这取决于芯片硬件设备的能力!一旦某个设备需要转发的数据量超出了自身的极限,那么多出来的部分就会被直接丢弃掉。

(2)超时重传机制:如果接收方没有收到任何数据,也一定不会给任何的应答!,此时,发送饭就可以根据是否收到了ACK来区分是否丢包。

  发送方发送出数据之后,如果正常收到ACK也一定需要一些时间的,发送方也会进行一定时间的等待,但是一旦等待时间超过了某个阈值,就可以认为是丢包了!如果说数据传输晚了,也一并视为传输失败!发现丢包就要重传!下图表示了超时重传。

如果说接收方重传的时候接收到了数据,但是丢失的数据一起传过来了,会导致重复传输,这里就会根据TCP所携带的序号来进行去重。

除此之外,有一个接收缓冲区,在这里可以针对收到的数据进行排序。也是针对后发先至进行的一个调整。因为我们希望消息还是按照顺序到达对方手里的。而超时重传也不是无限等待的,如果说,网络出现严重的故障,重传了若干次还是不成功,那么就进行重置连接,也就是RST,当RST=1时,表示TCP连接中出现了严重的差错(如主机崩溃)必须释放连接,然后重新的建立传输连接。

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

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

相关文章

shell脚本之sort,uniq,tr,cut,sphit,paste,ecal与正则表达式

sort命令 uniq命令 tr命令 cut命令 sphit命令 paste命令 ecal命令 正则表达式 sort命令 sort命令---以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序 比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序…

Redis 源码安装和入门介绍

Linux下的redis源码安装 redis介绍 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如 字符串(strings),…

Leetcode - 周赛397

目录 一,3146. 两个字符串的排列差 二,3147. 从魔法师身上吸取的最大能量 三,3148. 矩阵中的最大得分 四,3149. 找出分数最低的排列 一,3146. 两个字符串的排列差 本题就是求同一个字符在两个字符串中的下标之差的…

Nacos+GateWay 搭建微服务架构

文章目录 1.当前项目架构分析1.请求多个模块的方式1.请求renren-fast模块开发环境生产环境 2.请求sunliving-commodity模块1.使用环境变量资源路径的方式2.开发环境 dev.env.js3.生产环境 prod.env.js 3.文件上传请求 sunliving-service模块1.请求后端接口(开发环境…

基于网络爬虫技术的网络新闻分析(二)

目录 2 系统需求分析 2.1 系统需求概述 2.2 系统需求分析 2.2.1 系统功能要求 2.2.2 系统IPO图 2.2 系统非功能性需求分析 3 系统概要设计 3.1 设计约束 3.1.1 需求约束 3.1.2 设计策略 3.1.3 技术实现 3.3 模块结构 3.3.1 模块结构图 3.3.2 系统层次图 3.3.3…

低空经济:无人机竞赛详解

无人机竞赛市场近年来呈现出蓬勃发展的态势,其市场价值不仅体现在竞赛本身,还体现在推动无人机技术创新、拓展应用场景以及促进产业链发展等多个方面。 一、比赛项目介绍 无人机竞赛通常分为多个项目,包括竞速赛、技巧赛、航拍赛等。每个项目…

ADS使用记录之使用RFPro进行版图联合仿真-加入集总元器件

ADS使用记录之使用RFPro进行版图联合仿真-加入集总元器件 ADS使用记录之使用RFPro进行版图联合仿真中已经简单介绍了使用RFPro对版图就行仿真的方法。但是,如果版图中含有一些非微带的结构,比如说电感、电容、晶体管呢,在此举例解释一下。 …

Java--初识类和对象

前言 本篇讲解Java类和对象的入门版本。 学习目的: 1.理解什么是类和对象。 2.引入面向对象程序设计的概念 3.学会如何定义类和创建对象。 4.理解this引用。 5.了解构造方法的概念并学会使用 考虑到篇幅过长问题,作者决定分多次发布。 面向对象的引入 J…

英飞凌SiC模块为小米电动车提供动力

至2027年之际,SiC功率模块与裸片产品将荣耀登场,助力小米电动汽车新品SU7璀璨问世。英飞凌,这家业界翘楚,将倾其所能,为小米SU7 Max提供两颗HybridPACK Drive G2 CoolSiC 1200 V模块,如同给电动汽车的心脏注…

Linux进程控制——Linux进程程序替换

前言:Linux进程控制包含了进程终止,进程等待,进程程序替换。走到现在我们也只剩下进程程序替换没介绍了,那么让我们来看看进程程序替换到底是什么! 本篇主要内容: 替换原理 替换函数 实现简易shell 我们所创…

2024年最新软件测试面试题必问的1000题!

我了解的测试理论和方法包括以下几个方面: 黑盒测试与白盒测试: 黑盒测试:基于对软件系统外部行为进行测试,独立于内部代码实现细节。黑盒测试关注输入与输出之间的关系以及软件功能是否符合预期。白盒测试:基于对软件…

【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”

看到这句话的时候证明:此刻你我都在努力~ 加油陌生人~ 个人主页: Gu Gu Study ​​ 专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努…