TCP协议报头详解

目录

前言

TCP特点

TCP报头

1.源端口和目的端口

2.序号

3.确认号

4.数据偏移

5.保留

6.控制位

        ① 紧急URG(URGent)

        ② 确认ACK(ACKnowledgment)

        ③ 推送PSH(PuSH)

        ④复位RST(ReSeT)

        ⑤ 同步SYN(SYNchronization)

        ⑥ 终止FIN(FINish)

7.窗口

8.检验和

9.紧急指针

10.选项

参考

共勉


前言

        总结了一下TCP报头中各个字段的作用,希望可以帮到你呀。


TCP特点

        面向连接:在使用TCP协议进行通讯时,必须先进行TCP连接,传送数据完毕后,必须释放用于传输数据的TCP连接。

        可靠性:通过TCP连接传送的数据,无差错、不丢失、不重复、并且按需到达。

        面向字节流:TCP中的“流(stream)”指的是流入到进程火铳进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。

        全双工通信:TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存。


TCP报头

1.源端口和目的端口

        各占两个字节,分别写入源端口号和目的端口号。


2.序号

        占4字节,序号范围是[0, 2^32 - 1],共2^32(4294 967 296)个序号。序号增加到2^32 - 1后,下一个序号又会回到0。在一个TCP连接中传送的每个字节流中的每个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的抵押给字节的序号。例如,一报文段的序号字段是301,则携带的数据共有100字节。下一个报文段(如果存在)的数据序号以当从301开始,即下一个报文段的序号字段应为401。这个字段的名称也叫做“报文段序号”。


3.确认号

        占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700),着表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。

若确认号 = N,则表明:到序号N - 1为止的所有数据都已正确收到


4.数据偏移

        占4位,它指出TCP报文段的首部长度的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是有必要的。但应注意,“数据偏移”的单位是32位字(即4字节的字位计算单位)。由于4位二进制数能够表示的最大十进制数字位15,因此数据偏移的最大值位60字节,这也是TCP首部的最大长度(即选项长度不能超过40字节)。


5.保留

        占6位,保留为今后使用,目前应该置为0。


6.控制位

        总共六位,每位说明一个性质,6位一起说明本报文段的性质。

        ① 紧急URG(URGent)

                当URG置为1时,表明紧急指针字段有效。它告诉系统此报文段中由紧急数据,应尽快传送(相当于高优先级的数据),而不是按照原来的排队顺序传送,紧急数据后面的数据仍然是普通数据。

        ② 确认ACK(ACKnowledgment)

                仅当ACK=1时,确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1。

        ③ 推送PSH(PuSH)

                当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。这种情况下,TCP就可以使用推送操作。这时,发送方TCP把PSH置1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地交付为应用进程,而不再等到整个缓存都填满了后再向上交付。

        ④复位RST(ReSeT)

                当RST=1时,表明TCP连接中出现严重差错(如主机崩溃),必须释放连接,然后再重新建立连接。将RST置为1还用来拒绝一个非法报文段或拒绝打开一个连接。RST也称为重置位。

        ⑤ 同步SYN(SYNchronization)

                在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应当响应的报文段中使用SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或者同意连接报文。

        ⑥ 终止FIN(FINish)

                用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。


7.窗口

        占2字节。窗口值是[0, 2^16 - 1]之间的整数。窗口指的是发送本报文段的一方接收窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。

窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化着。

8.检验和

        占2字节,检验和字段检验的范围包括首部和数据这两部分。

9.紧急指针

        占2字节,紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就高数应用程序恢复到正常操作 。注意:即使窗口为零时也可发送紧急数据。

10.选项

        长度可变,最长40字节。填充字段仅仅是为了使整个TCP首部长度是4字节的整数倍。
 


参考

        《计算机网络》第八版 谢希仁编著 

        RFC 793

共勉

        以上就是我对TCP报头的全部理解。有什么问题和疑问欢迎在评论区讨论,或者私信我呀。后面还有出拥塞控制、三次握手和四次挥手相关的文章,关注可以第一时间看到呀。

感谢阅读

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

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

相关文章

【二】【动态规划NEW】91. 解码方法,62. 不同路径,63. 不同路径 II

91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : ‘A’ -> “1” ‘B’ -> “2” … ‘Z’ -> “26” 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法&#xff…

AI Vs 作家?Groqbook: AI写书神器,使用 Groq 和 Llama3 几秒生成一本完整的书籍!

✨点击这里✨:🚀原文链接:(更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号!) AI Vs 作家?Groqbook: AI写书神器,使用 Groq 和 Llama3 几秒生成一本完整的…

awtk如何实现键盘和输入框

1.创建默认键盘 新建窗体-keyboard 2.新建编辑框 3.设置编辑框属性 4.点击编辑框即可打开默认键盘,若想修改键盘样式可以在默认键盘修改或自定义键盘 5.获取输入字符 widget_t* wifi_edit widget_lookup(win, "edit", TRUE);//获取单行编辑控件 widge…

python简单练习案例-石头剪刀布小游戏

🌈所属专栏:【python】 ✨作者主页: Mr.Zwq ✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询!…

在 Windows 环境下安装mysql步骤(MySQL)

文章目录 一、下载 MySQL二、解压安装包到磁盘三、配置环境(管理员权限)四、安装 MySQL(管理员权限) 一、下载 MySQL 如下图:为你的电脑下载对应操作系统的 MySQL 安装包 二、解压安装包到磁盘 三、配置环境&#x…

sprintboot容器功能

容器 容器功能Spring注入组件的注解Component,Controller,Service,Repository案例演示 Configuration应用实例传统方式使用Configuration 注意事项和细节 Import应用实例 ConditionalConditional介绍应用实例 ImportResource应用实例 配置绑定…

金融科技:推动保险行业数字化转型的引擎

随着科技的飞速发展,金融科技(FinTech)已经成为推动金融行业变革的重要力量。特别是在保险行业,金融科技正引领着一场深刻的数字化转型,为保险公司带来了前所未有的机遇与挑战。本文将探讨金融科技如何推动保险行业的数…

redis设计与实现(五)RDB与AOF持久化

RDB持久化 因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。 为了解决这个问题,…

Go TOKEN机制与跨域处理方式

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

java学习 项目篇 一

学习地址:https://www.bilibili.com/video/BV1TP411v7v6?p6&spm_id_frompageDriver&vd_sourcea6f7db332f104aff6fadf5b3542e5875 后端环境搭建 Entity 实体,通常和数据库的表对应DTO 数据传输对象,用于程序中各层之间传递数据 (前端…

Windows安装配置CUDA12.5

搞大模型往往都需要GPU加速,本次在家里的PC上安装CUDA来实现GPU加速。 一、环境准备 操作系统:Windows11 23H2 GPU:RTX 4070 Ti Super 显卡驱动:555.99 (NVIDIA GeForce 驱动程序 - N 卡驱动 | NVIDIA) …

LaDM3IL:多实例学习用于免疫库分类

一个人的免疫组库由某一时间点的大量适应性免疫受体组成,代表了该个体的适应性免疫状态。免疫组库分类和相关受体识别有可能为新型疫苗的开发做出贡献。大量的实例对免疫组库分类提出了挑战,这可以表述为大规模多实例学习 (MMIL,Massive Mult…

C#——只读属性readonly

只读属性readonly 类的字段可以通过一个readonly(只读)表示这个为只读字段,不能被构造函数之外地方进行修改,静态只读字段不能在非静态的构造函数中使用 定义 只读属性的特点: 字段是只读的非静态 只能在非静态方法中进行修改 字段是只读的…

QT小技巧

QT小技巧 滑条的美化 美化前 代码如下 //滑条的美化ui->horizontalSlider->setStyleSheet("QSlider::groove:horizontal {""border:1px solid skyblue;""background-color:skyblue;""height:10px;""border-radius:5px…

勒索病毒剖析

2016年不自己勒索了 卖病毒 让别人勒索 傻瓜式勒索 黑客用的是非对称加密 全世界只有黑客有那把私钥 反向解密不了 传统爆破容易被检测,黑客慢速爆破,利用超级多的僵尸进行试错,慢慢试出来账号密码 因为一般运维设备在防火墙的白名单里&…

SSM 基于大数据技术的创业推荐系统-计算机毕业设计源码02979

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作…

IS022000认证:食品安全管理的金标准

食品安全是食品行业的命脉,IS022000食品安全管理体系认证作为最权威的认证之一,为企业提供了强有力的保障。要理解IS022000认证的意义,我们需要先了解它与HACCP和IS09001认证的关系。 HACCP(Hazard Analysis and Critical Control…

【Webpack】使用 Webpack 构建 Vue3+TS 项目

构建项目目录 tsc --init npm init -yshim.d.ts 文件是一个类型声明文件,用于告诉 TypeScript 编译器如何处理 Vue 的单文件组件(SFC)和其他自定义模块。为 Vue 的单文件组件和其他非 TypeScript 模块提供类型信息,以便在 TypeScr…

Redis的安装(linux、docker)与其基本的api使用

一、Redis简介 Redis是一个开源的,使用 C 编写,高性能的Key-Value的NoSQL数据库。 SQL :关系型数据库,例如:MySQL,Oracle等等NoSQL :Not Only SQL 不仅仅是SQL,表示是非关系型数据库…

java之mybatis笔记

1 项目创建 1.1 maven设置 1.2 创建项目文件 1.3 配置MyBatis的相关依赖 1.4 配置 MyBatis 创建一个 mybatis-config.xml 配置文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org…