当前位置: 首页 > news >正文

Linux:详解TCP报头类型

文章目录

  • 温习
    • 序号的意义
    • 序号和确认序号
    • 报文的类型
  • 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的紧急指针只允许携带一个字节的数据

相关文章:

Linux:详解TCP报头类型

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

【Leetcode】top 100 二分查找

35 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。 基础写法!!!牢记…...

Redis高级面试题-2024

说说你对Redis的理解 Redis是一个基于Key-Value存储结构的开源内存数据库,也是一种NoSQL数据库。 它支持多种数据类型,包括String、Map、Set、ZSet和List,以满足不同应用场景的需求。 Redis以内存存储和优化的数据结构为基础,提…...

HarmonyOS 应用开发之FA模型与Stage模型应用组件

应用配置文件概述(FA模型) 每个应用项目必须在项目的代码目录下加入配置文件,这些配置文件会向编译工具、操作系统和应用市场提供描述应用的基本信息。 应用配置文件需申明以下内容: 应用的软件Bundle名称,应用的开发…...

6个黑科技网站,永久免费

1、http://mfsc123.com https://www.mfsc123.com 一个非常赞的免费商用素材导航网站。 收集了各种免费、免版权的图片、插画、视频、视频模板、音乐、音效、字体、图标网站。 再也不用担心版权问题,都能免费商用,自媒体作者必备。 而且还在每个网站…...

Linux 内核优化简笔 - 高并发的系统

简介 Linux 服务器在高并发场景下,默认的内核参数无法利用现有硬件,造成软件崩溃、卡顿、性能瓶颈。 当然,修改参数只是让Linux更好软件的去利用已有的硬件资源,如果硬件资源不够也无法解决问题的。而且当硬件资源不足的时候&am…...

整型之韵,数之舞:大小端与浮点数的内存之旅

✨✨欢迎👍👍点赞☕️☕️收藏✍✍评论 个人主页:秋邱’博客 所属栏目:人工智能 (感谢您的光临,您的光临蓬荜生辉) 1.0 整形提升 我们先来看看代码。 int main() {char a 3;char b 127;char …...

变量作用域

变量作用域 标识符的作用域是定义为其声明在程序里的可应用范围, 或者即是我们所说的变量可见性。换句话说,就好像在问你自己,你可以在程序里的哪些部分去访问一个制定的标识符。变量可以是局部域或者全局域。 全局变量与局部变量 定义在函数内的变量有局部作用域,在一个…...

数据结构:链表的双指针技巧

文章目录 一、链表相交问题二、单链表判环问题三、回文链表四、重排链表结点 初学双指针的同学,请先弄懂删除链表的倒数第 N 个结点。 并且在学习这一节时,不要将思维固化,认为只能这样做,这里的做法只是技巧。 一、链表相交问题 …...

用WHERE命令可以在命令行搜索文件

文章目录 用WHERE命令可以在命令行搜索文件概述笔记没用的小程序END 用WHERE命令可以在命令行搜索文件 概述 想确认PATH变量中是否存在某个指定的程序(具体是在PATH环境变量中给出的哪个路径底下?). 开始不知道windows有where这个命令, 还自己花了2个小时写了一个小程序. 后…...

持续交付/持续部署流水线介绍(CD)

目录 一、概述 二、典型操作流程 2.1 CI/CD典型操作流 2.2 CI/CD操作流程说明 2.3 总结 三、基于GitHubDocker的持续交付/持续部署流水线(公有云) 3.1 基于GitHubDocker的持续交付/持续部署操作流程示意图 3.2 GitHubDocker持续交付/持续部署流水…...

第四百三十八回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 们在上一章回中介绍了"不同平台上换行的问题"相关的内容,本章回中将介绍如何在页面上显示蒙板层.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们…...

Python学习:面相对象

面向对象 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实…...

SSM学习——Spring AOP与AspectJ

Spring AOP与AspectJ 概念 AOP的全称为Aspect-Oriented Programming,即面向切面编程。 想象你是汉堡店的厨师,每一份汉堡都有好几层,这每一层都可以视作一个切面。现在有一位顾客想要品尝到不同风味肉馅的汉堡,如果按照传统的方…...

Android 使用LeakCanary检测内存泄漏,分析原因

内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。 平时我们在使用app时,少量的内存泄漏我们是发现不了的,但是当内存泄漏达到一定数量时&…...

Linux部署Kafka2.8.1

安装Jdk 首先确保你的机器上安装了Jdk,Kafka需要Java运行环境,低版本的Kafka还需要Zookeeper,我此次要安装的Kafka版本为2.8.1,已经内置了一个Zookeeper环境,所以我们可以不部署Zookeeper直接使用。 1、解压Jdk包 t…...

【pytest、playwright】allure报告生成视频和图片

目录 1、修改插件pytest_playwright 2、conftest.py配置 3、修改pytest.ini文件 4、运行case 5、注意事项 1、修改插件pytest_playwright pytest_playwright.py内容如下: # Copyright (c) Microsoft Corporation. # # Licensed under the Apache License, Ver…...

浅谈iOS开发中的自动引用计数ARC

1.ARC是什么 我们知道,在C语言中,创建对象时必须手动分配和释放适量的内存。然而,在 Swift 中,当不再需要类实例时,ARC 会自动释放这些实例的内存。 Swift 使用 ARC 来跟踪和管理应用程序的内存,其主要是由…...

Spring IoCDI(2)

IoC详解 通过上面的案例, 我们已经知道了IoC和DI的基本操作, 接下来我们来系统地学习Spring IoC和DI的操作. 前面我们提到的IoC控制反转, 就是将对象的控制权交给Spring的IoC容器, 由IoC容器创建及管理对象. (也就是Bean的存储). Bean的存储 我们之前只讲到了Component注解…...

30. UE5 RPG GamplayAbility的配置项

在上一篇文章,我们介绍了如何将GA应用到角色身上的,接下来这篇文章,将主要介绍一下GA的相关配置项。 在这之前,再多一嘴,你要能激活技能,首先要先应用到ASC上面,才能够被激活。 标签 之前介绍…...

提升自己最快的方式是什么?

提升自己最快的方式通常涉及到个人成长的各个方面,包括心理、情感、技能和知识等。根据查阅到的资料,以下是一些具体的方法和步骤,帮助你快速提升自己: 1. 培养屏蔽力 荷兰畅销书作家罗伊马丁纳提到,屏蔽力是个人成长…...

题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。    There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence…...

《HelloGitHub》第 96 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 …...

C++tuple类型

tuple 类型 tuple是类似pair的模板。 每个pair的成员类型都不相同,但每个pair都恰好有两个成员。不同tuple类型的成员类型也不相同,但一个tuple可以有任意数量的成员。 每个确定的tuple类型的成员数目是固定的,但一个tuple类型的成员数目可…...

亚远景科技-浅谈ASPICE标准和ASPICE认证/评估

ASPICE(Automotive SPICE)是一种针对汽车行业的软件开发过程的评估模型,它旨在帮助汽车制造商和供应商提高软件开发过程的能力和质量,从而提升产品的质量、安全性和效率。 ASPICE标准涵盖了软件开发的各个阶段和活动,…...

PHP性能提升方案

一、背景与介绍 PHP语言开发效率高,特别应用于适合中小型项目,对于创业初期敏捷开发验证项目可行性或者Demo演示绝对占据优势。 但是随着现在Web应用的复杂性,针对项目要适应高并发、高流量的访问特性,PHP确实在性能方面相对Go、J…...

关系(二)利用python绘制热图

关系(二)利用python绘制热图 热图 (Heatmap)简介 热图适用于显示多个变量之间的差异,通过颜色判断彼此之间是否存在相关性。 快速绘制 基于seaborn import seaborn as sns import pandas as pd import numpy as np i…...

P8597 [蓝桥杯 2013 省 B] 翻硬币

# [蓝桥杯 2013 省 B] 翻硬币 ## 题目背景 小明正在玩一个“翻硬币”的游戏。 ## 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo&#x…...

主流公链 - Fantom

Fantom:高性能的区块链协议 Fantom是一种开创性的区块链协议,旨在革新去中心化应用和数字金融领域 技术特点 共识机制 Lachesis协议:Fantom使用了Lachesis协议作为其共识算法。Lachesis是一种 异步拜占庭容错(ABFT)共…...

vue-quill-editor 富文本编辑器(可上传视频图片),组件挂载的方式实现

1.安装 npm install vue-quill-editor --save npm install quill-image-drop-module --save npm install quill-image-resize-module --save2.在组件下面新增组件 QlEditor (1)index.vue <template><div><div idquillEditorQiniu><!-- 基于element…...

郑州 (网站建设/中国十大seo公司

变量和赋值Name’千寻’Name’小寻’Print(name)运行之后&#xff0c;我们可以发现计算机打印出了我们所输入的第二个name&#xff0c;而没有显示我们第一个name。这里面的Name就是变量&#xff0c;变量就相当于我们独一无二的标签&#xff0c;一次print只能输出显示我们最后定…...

深圳网站 建设信科网络/营业推广名词解释

历时五天的北京之旅告一段落。 五天印象最深的就是北京地铁13号实在太拥挤了。但是&#xff0c;由于师哥师姐以及同学之间互相照顾&#xff0c;所以五天其实说实话挺舒服(*^__^*)。有幸出去见识了一下外面的情况&#xff0c;并且有幸结识了Mkey3G。无论从事与否&#xff0c;至少…...

个人简介网页设计素材/青岛seo排名公司

RESTful接口URL的格式&#xff1a; http://localhost:9200/<index>/<type>/[<id>] 其中index、type是必须提供的。 id是可选的&#xff0c;不提供es会自动生成。 index、type将信息进行分层&#xff0c;利于管理。 index可以理解为数据库&#xff1b;type理解…...

鄂州网吧暂停营业/seo的搜索排名影响因素主要有

C语言程序设计Copyer:Vigiking ;第一章 计算机语言与C语言概述 ;?机器语言 最早问世&#xff0c;用二进制代码构成指令。 如&#xff1a; 100000 () 110000 (-) 用机器语言编程的缺点&#xff1a; ─繁琐、不直观、不易调试。 如计算y2x23x-1需要七八条指令。 ─移植性差。 依…...

银川做网站哪家好/江苏建站

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 前端面试基础知识题 1. js中如何判断一个值是否是数组类型&#xff1f; instanceof const arr []; arr instanceof…...

网站建设服务属于信息技术服务吗/关键词在线播放免费

在数据仓库中的转换和装载过程中&#xff0c;经常会使用MERGE语句&#xff0c;这里简单总结一下。 MERGE 语句是Oracle9i新增的语法&#xff0c;用来合并UPDATE和INSERT语句。通过MERGE语句&#xff0c;根据一张表或子查询的连接条件对另外一张表进行查询&#xff0c;连接条件匹…...