TCP(1)

news2024/12/29 9:24:40

传输层的两大协议是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.coloradmin.cn/o/1680073.html

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

相关文章

单位内部防泄密策略与技术实践

在信息时代,企业内部数据安全至关重要,尤其是涉及核心竞争力的重要文件,员工的不当操作或恶意泄露都可能给企业带来重大损失。本文将从制度建设、技术防护、以及日常管理三个方面入手,探讨如何构建一套行之有效的内部防泄密体系&a…

汇聚荣:拼多多长期没有流量如何提高?

在电商的海洋中,拼多多以其独特的团购模式吸引了众多消费者的目光。然而,随着市场竞争的加剧和消费者需求的多样化,一些商家发现自家店铺的流量持续低迷,销售业绩难以突破。面对这样的挑战,如何有效提升拼多多店铺的客…

大模型算法(零) - Transformer中的细节与实现

讲transformer的文章已经铺天盖地了,但是大部分都是从原理的角度出发的文章,原理与实现之间的这部分讲解的较少,想要了解实现细节,还是要去看代码才行。记录一下自己学习过程中遇见的细节问题和实现问题。 Transformer整体架构 图…

树链剖分详解,看这一篇就够了

前置知识: 树形结构链式前向星(熟练)线段树(熟练)DFS序(熟练)LCA(了解定义) 什么是树链剖分 树链剖分其实有两种:重链剖分和长链剖分。重链剖分就是把儿子节点最重的儿子称为重儿子,把树分成若干条重链(如图一)&#…

【NR学习一】NR中的带宽、子载波间隔、PRB数量、FFT点数与采样率之间的关系

NR中的带宽、子载波间隔、PRB数量、FFT点数与采样率之间的运算关系 在5G NR(New Radio)系统设计中,带宽(Bandwidth)、子载波间隔(Subcarrier Spacing, SCS)、资源块(Resource Block…

汇聚荣科技:如何有效为拼多多店铺引流?

在电商竞争激烈的今天,为拼多多店铺引流是每个店主必须面对的挑战。有效的引流策略不仅能增加店铺曝光度,还能提升转化率,促进销量增长。 一、社交媒体营销 利用微信、微博等社交平台进行推广,可以通过发布产品信息、用户评价和促…

Web3Tools - 助记词生成

Web3Tools - 助记词生成工具 本文介绍了一个简单的助记词生成工具,使用 React 和 Material-UI 构建。用户可以选择助记词的语言和长度,然后生成随机的助记词并显示在页面上 功能介绍 选择语言和长度: 用户可以在下拉菜单中选择助记词的语言&…

【半夜学习MySQL】复合查询(含多表查询、自连接、单行/多行子查询、多列子查询、合并查询等详解)

🏠关于专栏:半夜学习MySQL专栏用于记录MySQL数据相关内容。 🎯每天努力一点点,技术变化看得见 文章目录 回顾基本查询多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询 回顾基本查询 下面使用…

设计非递归算法,编程:在二叉排序树中,打印关键码a, b的公共祖先。注:例,若a是b的祖先,则a不算作公共祖先。反之亦然。

二叉排序树&#xff1a; 代码&#xff1a; #include <iostream> using namespace std;// 定义二叉树节点结构 typedef struct BTNode {char show;struct BTNode* left;struct BTNode* right; } BTNode;// 非递归插入节点的函数 BTNode* insertNode(BTNode* root, char k…

Hadoop3:HDFS副本节点选择逻辑讲解

一、副本节点选择&#xff08;机架感知&#xff09; 说明 第一个副本&#xff0c;因为我们的client可能是web页&#xff0c;也可能是shell终端。 如果是web页&#xff0c;则随机选取一个节点&#xff0c;如果是shell终端&#xff0c;则选择当前shell终端所在的节点。 节点距离最…

TiDB学习2:TiDB Sever

目录 1. TiDB Server架构 2. sql语句的解析和编译 2.1 Parse ​编辑 2.2 compile 3. 行转化为KV对(聚簇表) ​编辑4. SQL 读写相关模块 4.1 DistSQL(复杂查询) 4.2 KV(简单查询) 5. 在线DDL相关模块 6. GC机制与相关模块 7. TiDB Server的缓存 8. 热点小表缓存 9. …

财富增长新途径:副业赚钱方法全攻略

探寻财富之路:多元化赚钱途径解析 在追求财富的道路上,每个人都在以自己的方式前行。然而,正如古人所云:“君子爱财,取之有道。”今天,我将为您揭示一些新颖且实用的赚钱途径,希望能为您的财富积累之路注入新的活力。 1、视频内容的创作与分享 在这个视频内容为王的时…

Benedict Evans:Ways to think about AGI思考 AGI 的方法:

​Benedict Evans本文发布于2024 年 5 月 4 日 How do we think about a fundamentally unknown and unknowable risk, when the experts agree only that they have no idea? 当专家们一致认为他们一无所知时&#xff0c;我们如何看待根本上未知和不可知的风险&#xff1f; T…

关于 vs2019 c++20 规范里的 STL 库里模板 decay_t<T>

&#xff08;1&#xff09; 这个模板&#xff0c;在库代码里非常常见。 decay 英文是“衰弱&#xff0c;消减” 的意思&#xff0c;大概能感觉到就是要简化模板参数 T 的类型&#xff0c;去掉其上的修饰符。因为常用且复杂&#xff0c;故单独列出其源码和注释。先举例其应用场景…

JumpServer堡垒机应用(v3.10.8) 下

目录 JumpServer堡垒机简单式部署与管理(v3.10.8) 上-CSDN博客 一. 资产管理 1.1创建资产 1.2 给资产主机创建用户 1.2.1 普通账户&#xff1a; 1.2.2 特权账户&#xff1a; 1.2.3 创建用户 二. 命令过滤 2.1 创建命令组 2.2 创建命令过滤 ​编辑 三. 创建资产授权 …

《Python编程从入门到实践》day29

# 昨日知识点回顾 修改折线图文字和线条粗细 矫正图形 使用内置格式 # 今日知识点学习 15.2.4 使用scatter()绘制散点图并设置样式 import matplotlib.pyplot as plt import matplotlib matplotlib.use(TkAgg)plt.style.use(seaborn-v0_8) # 使用内置格式 fig, ax plt.subpl…

软考中级-软件设计师 (十一)标准化和软件知识产权基础知识

一、标准化基础知识 1.1标准的分类 根据适用的范围分类&#xff1a; 国际标准指国际化标准组织&#xff08;ISO&#xff09;、国际电工委员会&#xff08;IEC&#xff09;所制定的标准&#xff0c;以及ISO所收录的其他国际组织制定的标准。 国家标准&#xff1a;中华人民共和…

单位个人如何向期刊投稿发表文章?

在单位担任信息宣传员一职以来,我深感肩上的责任重大。每月的对外信息宣传投稿不仅是工作的核心,更是衡量我们部门成效的重要指标。起初,我满腔热血,以为只要勤勉努力,将精心撰写的稿件投至各大报社、报纸期刊的官方邮箱,就能顺利登上版面,赢得读者的青睐。然而,现实远比理想骨…

Polylang Pro插件下载:多语言网站构建的终极解决方案

在全球化的今天&#xff0c;多语言网站已成为企业拓展国际市场的重要工具。然而&#xff0c;创建和管理一个多语言网站并非易事。幸运的是&#xff0c;Polylang Pro插件的出现&#xff0c;为WordPress用户提供了一个强大的多语言解决方案。本文将深入探讨Polylang Pro插件的功能…

基于物联网的教室人数检测系统-设计说明书

设计摘要&#xff1a; 本设计基于物联网技术&#xff0c;实现了一个教室人数检测系统。系统利用STM32单片机作为中控&#xff0c;通过红外对管检测人员进出教室&#xff0c;并实时统计应到人数和实到人数&#xff0c;同时使用OLED显示屏显示相关信息。系统还通过温湿度传感器检…