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的紧急指针只允许携带一个字节的数据

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

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

相关文章

【学习】软件企业何时会选择第三方软件测试机构

近年来,随着软件行业的迅猛发展,软件企业对软件测试的需求也越来越大。为了保证软件的质量和稳定性,许多企业选择寻找第三方软件测试机构来进行软件测试。第三方软件测试机构是独立于软开发企业的专业机构,主要从事软件测试和质量…

【SpringBoot从入门到精通】02_SpringBoot快速上手

二、SpringBoot快速上手 环境准备: Java8及以上 Maven3.5 https://docs.spring.io/spring-boot/docs/2.7.14/reference/html/getting-started.html#getting-started SpringBoot 2.x 最新版 开发工具: IDEA 2022 2.1 开发第一个SpringBoot应用程序 …

什么是土壤墒情检测站?它在农业生产中有什么作用?

土壤墒情检测站是一种专门用于监测土壤水分状况和土壤水力性质的设备。它由多个传感器和数据采集单元组成,能够实时监测土壤中的水分含量、土壤温度等参数,并收集和记录相关的数据,提供土壤墒情(即土壤水分状态)的详细…

|行业洞察·趋势报告|《2024旅游度假市场简析报告-17页》

报告的主要内容解读: 居民收入提高推动旅游业发展:报告指出,随着人均GDP的提升,居民的消费能力增强,旅游需求从传统的观光游向休闲、度假游转变,国内人均旅游消费持续增加。 政府政策促进旅游市场复苏&…

代码随想录——移除元素(Leetcode27)

题目链接 暴力&#xff1a;&#xff08;没有改变元素相对位置&#xff09; class Solution {public int removeElement(int[] nums, int val) {int len nums.length;for(int i 0; i < len; i){if(nums[i] val){for(int j i 1; j < len; j){nums[j-1] nums[j];}i…

C#自定义最大化、最小化和关闭按钮

目录 1.资源文件 2.读取资源文件中的图片 3.WindowState属性 4. 示例 用户在制作应用程序时&#xff0c;为了使用户界面更加美观&#xff0c;一般都自己设计窗体的外观&#xff0c;以及窗体的最大化、最小化和关闭按钮。本例通过资源文件来存储窗体的外观&#xff0c;以及最…

【设计模式】中介者模式的应用

文章目录 1.概述2.中介者模式的适用场景2.1.用户界面事件2.2.分布式架构多模块通信 3.总结 1.概述 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;它用于解决对象间复杂、过度耦合的问题。当多个对象&#xff08;一般是两个以上的对象&…

腾讯云邮件推送功能有哪些?如何有效使用?

腾讯云邮件推送如何设置&#xff1f;怎么用邮件推送做高效营销&#xff1f; 腾讯云作为业界领先的云服务提供商&#xff0c;其邮件推送功能在便捷性、稳定性和安全性上都有着出色的表现。那么&#xff0c;腾讯云邮件推送功能究竟有哪些呢&#xff1f;让AokSend来探个究竟。 腾…

map与set容器常见操作详解(含示例代码及注意事项)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

类与对象中C++

加油&#xff01;&#xff01;&#xff01; 文章目录 前言 一、类的6个默认成员函数 ​编辑 二、构造函数 1.概念 三、析构函数 1.概念 2.特性 四、拷贝构造函数 1.概念 2.特征 拷贝构造函数典型调用场景 五、赋值运算符重载 1.运算符重载 2.赋值运算符重载 赋值运算符重载格式…

【Qt】:坐标

坐标 一.常用快捷键二.使用帮助文档三.Qt坐标体系1.理论2.代码 一.常用快捷键 注释&#xff1a;ctrl / • 运⾏&#xff1a;ctrl R • 编译&#xff1a;ctrl B • 字体缩放&#xff1a;ctrl ⿏标滑轮 • 查找&#xff1a;ctrl F 比特就业课 • 整⾏移动&#xff1a;ctrl …

【Linux】体验一款开源的Linux服务器运维管理工具

今天为大家介绍一款开源的 Linux 服务器运维管理工具 - 1panel。 一、安装 根据官方那个提供的在线文档&#xff0c;这款工具的安装需要执行在线安装&#xff0c; # Redhat / CentOScurl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start…

.NET CORE使用Redis分布式锁续命(续期)问题

结合上一期 .NET CORE 分布式事务(三) DTM实现Saga及高并发下的解决方案(.NET CORE 分布式事务(三) DTM实现Saga及高并发下的解决方案-CSDN博客)。有的小伙伴私信说如果锁内锁定的程序或者资源未在上锁时间内执行完&#xff0c;造成的使用资源冲突&#xff0c;需要如何解决。本…

原创度检测工具分享,文章质量检测方便又简单

文章检测有利于我们了解文章内容的质量高低&#xff0c;而在以往我们检测文章只能依靠手动去检测&#xff0c;这是相当消耗工作时间的&#xff0c;但是在原创度检测工具出来之后&#xff0c;很多人开始检测文章质量就改用原创度检测工具了&#xff0c;因为使用原创度检测工具是…

ES学习日记(三)-------第三方插件选择

前言 在学习和使用Elasticsearch的过程中&#xff0c;必不可少需要通过一些工具查看es的运行状态以及数据。如果都是通过rest请求&#xff0c;未免太过麻烦&#xff0c;而且也不够人性化。 目前我了解的比较主流的插件就三个,head,cerebor和elasticHD 1.head 老牌插件,功能…

vant checkbox 复选框 样式改写

修改前 修改后 基于 vant&#xff1a; 4.8.3 unocss: 0.53.4 <van-checkbox-group v-model"query.zczb" shape"square" class"text-16 w-100% flex flex-wrap"><template v-for"item in registerCapitalOption"><v…

伪原创文章生成软件:自媒体文章写作好神器

自媒体的红利时代&#xff0c;许多人都纷纷参于其中&#xff0c;而文章写作是做自媒体的基本技能&#xff0c;但是随着技术的发展&#xff0c;如今&#xff0c;既使不会写作能力一样可以做起自媒体&#xff0c;方法就是利用伪原创文章生成软件来做内容的输出&#xff0c;其实伪…

PowerBI和Tableau之间该怎么选择?

最近经常看到朋友询问&#xff0c;最近想学习数据分析工具&#xff0c;但是PowerBI和Tableau之间不知道怎么选择? 其实可以从下面几个方面进行参考&#xff0c;Power BI和Tableau哪个更适合你&#xff1f; 共同点&#xff1a; Power BI和Tableau都是强大的数据分析和数据可…

Node爬虫:原理简介

在数字化时代&#xff0c;网络爬虫作为一种自动化收集和分析网络数据的技术&#xff0c;得到了广泛的应用。Node.js&#xff0c;以其异步I/O模型和事件驱动的特性&#xff0c;成为实现高效爬虫的理想选择。然而&#xff0c;爬虫在收集数据时&#xff0c;往往面临着诸如反爬虫机…

QML通过鼠标拖动的位置

当通过鼠标拖动Rectangle 的位置时&#xff0c;可以使用Qt Quick的MouseArea组件来实现 Rectangle {id: rectx:0;y:0width: 200; height: 100color: "lightblue"MouseArea {id: mouseAreaanchors.fill: parentdrag.target: rect//要拖动的项目的IDdrag.axis: Drag.XA…
最新文章