TCP协议报头详解

2024-06-15 20:28
文章标签 详解 协议 报头 tcp

本文主要是介绍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报头的全部理解。有什么问题和疑问欢迎在评论区讨论,或者私信我呀。后面还有出拥塞控制、三次握手和四次挥手相关的文章,关注可以第一时间看到呀。

感谢阅读

这篇关于TCP协议报头详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064491

相关文章

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

Python装饰器之类装饰器详解

《Python装饰器之类装饰器详解》本文将详细介绍Python中类装饰器的概念、使用方法以及应用场景,并通过一个综合详细的例子展示如何使用类装饰器,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. 引言2. 装饰器的基本概念2.1. 函数装饰器复习2.2 类装饰器的定义和使用3. 类装饰

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技