Linux:详解TCP报头类型

news/2024/5/14 20:29:40/文章来源:https://blog.csdn.net/qq_73899585/article/details/137131210

文章目录

  • 温习
    • 序号的意义
    • 序号和确认序号
    • 报文的类型
  • TCP报头类型详解
    • ACK: 确认号是否有效
    • SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
    • FIN: 通知对方, 本端要关闭了
    • PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
    • RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
    • URG: 紧急指针是否有效

本篇继续对于TCP协议的字段进行解析

在这里插入图片描述

温习

序号的意义

TCP为了传输的效率,必然会遇到批量化传输这样的场景,那也就意味着会涉及到批量化的应答

这里随之而来会遇到一个问题,那就是在传输的过程中,由于传输的速度不同,所以曾经发送的数据不一定是对方接收的顺序,所以一定要在传输之后的内容带一个对应的序号,那么这个序号实际上就是客户端给服务端发送时候报文的序号,也正是因为有这个序号,所以才能对收到的报文进行排序,保证数据的按序到达

序号和确认序号

那序号和确认序号就是伴随着上面的概念而引出的,当传输过去了之后,对应着传输回来的ACK序号往往是收到的报文序号加一,采用这样的方式就能对于对应的报文当中的内容进行确认了

报文的类型

在上篇的最后我们讲到,对于一个服务器来说,它必然会产生很多的请求,有些请求是要建立链接的,有些是要断开连接的,有些是要进行正常通信的,所以我们说报文是有类型的,所以我们才知道对于TCP中的报头部分,其当中会有很多的标记位,其中有几个标记位就是来区分不同的报文类型的,这也是说明了在上面的场景中可以突出他们需要标记位的原因,所以本节要总结的核心点就是对于报文的类型进行解析

对于TCP的三次握手和四次挥手,在后面的文章中也会进行详细的总结和解析

TCP报头类型详解

ACK: 确认号是否有效

首先第一个标记位是ACK标记位,这个标记位的作用是确认序号是否有效,实际上在进行数据通信的时候,在三次握手建立成功之后,在大部分情况下,所有报文的ACK标记位默认都是被置一的,它的意思就是说这个标记位是有效的,ACK原则上代表的是报文是具有应答属性的,而在进行报文通信的时候很多是有捎带应答的概念,所以在一个报文给对方进行应答的同时,可能携带了我的数据,那么如何判断这是一个简单的应答还是有其他的数据,一个是要看这个ACK标记位是否有内容,一个就是要看有效载荷当中是否有数据

SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段

SYN的全称是synchronous,翻译过来的意思是同步,那它代表的是什么意思呢?给出下面的这个场景:

假设现在通信双方要进行一个简单的通信,那么此时第一步要做的就是先建立链接,可是服务器是如何知道我当前要和它做的事是建立链接呢?所以说在一个报文中,凡是设置了SYN标记位的报文,实际上都是代表了自己想要和服务器进行三次握手建立链接,这个也叫做是建立链接的请求,所以它用来标识发过来的TCP整体的报文是一个链接的请求

FIN: 通知对方, 本端要关闭了

第三个要说的标记位是FIN,其全称是finish,这个其实很好理解,它表示的意思就是说通信双方要使用的这个TCP,将要关闭了,所以要进行断开链接了

所以由此可以看出,标记位当中不仅有要进行数据通信的标记位,也有对应的控制标记位,表示我当前要建立链接或者是当前要退出链接

PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走

首先说明,TCP报头和配套的协议都是操作系统自主决定的,通常来说它不会允许用户直接从外部去修改对应的比特位信息,通常最多是提供一些系统调用来进行修改,实际上在进行套接字的设置过程中,当进行发起connect的请求的时候,实际上就是TCP报文要在底层把SYN设置为一,然后发送给服务器要进行三次握手的链接过程,而这个FIN表示的就是在进套接字关闭的时候要进行的close的操作,实际上也是在底层把这个FIN标记位设置为一

那回到PSH标记位,在进行TCP通信的时候,在客户端向服务端发消息,服务端向客户端发消息,由于存在流量控制的原因,所以对应的应用层可能会出现迟迟不把数据取走的情况出现,那么就会导致缓冲区的数据越来越多,最终导致空间越来越小,不过以我们前面的代码来看,出现这样事件的情况并不多见,而如果真的出现这样的情况会怎么样呢?如果此时现在已经陷入了循环,客户端要给服务端发消息,服务端缓冲区已经满了,而客户端不知道什么时候缓冲区有内容,那这样的情况该如何解决呢?

对应的策略提供两种:

  1. 发送方会定期的询问对方,看对方的缓冲区中还有没有空间,只要有就能发送报文,但是前提是对方肯定要做出应答
  2. 当接收方的缓冲区数据被上层更新了之后,它就会给对方发送一个报文,说自己的缓冲区已经更新了,可以在缓冲区中继续写入数据了

这两种协商方式在实际的TCP协议中是会同时存在的,具体哪一种协议方式生效就使用哪一种,但不管怎么说,假设现在对方缓冲区的数据就是不拿走,就在对应的缓冲区中卡着,那么此时对应的TCP该如何处理呢?所以就用到了这个PSH标记位,这个标记位表示的是push的意思,表示的是如果对方的操作系统中收到了代表着PSH标记位的数据时,就表示这个操作系统必须要赶快把缓冲区当中的信息交付到上层空间中,尽快的腾出空间,当有这样的需求的时候,发送放就会把信息读走,如果迟迟不读,可能会直接把建立的链接关闭等等,所以换句话说,其实PSH的作用就是催促对方赶快读走信息

RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段

下一个要说的是RST标记位,正常情况下TCP的三次握手和四次挥手是应该成功的,但是这样的动作有没有可能出现意外呢?答案也是可能的

在TCP的内部,可能会和很多个客户端建立链接,那么在TCP的内部必然会存在对应的数据结构,用来描述这样的链接情况,所以从本质上来说就可以把对于TCP链接的管理转换为对于链表的增删查改,所以说对于客户端和服务端来说,一定要在内核中维护对应的结构和对象,上面讲的什么缓冲区超时重传,序号问题,这些属性的字段都会在对应的结构体当中进行标识

可是问题是,对于链接的维护是有成本的,维护的成本主要体现在三次握手成功之后,此时就会建立链接,创建对应的结构体数据结构,然后进行维护对应的链接情况,但是不管怎么说,如果出现链接异常的情况呢?客户端认为链接成功了,而实服务端没有成功,那么在进行报文传输的时候就会携带有对应的RST标记位,表示现在应该要建立链接了

那对于客户端来说,它在发送了最后一个信息的时候就认为链接已经建立好了,而实际上可能在最后发送出去的消息中出现了问题,链接没有建立完成

在这里插入图片描述
那么在这样的情况下,客户端在认为自己成功之后,下一步就会直接向服务端发送给消息,那服务端在看到明明还没有建立好链接,客户端就要给我发消息,那么服务端就认为客户端以为建立好链接了,实际上没有,那么就会赶快把RST的标记位传入到报头中,然后发给客户端,然后客户端就会对于服务端进行链接重新建立

URG: 紧急指针是否有效

这个标记位表示的是紧急指针是否有效,那该如何这个紧急指针呢?

对于TCP的传输来说,正常来说是要按照顺序到达的,因为保持报文的顺序本身就是有序的一个前提条件。但是在有些情况下,确实如果想要让部分数据进行插队,那该如何处理呢?此时就可以设置一个URG标记位,表示的是紧急指针,在这个紧急指针中存放的是数据的偏移量,根据这个偏移量就可以找到这个紧急数据

一般来说,在TCP的紧急指针只允许携带一个字节的数据

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

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

相关文章

vue2处理跨域问题

vue中访问springboot中的RestController中的服务 &#xff08;vue.config.js不生效-CSDN博客&#xff09; 1、创建项目 使用vue init webpack my_frontend 创建vue项目 在HelloWorld.vue文件中添加内容&#xff1a; HelloWorld.vue 文件内容&#xff1a; <template>&…

Qt 图片预览(等比例显示、放大、缩小、平移图像)显示

使用Qt的Painter绘制图像并显示&#xff0c;根据窗口的大小计算图片显示的尺寸&#xff0c;并可以对图片放大和缩小的显示&#xff0c;还可以对已经放大了的图片进行平移预览的操作。 效果如下&#xff1a; 使用函数 painter.translate() 对画布进行平移操作。使用函数 painte…

Linux(CentOS7.5) 安装部署 Python3.6(超详细!包含 Yum 源配置!)

文章目录 1.配置 Yum 源2.下载 Python3 包3. 解压4.安装依赖环境5.安装出错场景 6.创建软链接7.配置 Python3 的环境变量8.验证补充&#xff1a;安装 openssl-devel补充&#xff1a;pip3 源配置 1.配置 Yum 源 # 注意&#xff01;&#xff01;&#xff01;请先切换到 root 账号…

鸿蒙OS开发实例:【消息传递】

介绍 在HarmonyOS中&#xff0c;参考官方指导&#xff0c;其实你会发现在‘指南’和‘API参考’两个文档中&#xff0c;对消息传递使用的技术不是一对一的关系&#xff0c;那么今天这篇文章带你全面了解HarmonyOS 中的消息传递 概况 参照官方指导&#xff0c;我总结了两部分…

海豚【货运系统源码】货运小程序【用户端+司机端app】源码物流系统搬家系统源码师傅接单

技术栈&#xff1a;前端uniapp后端vuethinkphp 主要功能&#xff1a; 不通车型配置不通价格参数 多城市定位服务 支持发货地 途径地 目的地智能费用计算 支持日期时间 预约下单 支持添加跟单人数选择 支持下单优惠券抵扣 支持司机收藏订单评价 支持订单状态消息通知 支…

五、基于KubeAdm搭建多节点K8S集群

如需查阅上一步骤,请点击下面链接:四、戴尔R630本地服务器Linux Centos7.9系统安装docker-ce-20.10.10-3.el7版本-CSDN博客文章浏览阅读727次,点赞12次,收藏13次。1、准备工作3、Linux Centos7.9系统的iDRAC远程管理、网络设置、SecureCRT远程登录终端、企业级静态ip地址配…

数据湖与湖仓一体是如何演变而来的?详谈大数据存储架构的变迁

在大数据存储架构的发展历程中&#xff0c;可以划分为三个显著的演进阶段。首先&#xff0c;随着Hadoop和Hive等初期项目的出现&#xff0c;数据仓库&#xff08;Data Warehouse&#xff09;的概念得以确立&#xff1b;随着数据仓库的不断演化&#xff0c;同时有了云与对象存储…

UE4_旋转节点总结二——实现盯着某物或者看向相同方向功能

如何利用旋转等蓝图节点完成Actor与Actor看向相同的方向或者一个Actor看向另一个Actor的方法。 一、蓝图节点SetActorRotation 效果&#xff1a; 效果 二、GetActorUpVector 测试&#xff1a; 角色向上的向量为负Z轴&#xff0c;正好是角色的头上面方向。 测试&#xff1a; 角…

动态规划刷题(算法竞赛、蓝桥杯)--守望者的逃离(线性DP)

1、题目链接&#xff1a;[NOIP2007 普及组] 守望者的逃离 - 洛谷 #include <bits/stdc.h> using namespace std; int main(){int m,s,t;cin>>m>>s>>t;int s1,s20;//s1跑,s2闪 for(int i1;i<t;i){//枚举时间,s1s2同时进行 s117;if(m>10){s260;m-1…

DARTS-PT: RETHINKING ARCHITECTURE SELECTION IN DIFFERENTIABLE NAS

Rethinking Architecture Selection in Differentiable NAS 论文链接&#xff1a;https://arxiv.org/abs/2108.04392v1 项目链接&#xff1a;https://github.com/ruocwang/darts-pt ABSTRACT 可微架构搜索(Differentiable Neural Architecture Search, NAS)是目前最流行的网…

上位机图像处理和嵌入式模块部署(qmacvisual非opencv算法编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们都知道&#xff0c;qmacvisual本身依赖于qtopencv的实现。大部分的界面都是依赖于qt的实现。图像算法部分&#xff0c;也是大部分都依赖于open…

【threejs】较大物体或shape的贴图较小问题处理方法

问题 有的场景内相对体型差距过大的物体&#xff08;如山地 海洋等&#xff09;由于尺寸问题&#xff0c;加载贴图过于小&#xff0c;同时shader也无法完全展示&#xff0c;如图 我们可以获取物体的uv&#xff0c;进行缩放使得贴图可以完全展开 如果uv是乱的 可以用xyz坐标最…

C语言例4-4:putchar()函数的调用格式和使用的例子

代码如下&#xff1a; //putchar()函数的调用格式和使用的例子 #include<stdio.h> //编译预处理命令&#xff0c;即文件包含命令 int main(void) {char ch1N, ch2E, ch3W;putchar(ch1);putchar(ch2);putchar(ch3); //输出变量c1、c2和c3中的字符putchar(\n);putcha…

Vue——案例01(查询用户)

一、案例实现页面 二、案例实现效果 1. 查询效果 2. 年龄升序 3. 年龄降序 4. 原顺序 三、案例实现思路 1. 定义界面所需标签样式 <div id"app"><h2>查询用户:</h2><input type"text" placeholder"请输入名字"/><b…

竞赛 python+大数据校园卡数据分析

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&am…

浪潮信息AIStation与潞晨科技Colossal-AI 完成兼容性认证!

为进一步提升大模型开发效率&#xff0c;近年来&#xff0c;浪潮信息持续加强行业合作&#xff0c;携手业内头部&#xff0c;全面进攻大模型领域。日前&#xff0c;浪潮信息AIStation智能业务创新生产平台与潞晨科技Colossal-AI大模型开发工具完成兼容性互认证。后续&#xff0…

Istio 部署 Spring Coud 微服务应用

Istio 服务部署 这篇文章讲述如何将 Java Spring Cloud 微服务应用部署到 Istio mesh 中。 准备基础环境 使用 Kind 模拟 kubernetes 环境。文章参考&#xff1a;https://blog.csdn.net/qq_52397471/article/details/135715485 在 kubernetes cluster 中安装 Istio 创建一…

【Roadmap to learn LLM】Large Language Models in Five Formulas

by Alexander Rush Our hope: reasoning about LLMs Our Issue 文章目录 Perpexity(Generation)Attention(Memory)GEMM(Efficiency)用矩阵乘法说明GPU的工作原理 Chinchilla(Scaling)RASP(Reasoning)结论参考资料 the five formulas perpexity —— generationattention —— m…

前端web移动端学习day04

移动 Web 第四天 01-vw适配方案 vw和vh基本使用 vw和vh是相对单位&#xff0c;相对视口尺寸计算结果&#xff0c;相对于屏幕的逻辑参数 vw&#xff1a;viewport width&#xff08;1vw 1/100视口宽度 &#xff09;vh&#xff1a;lviewport height ( 1vh 1/100视口高度 ) …

二叉树:递归算法的理解和运用

上一期中&#xff0c;我们了解到了堆&#xff0c;堆的结构也可以叫做二叉树的顺序结构&#xff0c;今天我们一起来看看二叉树的链式结构&#xff0c;我们还要学习有关于二叉树递归的书写。 首先&#xff0c;这是一个二叉树&#xff0c;但是对于普通的二叉树来说&#xff0c;增…