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.hqwc.cn/news/578271.html

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

相关文章

word双栏排版插入单栏图片

一、首先将光标移动到在要插入图片的位置,如图1 二、选择布局->分隔符->连续,如图2 三、选择布局->栏->更多栏 ,如图三,选择一栏,插入点之后 四、插入图片和文字 五、在图片后重复第三步操作,…

iOS开发之SwiftUI

iOS开发之SwiftUI 在iOS开发中SwiftUI与Objective-C和Swift不同,它采用了声明式语法,相对而言SwiftUI声明式语法简化了界面开发过程,减少了代码量。 由于SwiftUI是Apple推出的界面开发框架,从iOS13开始引入,Apple使用…

linux centos7.9 weblogic14c java1.8.401 安装部署流程

一、获取安装包: Java1.8.401:Java Downloads | Oracle weblogic 14c:https://download.oracle.com/otn/nt/middleware/14c/14110/fmw_14.1.1.0.0_wls_lite_Disk1_1of1.zip 选generic版本 二、将安装包传到Linux服务器上 方法不限&#xf…

基于STC12C5A60S2系列1T 8051单片机通过单个按键单击次数实现开关机应用

基于STC12C5A60S2系列1T 8051单片机通过单个按键单击次数实现开关机应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍基于STC12C5A60S2系列1T 8051单片机通过单个按…

【python plotly库介绍】从视觉到洞见:桑基图在业务分析中的应用【保姆级教程过于详细珍藏版】

👤作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 本文结构:工具介绍python实现库 - 案例 - 分析思路与过程 实战专栏:https://blog.csdn.net/cciehl/category_12615648.html 备注说明: 企业…

《剑指 Offer》专项突破版 - 面试题 95、96 和 97 : 和动态规划相关的双序列问题(C++ 实现)

目录 前言 面试题 95 : 最长公共子序列 面试题 96 : 字符串交织 面试题 97 : 子序列的数目 前言 和单序列问题不同,双序列问题的输入有两个或更多的序列,通常是两个字符串或数组。由于输入是两个序列,因此状态转移方程通常有两个参数&am…

QT资源添加调用

添加资源文件&#xff0c;新建资源文件夹&#xff0c;命名resource&#xff0c;然后点下一步&#xff0c;点完成 资源&#xff0c;右键add Prefix 添加现有文件 展示的label图片切换 QLabel *led_show; #include "mainwindow.h" #include<QLabel> #include&l…

Java八股文(高并发,分布式,JUC)

Java八股文の高并发&#xff0c;分布式&#xff0c;JUC 高并发&#xff0c;分布式&#xff0c;JUC 高并发&#xff0c;分布式&#xff0c;JUC 对于高并发的系统&#xff0c;为了提高用户的体验&#xff0c;你是如何做的&#xff1f;或者说高并发的技巧你用过哪些&#xff1f; …

Unity-通过AB包使用SpriteAtlas图集(基于unity2018)

项目遇到了一个性能问题&#xff0c;需要优化UI。其中就涉及UI的合批问题&#xff0c;其中自然而然就会关联到图集的概念。旧版图集&#xff0c;Legacy Atlas&#xff0c;还没有太研究。今天主要看一下SpriteAtlas怎么使用的。 因为我们项目资源工程和Runtime是分离的&#xf…

56、FreeRTOS/GPIO与定时器相关学习20240329

一、代码实现控制开发板上的指示灯闪烁。 /* USER CODE BEGIN 0 */ //利用定时器机制 定时器溢出时对应的回调函数实现如下 //本次实现控制PB0&#xff0c;PB1两个灯 int flag1 0,flag2 0;//使用一个标记执行以下代码 会造成一个灯常亮 另一个常灭 void HAL_TIM_PeriodElaps…

openPLC_Editor C语言编程 在mp157 arm板上调用io等使用记录

1.编程界面比较简单&#xff0c;具备PLC开发编程的四种编程方式。梯形图语言LD &#xff0c;指令表语言IL&#xff0c;结构化文本语言ST&#xff0c;功能模块图语言FBD。 2.官方使用手册。学习资料实在是太少&#xff0c;目前都是自己比较费劲的研究。 3.2 Creating Your First…

智能人像重绘解决方案如何部署

企业对于视觉呈现的需求日益增强&#xff0c;特别是在人像处理方面&#xff0c;精准、自然、高效的解决方案成为了市场的迫切需求。美摄科技&#xff0c;凭借自研AI技术大模型&#xff0c;推出全新人像重绘解决方案&#xff0c;致力于为企业提供一站式人像美化服务&#xff0c;…