【网络原理篇2】TCP报头详解

news2025/6/8 11:26:04

       在这一篇文章当中,了解到TCP是属于传输层的协议;当数据从应用层向传输层发送的时候,如果使用的是TCP协议,那么就需要把应用层的数据加上TCP报头初识网络:IP、端口、网络协议、TCP-IP五层模型_革凡成圣211的博客-CSDN博客TCP/IP五层协议详解https://blog.csdn.net/weixin_56738054/article/details/128666970?spm=1001.2014.3001.5501

目录

  TCP报头的大致结构

4位首部长度(4个比特位):记录的是TCP报头的大小

 保留位(6位)

     为什么要有保留位

16位校验和   

32位序号&32位确认序号

TCP实现可靠性的方式:

方式一:确认应答机制

       存在问题分析:后发先制 

      存在问题原因

      解决后发先制问题的方案

      如何判断一个报文是否为应答报文

TCP的面向字节流特性在上述传输过程当中的体现

TCP实现可靠性的方式二:TCP超时重传问题

TCP时间阈值

超时重传存在问题分析

去重操作


  TCP报头的大致结构

 TCP报文=TCP报头(首部长度)+TCP载荷 

 下面,将重点了解一下TCP报头的各个属性


4位首部长度(4个比特位):记录的是TCP报头的大小

特点1:TCP报头的长度是可变的。不像UDP报头,大小为8个字节,长度不可变。变化的地方就是[选项长度]

特点2:4位首部长度,记录的是整个TCP报头的长度首部长度的值-20得到的就是选项部分的长度,单位为字节

一个字节的大小为8个比特位。那么,4个bit位范围为:(0,15)。

需要注意的是:此处的首部长度,单位是(4字节)


       如果首部长度显示的值为5,那么说明:此时TCP报头的实际大小为:5*4=20(字节),也就意味着,此时选项部分的长度为20-20=0字节,相当于没有字节数。

       如果首部长度显示的值为15,那么说明,此时TCP报头的实际大小为:15*4=60(字节),也就意味着,此时选项部分的长度为60-20=40字节


 保留位(6位)

     为什么要有保留位

       如果后续TCP引入了一些新的功能,就可以使用保留位字段。

       如果引入了保留位,那么对于TCP原来的报头结构的影响就是比较小的,方便各个TCP版本之间的兼容。


16位校验和   

       此处TCP头部的的校验和与UDP头部的校验和效果类似,都是用于校验结果传输结果是否正确是一种方式。具体是怎样的,参考上一篇文章。


32位序号&32位确认序号

       这两个属性,和TCP协议的可靠性有关系。

       回顾一下:TCP协议的四个特点

       第一个:有连接;第二个:可靠传输;第三个:面向字节流;第四个:全双工。 下面,将重点讨论一下可靠性

       可靠性的含义:并不是发送方把所有的内容都发送给了接收方。

        不管有没有传输过去,作为发送方都可以知道传输过去与否。


TCP实现可靠性的方式:

方式一:确认应答机制

       有下面一个场景:

       小明给小红发送了一条消息:今天晚上吃什么?然后小红回应:今天晚上我想吃鱼

       当小红回复小明的时候,这个回复的内容,就被称为"应答报文"(acknowledge)。让小明知道小红回复他了。


       以上场景比较单一,也就是客户端发送一条消息,服务端就回应一次。

       那么,如果有这样的一个场景呢?

       小明先后连续对小红发了两句话:

        小明:小红,你今天晚上吃什么呀?......发送顺序①

        小明:小红,你穿的真漂亮呀!......发送顺序②

        按照常理,小红应该这样回应:

        小红:我今天晚上想吃鱼;......回应顺序①

        小红:谢谢你的夸奖!......回应顺序②


       存在问题分析:后发先制 

        比较迟发送的消息,优先于先发送的消息到达接收方。

        回到上面的场景,就变成这样了:

       可以看到,在小明接收会话①的时候,也就是时间t5的时候,接到了小红后面发送的消息。

       按照常理,小红首先作出的回应①,应当在时间t5被小明接收,可是小明却在时间t6才接收到。


      存在问题原因

       两个主机之间,路线存在多条。数据报1和数据报2走的都是不同的路线,有的路线传输数据快,有的数据传输慢,情况是不可预期的。因此很有可能发生后发先制的


      解决后发先制问题的方案

      针对发送/回应的报文进行编号。

      作为主动发送报文的一方,报文当中应当明确发文的序号。

      作为反馈发送报文的一方,报文当中应当明确反馈给谁,也就是反馈报文当中需要指定此反馈的报文是针对哪一条主动发送的报文发送的。

        小明:

        小明:(发送①号报文)小红,你今天晚上吃什么呀?

        小明:(发送②号报文)小红,你穿的真漂亮呀!

        小红:

        小红:(针对①号报文):我想吃鱼

        小红:(针对②号报文):谢谢!

      

如上图,黑色框圈住的"针对①号","针对②号",就是反馈的对象。

再看一下TCP报头结构:

       如果此报文为主动发送的一方(小明)发出主动报文,那么它的"32位确认序号"就为空。

       如果此报文为被动接收的一方(小红)发出的回应报文,那么"32位确认号"就为发送方的最大字节序号+1(下面会提到)

        这样,也就实现了TCP的可靠性传输,也就是确认应答机制


      如何判断一个报文是否为应答报文

       再看一下上面的TCP报头,可以看到,6位保留位的右侧有几列内容,其中有一列就是ack

       当ack这个标志位为1的时候,说明这个报文是一个应答报文。如果为0就不是应答报文了。


TCP的面向字节流特性在上述传输过程当中的体现

TCP是面向字节流的形式进行传输的,并不是按照一条/两条这样的字符串格式进行传输的。

那么,在一次TCP会话当中,如何体现出TCP面向字节流的形式呢?

      TCP的数据报编号,是按照字节的方式来进行编号的。

      A给B发送一个字符串,这个字符串是由1000个字节构成的。

      TCP报头就只记录当前第一个字节的序号,假设第一个字节的序号为1

      那么,此时主机(A)发送的TCP报头当中记录的序号就为1,

       当主机(A)把数据发送到主机(B)上面的时候,主机(B)的应答报文当中的32位确认序号,应当填写的是1001

       关于主机(A)当中填写的32位序号为什么不是1,会在接下来的文章当中提到。


       当主机(A)再次发送其他数据的时候,就是从1001开始发送了,就是在刚才的1000的基础上面+1。

       所表示的含义:<1001的数据都收到了,A接下来应当从1001这个序号开始继续发送

 下图来源于网络,侵权删


TCP实现可靠性的方式二:TCP超时重传问题

 上面我们讨论确认应答的时候,其实是建立在了顺利传输的基础上面的。

 那么,下面,就需要讨论一下丢包的情况。

 什么是丢包呢?也就是发送的数据,没有得到对应的回应,这就是丢包。

 丢包,涉及两种情况:

 情况1:发送方把TCP报文发出去了,但是接收方没有接收到。

 情况2:发送方等待接收方返回报文的时候,返回的ack报文丢失了,接收方无法收到ack报文。

      总而言之,就是发送方看不到结果,没有收到ack,这两种情况会一视同仁,都认为是丢包了。

       因此,如果重新发送一下这个数据报,其实还是有很大的概论传输成功的,也就是在丢包的情况下,再次重新发送一次。


TCP时间阈值

       TCP直接引入了一个时间阈值。从发送方发出了一个数据之后,开始计时。如果在阈值的时间范围内没有得到对应的ack回应,那么就会再次发送一次,这个就是超时重传机制。

       关于这一个阈值究竟是多少,这个不太确定,不同的系统有不同的阈值。


超时重传存在问题分析

       对于超时重传机制,看似没有什么问题。但是,很有可能让接收方接收到两次数据。

       也就是,发送方由于在阈值时间内没有收到ack,于是再次发送了一次。但是实际上主机B已经收到了。

图片来源于网络,侵权删除

 

       这是一个支付的场景,当按下支付的按钮之后,系统自动从账户余额当中扣款1000,假

设此时设定的阈值为5ms。但是在5ms内,没有收到扣款成功的ack报文,于是再次发送扣款

1000的命令。这样,也就造成了多扣1000的尴尬情况。


去重操作 

       TCP对于重复发送的数据,是有一个特殊处理的方式,也就是去重。

       TCP存在一个"接收缓冲区"这样的存储空间。(这个缓冲区是在接收方的操作系统内核当中的一段内存)

       当主机B收到了主机A的数据之后,其实就是B的网卡读到了这一个数据,然后把这一个数据存放到B的缓冲区(这一个缓冲区相当于一个阻塞队列)当中。

       后续B主机使用getInputStream来read的时候,就是从接收缓冲区当中读取了。

       此时,读取的时候,会根据数据的编号,来判断当前接收缓冲区当中的两条数据是否是重复的。如果重复,那么新的数据就会被丢弃。

          这样,应用程序调用read读取到的数据就是不重复的了。

 

       关于这个缓冲区,还有一点需要补充的,就是:

       TCP使用这个接收缓冲区,会对于收到的数据进行重新排序,使得应用程序跟收到(read)

的顺序跟发送的顺序一致。它就是根据收到的TCP报文序号进行排序,如果序号一致,那么

就去重。其中,B主机的缓冲区是一个优先级的阻塞队列,这个优先级就是TCP的序号

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年去培训机构学前端还是Java?

选择专业肯定是优先考虑更有发展前景和钱途的专业。毕竟IT专业的培训费都不低&#xff0c;基本都要一两万左右&#xff0c;咱们花钱总是希望获得最大回报。 那么到底哪个更有发展前景呢&#xff1f; 零基础能学得会吗&#xff1f; 就业薪资如何呢&#xff1f; 前言 不知道大家有…

Python运算符优先级

以下表格列出了从最高到最低优先级的所有运算符&#xff1a;运算符描述**指数 (最高优先级)~ -按位翻转, 一元加号和减号 (最后两个的方法名为 和 -)* / % //乘&#xff0c;除&#xff0c;取模和取整除 -加法减法>> <<右移&#xff0c;左移运算符&位 AND^ |位…

pyqt5:python读取二进制文件(音频PCM文件)显示波形

文章目录1.使用ffmpeg生成PCM文件1.1 用 ffprobe 查看文件信息1.2 用 ffmpeg 命令转换1.3 用ffplay 测试播放PCM文件2.python读取PCM文件显示波形2.1 函数numpy.fromfile2.2 数据类型dtype说明3.源码和PCM文件链接有个项目需要输出10-50Hz的低频信号驱动线圈&#xff0c;考虑使…

canal 使用详解

第1章 Canal 简介canal [kənl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费工作原理canal 模拟 MySQL slave 的交互协议&#xff0c;伪装自己为 MySQL slave &#xff0c;向 MySQL master 发送 d…

[架构之路-104]:《软件架构设计:程序员向架构师转型必备》-14-根据需求用例驱动进行软件架构的模块划分过程

14 用例驱动的模块划分过程描述用例的两种方式&#xff1a;图形描述&#xff1a;用例序列图&#xff0c;直观&#xff0c;但修改不方便&#xff0c;版本控制不方便。文本描述&#xff1a;用例规约描述&#xff0c;不直观&#xff0c;但修改方便&#xff0c;版本控制方便。14.1 …

轻松使用 Python 检测和识别车牌(附代码)

车牌检测与识别技术用途广泛&#xff0c;可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计算机视觉和人工智能。 本文将使用Python创建一个车牌检测和识别程序。该程序对输入图像进行处理&#xff0c;检测和识别车牌&#xff0c;最后显示车牌字符&#xff0c;作为…

AWS实战:Dynamodb到Redshift数据同步

AWS Dynamodb简介 Amazon DynamoDB 是一种完全托管式、无服务器的 NoSQL 键值数据库&#xff0c;旨在运行任何规模的高性能应用程序。DynamoDB能在任何规模下实现不到10毫秒级的一致响应&#xff0c;并且它的存储空间无限&#xff0c;可在任何规模提供可靠的性能。DynamoDB 提…

Linux破解root密码

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Linux操作…

Postgresql中不支持事务块中调用plpgsql回滚(多层exception、事务块有检查点)

前言 Postgresql使用子事务来实现EXCEPTION的功能&#xff0c;即在进入EXCEPTION的存储过程前&#xff0c;会自动起一个子事务&#xff0c;如果发生了异常&#xff0c;则自动回滚子事务&#xff0c;达成EXCEPTION的效果。那么如果在事务块内本身就带子事务&#xff08;SAVEPOI…

Python文件操作-代码案例

文章目录文件打开文件open写文件上下文管理器第三方库简单应用案例使用python生成二维码使用python操作excel程序员鼓励师学生管理系统文件 变量就在内存中,文件在硬盘中. 内存空间更小,访问速度快,成本贵,数据容易丢失,硬盘空间大,访问慢,偏移,持久化存储. \\在才是 \的含义…

十分钟上手把玩树莓派——系统创建指南

无意中发现一个落灰的树莓派 故事便开始了…… 准备工作 树莓派 3B一张大于 8G 的 micro SD 卡一个读卡器HDMI 显示器及连接线、键盘、鼠标等外围设备 系统镜像下载 推荐两个树莓派镜像下载网站 树莓派官方网站&#xff1a;https://www.raspberrypi.com/software/树莓派实…

“赶快回家网”首页制作

“赶快回家网”首页制作一、实验名称&#xff1a;二、实验日期&#xff1a;三、实验目的&#xff1a;四、实验内容&#xff1a;五、实验步骤&#xff1a;六、实验结果&#xff1a;七、源程序&#xff1a;八、心得体会&#xff1a;一、实验名称&#xff1a; “赶快回家网”首页…

使用Jmeter抓取手机APP报文并进行APP接口测试

Jmeter是一个比较常用的接口测试工具&#xff0c;尤其是接口性能测试。当然它也可以用来测试手机APP的HTTP接口&#xff0c;我在Fiddler抓取手机APP报文 和 接口测试代理工具charles mock测试 分别介绍了Fiddler和charles 如何抓取APP报文&#xff0c;本文介绍使用Jmeter来抓取…

第六章 关系数据理论(规范化详解)

第六章 关系数据理论 6.1 问题的提出 本章主要讨论关系数据理论。在讨论数据库的时候&#xff0c;绕不开的一个问题是&#xff1a;针对一个具体问题&#xff0c;应该如何构建一个适合他的数据库模式。这是数据库设计的问题&#xff0c;确切地讲是关系数据库逻辑设计的问题。为…

python最新采集某站美女,还不快学起来,下载可能下架视频

前言 大家早好、午好、晚好吖 ❤ ~ 这个页面大家认识吧~ 喜欢看吧 那我们今天就来采集一下它呀~ 开发环境: 版 本: python 3.8 编辑器: pycharm 2022.3.2 专业版 requests >>> pip install requests ffmpeg 音视频合成软件 如果安装python第三方模块: win R 输…

民用建筑电力系统运行和节能中的应用——电力监控系统篇

【摘要】本文中概述电力监控系统结构和作用&#xff0c;通过列举工程实例&#xff0c;详细介绍了电力监控系统在民用建筑电力系统运行和节能中的应用&#xff0c;以及在推广和发展方面需要改进的问题。 【关键词】民用建筑&#xff1b;电力监控系统&#xff1b;运行和节能中的…

cmd常用的操作命令

使用windows系统&#xff0c;通常在cmd中输入指令&#xff0c;会调用相应的一些程序或者执行一些功能&#xff0c;学会使用CMD中的命令&#xff0c;可以加快我们一些操作&#xff0c;省时省力。 ipconfig ------查询IP地址 gpedit.msc-----组策略 sndrec32-------录音机 Nsloo…

小程序自动化测试框架【Minium】系列(三)元素定位详解

元素定位 元素定位&#xff0c;应该是很多UI自动化测试入门学习必会的技能了&#xff0c;下面我将为大家举例演示元素定位的几种方法。 1、CSS选择器 Minium 可以通过 WXSS 选择器定位元素&#xff0c;如下图所示&#xff1a; 如果有[CSS选择器]基础会上手更快 &#xff0c;如…

Maven知识点-插件-maven-surefire-plugin简介

Maven本身并不是一个单元测试框架&#xff0c;Java 世界中主流的单元测试框架为JUnit 和TestNG。 Maven 所做的只是在构建执行到特定生命周期阶段的时候&#xff0c;通过插件来执行JUnit或者TestNG的测试用例。 这一插件就是maven-surefire-plugin&#xff0c;可以称之为测试…

Docker安装ElasticSearch,并进行ik和hanlp分词

我按装的目标: 利用ElastiSearch存储数据&#xff0c;ik和hanlp分词插件 对 搜索词进行分词&#xff0c;在ES存储的库中找到与搜索词相近的内容。 安装感受: 原始环境安装老版本的ES&#xff0c;BUG不断&#xff0c;ES相关解答博客对新手有点不友好&#xff0c;完整的解释不多&…