Linux:详解TCP协议(一)

文章目录

  • 认识TCP
  • TCP协议段格式

本篇主要总结的是TCP协议的一些字段

认识TCP

TCP协议全称是传输控制协议,也就是说是要对于数据的传输进行一个控制

在这里插入图片描述
以上所示的是对于TCP协议进行数据传输的一个理解过程

全双工

至此就可以对于TCP协议是全双工的来进行理解了,所谓全双工其实就是有自己对应的接收缓冲区和发送缓冲区,所以这就意味着TCP协议的发送和接受是完全可以分开独立进行的,这就和UDP协议有很大的不同,因此我们说TCP协议是全双工的

发送接收的本质

对于发送和接受的本质来说,其实都是一种拷贝,以系统调用read和write来说,站在操作系统上是把数据从磁盘加载到内存当中,而这样的加载过程的本质其实就是一个拷贝的过程,经过这样的拷贝从而把数据从磁盘中拷贝到内存中

而以recv和send为例,这两个系统调用展现出的本质实际上也是一种拷贝的过程,只不过这里的拷贝是把数据从内存拷贝到网络,或是把数据从网络拷贝到内存,这其实也是一种拷贝

TCP协议段格式

下面就要进行的是对于TCP协议段的阐述,也是本篇的重点内容

在这里插入图片描述
在进行UDP的学习当中,可以看到UDP的协议段定制是比较简单的,它是面向数据报的,所以只需要根据数据长度来进行判断发送成功或者是失败,并且它并不关心数据是否递达,而对于TCP来说就不是这样,它关心的点更多,它需要确保数据是否送达,这就必定意味着它需要传递更多的消息

报头和有效载荷的分离

在整个网络协议栈中,首先要关心的内容必然是对于报头和有效载荷分离的这个过程,因为对于任何一种协议来说都必须有这样的功能,结合报头和与报头进行分离,有这样的操作能力才能使得信息可以在网络协议栈中进行传输

那对于报头和有效载荷分离的这个过程来说,必然涉及到的一个点是如何把数据传输到上层当中,于是就要引入第一个报头参数,4位首部长度

4位首部长度

对于TCP的标准报头来说,它占据的是20个字节,而有效载荷则是最下面的数据区,那中间的选项其实严格意义来说也属于报头中的一种,因此就有了这个首部长度的概念

4位首部长度的最大取值是15,那如何表示20个字节呢?其实是因为在计算的时候四位首部长度是有基本的计算单位的,计算单位是4字节,这就意味着这个范围实际上是0-60字节,所以将报头和有效载荷的分离就直接借助这个4位首部长度就可以,本质上是通过固定长度和自描述字段

源端口号和目的端口号

这个字段其实和UDP是一样的,都是用来确认发送双方的一些信息,这样可以准确的通过端口号找到所需要传递的进程

16位窗口大小

TCP协议是面向字节流的,所以它和文件其实是有些相似的,那么现在的问题是对于这个协议来说,通信的双方该如何进行判断,对方的缓冲区中的数据到底满了还是没满?换句话说,发送数据的速度该如何进行判断呢?这就用到了这个窗口大小的概念了

对于窗口大小来说,值得是自己的接收缓冲区中剩余空间的大小,那么基于这个数据段,就能告诉对方我当前的缓冲区还有多少内容,如果此时剩余空间已经没有了,那么就代表我的接收缓冲区已经满了,不要再给我发送数据了,反之就是可以快点继续发,我当前缓冲区可以接受数据

32位序号

提到32位序号,就必须要提及确认应答机制了

在这里插入图片描述
TCP协议是传输可靠的协议,那么这个可靠该如何理解?它必然是因为有它特定的机制来保证它的传输是可靠的,因此下面就要介绍可靠的来源:确认应答机制

通俗来讲,这个机制的意思就是当前有主机A和主机B,当主机A向主机B发送数据的时候,主机B在接收到消息之后会传递给主机A一个消息,表示自己收到了这个消息。根据这个原理,我们说这就叫做是一次可靠的传输,落实到具体的来说,当我传输出去的数据收到了应答,那么就说明这次的传输是可靠的,意味着对方已经收到了我的消息,那反过来说,对于没有应答的数据,就不能保证它的可靠性,因此最新的一条消息是没有应答的,这也就意味着是不知道这个消息到达的结果如何,也就说明并不存在100%可靠的网络协议,不过TCP可以很大程度上帮助使得协议本身变得可靠

序号问题

下面要谈的一个问题是,数据的乱序问题

假设现在TCP的服务端向客户端发送了10条消息,那抵达到客户端后,这10条消息是依次抵达的吗?理想状态下是这样,但是实际上在进行基站的传输过程中,肯定不是这样的,所以带来的一个问题是,TCP数据传输造成的乱序,本身就是TCP协议不可靠的一种体现,我们以下图为例

在这里插入图片描述
上图所示的就是TCP最基本,最原始的通信过程,也是一种理想的通信过程,但是实际上传输遇到乱序是很正常的现象,那么TCP是如何处理这样的现象的呢?

TCP协议引入了序号的概念,TCP将每个字节的数据都进行了编号,每一个编号就叫做是序列号

在这里插入图片描述
该如何理解这个概念呢?我们可以认为TCP的发送缓冲区就是一个数组,而在这当中填入了很多的数据,天然的每一个字节就会有一个字节编号,这个编号本质上就数组的下标,而在发送的报头中会有对应32位序号,当发送一个TCP数据的时候,就会在报头中填写对应的数据块的最后一个字符的下标,这就意味着是当前发送的报文序号,这样就把数据发送过去了

32位确认序号

反之我们对应的是32位确认序号,这个确认序号代表的是确认序号之前的数据已经全部收到了,那这个确认序号填多少呢?它填充的是收到报文序号+1,比如第一次发报文序号是1000,第二个报文的序号是2000,那么在进行应答的时,对应的确认序号就是1001和2001,以下图为例

在这里插入图片描述
为什么要这样进行规定呢?这里我目前给出的解释是,表示的是1001之前的报文已经全部收到了,它表示的是当前确认序号之前的数据已经都收到了,那现在假设,发送了很多的报文,其中有一个报文丢失了,虽然我此时没有收到1001之前的内容和2001之前的内容,但是3001之前的内容已经收到了,那么就意味着服务器已经安全的把3001的报文接受了,那么就算要进行重传,也只需要把1001和2001进行传递就可以了

6个标记位

下面要谈的内容是6个标记位的问题,对于服务端来说,它会收到各种各样的来自很多客户端的TCP请求,那么在这些请求中其实是有很多类型的,比如说有请求连接,请求断开,请求申请数据,请求发送数据,那么这些请求该如何进行区分呢?就依靠这6个标记位,就可以实现不同类型的TCP请求进行识别

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥OJ3510 冶炼金属(暴力+二分)

冶炼金属 学习了b站Turing_Sheep的思路 一、暴力模拟 思路: b[i] a[i] / v b[1] a[1] / v b[2] a[2] / v .... b[n] a[n] / v 以上列举中v要满足所有的记录,但凡一个记录不满足,v就不满足题意。 从小到大列举v,设置v最大为1e6 设置一个标…

鸿蒙开发之ArkUI组件常用组件-CustomDialog/Video

CustomDialog 自定义弹窗(CustomDialog)可用于广告、中奖、警告、软件更新等与用户交互响应操作。我们可以通过CustomDialogController类显示自定义弹窗。 创建自定义弹窗 使用CustomDialog装饰器装饰自定义弹窗CustomDialog装饰器用于装饰自定义弹窗&a…

Vuepress 2从0-1保姆级进阶教程——美化与模板

Vuepress 2 专栏目录 1. 入门阶段 Vuepress 2从0-1保姆级入门教程——环境配置篇Vuepress 2从0-1保姆级入门教程——安装流程篇Vuepress 2从0-1保姆级入门教程——文档配置篇Vuepress 2从0-1保姆级入门教程——范例与部署 2.进阶阶段 Vuepress 2从0-1保姆级进阶教程——全文搜索…

【Java程序设计】【C00388】基于(JavaWeb)Springboot的校园竞赛管理系统(有论文)

Springboot的校园竞赛管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,博客…

基于ZHW3548的红外额温枪解决方案

红外额温枪,非接触式测量最典型的方法是红外测温。自红外辐射原理被发现以来,红外技术被广泛应用在温度测量中。红外测温仪具有测温范围广,响应速度快,灵敏度高等特点。红外耳温枪、红外额温计和红外筛检仪都属于非接触式体温计。…

实验3 中文分词

必做题: 数据准备:academy_titles.txt为“考硕考博”板块的帖子标题,job_titles.txt为“招聘信息”板块的帖子标题,使用jieba工具对academy_titles.txt进行分词,接着去除停用词,然后统计词频,最…

鱼眼相机的测距流程及误差分析[像素坐标系到空间一点以及测距和误差分析]

由于最近在整理单目测距的内容,顺手也总结下鱼眼相机的测距流程和误差分析,如果有错误,还请不吝赐教。 参考链接: 鱼眼镜头的成像原理到畸变矫正(完整版) 相机模型总结(针孔、鱼眼、全景) 三维…

Linux 基础IO [缓冲区文件系统]

💓博主CSDN主页:麻辣韭菜-CSDN博客💓   ⏩专栏分类:http://t.csdnimg.cn/G90eI⏪   🚚代码仓库:Linux: Linux日常代码练习🚚   🌹关注我🫵带你学习更多Linux知识   🔝 目录 前言…

HarmonyOS实战开发-实现自定义弹窗

介绍 本篇Codelab基于ArkTS的声明式开发范式实现了三种不同的弹窗,第一种直接使用公共组件,后两种使用CustomDialogController实现自定义弹窗,效果如图所示 相关概念 AlertDialog:警告弹窗,可设置文本内容和响应回调…

Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(三)

概览 承接上一篇博文: Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(二)我们在其中讨论了如何使用第三方强大通用的钩子库 SwiftHook 来协助我们完成 NSObject 构造器 init 的 SWIZZ 操作。我们还讨论了为什么用 print 打印对象信息时会发生崩溃…

在Windows系统上安装多个 Nodejs

前言 在Windows系统安装Nodejs 在Windows系统上安装多个 Nodejs v14.16.1安装位置 D:\sde\nodejs\node-v14.16.1-win-x64 v16.20.2安装位置 D:\sde\nodejs\node-v16.20.2-win-x64 v18.20.0安装位置 D:\sde\nodejs\node-v18.20.0-win-x64 v20.12.0安装位置 D:\sde\nod…

YOLOv9改进策略 :neck优化 | 路径融合GFPN,小目标到大目标一网打尽 | 轻骨干重Neck的轻量级目标检测器GiraffeDet

💡💡💡本文改进内容:设计了一种新的路径融合GFPN:包含跳层与跨尺度连接,改进思路来自ICLR2022 GiraffeDet的核心思想。 💡💡💡GFPN和六个检测头结合,这种跳层…

集体出走的Stability AI 发布全新代码大模型,3B以下性能最优,超越Code Llama和DeepSeek-Coder

Stability AI又有新动作!程序员又有危机了? 3月26日,Stability AI推出了先进的代码语言模型Stable Code Instruct 3B,该模型是在Stable Code 3B的基础上进行指令调优的Code LM。 Stability AI 表示,Stable Code Instru…

【python】flask执行上下文context,请求上下文和应用上下文原理解析

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

2024河北石家庄矿业矿山展览会|河北智慧矿山展会|河北矿博会

2024中国(石家庄)国际矿业博览会      时间:2024年7月4-6日 地点:石家庄国际会展中心.正定      随着全球经济的持续增长和矿产资源需求的不断攀升,矿业行业正迎来前所未有的发展机遇。作为矿业领域的盛会&…

3.28C++

复数类的实现&#xff0c;写出三种构造函数&#xff0c;算术运算符、关系运算符、逻辑运算符重载尝试实现自增、自减运算符的重载 #include <iostream> using namespace std; class Num {int rel; //实部int vir; //虚部 public:Num():rel(2),vir(1){}Num(int rel,…

确保未来安全:应对云安全的复杂性

云是业务运营的重要组成部分&#xff0c;它改变了组织扩展、创新和适应的方式。然而&#xff0c;其影响力日益增长的广度和深度不仅仅局限于商业领域。云环境是我们日常生活中不可或缺的一部分&#xff0c;负责存储和传输全球平民最敏感的数据。随着大量企业和个人利用云&#…

【C语言】编译和链接----从源代码到可执行程序的转换【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】文件操作揭秘&#xff1a;C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 欢迎来到本篇博客&…

最小化安装Kubesphere报错问题解决方法

最小化安装Kubesphere报错: TASK [preinstall : Stop if defaultStorageClass was not found] ****************** fatal: [localhost]: FAILED! > {"assertion": "\"(default)\" in default_storage_class_check.stdout", "changed&qu…

数据结构进阶篇 之 【二叉树链序存储】的整体实现讲解

封建迷信我嗤之以鼻&#xff0c;财神殿前我长跪不起 一、二叉树链式结构的实现 1.二叉树的创建 1.1 手动创建 1.2 前序递归创建 2.二叉树的遍历 2.1 前序&#xff0c;中序以及后序遍历概念 2.2 层序遍历概念 2.3 前序打印实现 2.4 中序打印实现 2.4 后序打印实现 2.…
最新文章