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

2023-11-15

       在这一篇文章当中,了解到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这个序号开始继续发送

 下图来源于网络,侵权删

接收方回复发送方的32位确认序号有两个含义:

含义1:<确认序号的数据都已经被发送方收到了;

含义2:下次发送方发送的序号需要从当前确认序号开始。


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的序号


快速重传

            快速重传可以避免了超时重传的需要等待的问题。

            如果发送方发送的某一次syn报文出现了丢包;

       作为接收方,它对于发送方的恢复:只会反复应答丢包那一次的数据。

       快速重传的工作方式是:发送方当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的syn报文段


TCP和UDP的一些区别(横向对比) 

一、和连接相关

跟连接相关的,TCP是有连接的协议,而UDP是无连接的协议。

TCP的有连接体现在发送方接受方三次握手上面。二者之间要进行通信必须要经过三次握手。


二、服务对象不一样

TCP的通信过程一定是服务端accept之后,再进行数据交互,也就是一条连接上面只有两个端点。

UDP支持一对一、一对多、多对多的交互通信。


三、可靠性相关

TCP可以保证数据无差错、不丢失、不重复、按序到达。

而UDP只是尽最大努力交付数据。

关于TCP的可靠性,主要就是以下几个方面(重要)

确认应答、重传机制(快速重传、超时重传)

流量控制、拥塞控制;

三次握手


四、发送速率控制方面

TCP有流量控制、拥塞控制两种控制速率的方式。

而UDP没有这两种方式,无法控制发送的速率。


五、传输方式的区别

           TCP是面向字节流的协议。没有边界,仅仅只是保证顺序和可靠。一个TCP报头可能包含多个TCP段。因此,TCP会产生粘包问题

          UDP是一个包一个包这样发送的,是有边界的。不会产生粘包问题。


六、分片不同

TCP数据报的大小如果超过了MSS大小,会在传输层进行分片。

UDP数据报的大小如果超过了MTU大小,会在网络层进行分片。


应用场景相关

TCP:由于它是可靠性地传输数据的。因此往往用于可靠性要求比较高的场景:

例如:

FTP文件传输;

HTTP/HTTPS;


 UDP:由于它不需要连接的建立就可以通信,可以随时发送数据,因此常常用于效率要求高的场景

例如:

同一个大型机房内的主机之间的通信;

视频、音频等多媒体通信;

广播通信。


TCP和UDP可以监听(绑定)同一个端口吗 

可以的

根本原因:

TCP和UDP传输协议,在内核当中是由两个完全独立的软件模块实现的。


主要体现:

       当主机收到数据报之后,可以在IP数据报当中查看到各自的传输层协议。然后再把这个数据交给各自的模块来处理。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【网络原理篇2】TCP报头详解 的相关文章

  • 3dsmax模型烘焙光照贴图并导入unity流程详解

    目录 前言 软件环境 前置知识储备 一 模型场景搭建 二 模型材质处理 三 vray渲染准备 四 烘焙至贴图 五 unity场景准备 六 贴图与材质 前言 该流程针对某些固定场景 模型发布 无法使用实时渲染引擎等 情况下的展示 本文记录烘焙
  • SQL Server2012如何更改服务器的名称

    一 事情起因 三层架构有个小问题 总是报各种错误 昨下午花费了半天时间准备把这个问题解决掉 未果 后来尝试了连接东哥的数据库 程序奇迹般的能运行了 东哥推测可能是我SQL Server 2012安装有问题 于是开始了尝试之旅 二 错误描述
  • 网络基础-传输层协议-TCP/UDP

    TCP UDP 谈一谈端口号 为什么会有端口号 端口号划分 一个进程可以bind多个端口号吗 一个端口号可以被多个进程bind吗 UDP 协议格式 udp协议的特点 无连接 不可靠 面向数据报 UDP缓冲区 TCP 协议格式 在这里插入图片
  • version `GLIBC_2.28‘ not found

    启动java jar包报错 报错内容主要是 version GLIBC 2 18 not found 产生原因 由于Linux系统的glibc版本太低 而软件编译时使用了较高版本的glibc引起的 查看glibc版本 这里链接的是2 17的
  • 红帽Red Hat Linux镜像下载

    红帽Red Hat Enterprise Linux镜像下载 官方网站链接 https developers redhat com products rhel download Download 链接 https pan baidu com

随机推荐

  • 梦幻模拟战更新服务器正在维护,《梦幻模拟战》二周年版本更新维护公告

    梦幻模拟战迎来二周年欢庆 海量更新内容即将解锁 新英雄罗泽希尔 克洛泰尔加入战斗 全新秘境限时活动开启 练兵场开放新兵种与科技 指挥官们 新的冒险已经来临 准备好接受挑战了吗 服务器预计将于8月20日1 00 8 00期间进行更新维护 在维
  • 6个非常有用的 CSS 资源网站

    作为一个 Web 设计师 精通 CSS 是绝对必要的而且对于 Web 开发也是必须的 良好的 CSS 编写习惯可以帮助你节省时间 并且能更好地进行网站的后期维护使得运行速度更快 从而节约带宽 下面是6个非常有用的 CSS 资源网站 包括 C
  • 常用bat

    1 net start XXX 用于启动系统服务 XXX 对应 系统服务中的对应的服务名称 启动mysql服务 net start MySQL 启动ORACLE服务 net start OracleServiceORCL net start
  • CRYSTAL-ubuntu-打工人使用手册-log

    个人笔记 将Mp4转换成gif sudo apt get install mplayer 将mp4分解成jpg存储到 img中 mplayer ao null result 2411 mp4 vo jpeg outdir img 将 img
  • Linux基础命令---显示进程树pstree

    pstree pstree显示正在运行的进程的树形结构 树以PID为根 如果省略了pid则以init为根 如果指定了用户名 则显示根植于该用户拥有的进程的所有进程树 如果pstree被调用为pstree x11 那么它将提示行尾的用户按RE
  • 区块链技术通俗讲解_要了解区块链一定要清楚区块链技术的几点技术原理

    关注 区链数科 让你从入门到精通区块链 其实 区块链并不是一个新型的技术 更多的应该是传统技术上的一个融合 再通过一定的规则和机制去实现了区块链独特性质 我们前面主要普及一些关于区块链的基本概念以及市场概况 今天来讲讲区块链的技术原理 希望
  • 使用pandas groupby的一个案例

    mongodb中有下面一组数据 业务场景就不介绍了 看数据应该很好理解 id 606fdd0805f5710008a82223 brand id 1 brand name APPLE series id 11 series name iPh
  • jdbc连接Microsoft SQL Server 2014

    前言 多年不用Microsoft SQL Server 简单回顾一下并记录一下在java中连接SQL Server的过程和注意事项 首先 从下载Driver开始 Microsoft JDBC Drivers 官方的下载地址为 适用于 SQL
  • 一些方便记忆的小例子

    epoll和select的小例子 先看一下epoll和select的区别 对于select来说 所有文件描述符都是在用户态被加入其文件描述符集合的 每次调用都需要将整个集合拷贝到内核态 epoll则将整个文件描述符集合维护在内核态 每次添加
  • Zookeeper缩容5缩3操作记录(二)

    测试目标 测试5台缩3台zk 先shutdown 一台5 再将1 2 3配置修改为1 2 3 逐一重启 是否会发生脑裂 测试过程 准备1 2 3 4 5 五台 3为leader 将5 shutdown 1 将1配置修改为1 2 3 重启 结
  • R语言之 删除重复数据

    这篇主要介绍如何在R中识别和删除重复数据 主要用的到R base和dplyr函数 duplicated 用于识别重复的元素和 unique 用于提取唯一元素 distinct dplyr package 删除数据框中的重复行 x lt c
  • Java:Immutable Patterns

    版权所有 2022 涂聚文有限公司 许可信息查看 描述 不变模式 Immutable Patterns 历史版本 JDK 14 02 2022 09 12 创建者 geovindu 2022 09 12 添加 Lambda 2022 09
  • 四旋翼无人机Matlab建模

    本文主要分享一下四旋翼无人机的建模过程 然后在Matlab的simulink模块搭建起四旋翼无人机的模型 本篇文章主要参考了康日晖的 四旋翼无人机建模 与南京邮电大学周帆同学的硕士毕业论文 最后我会给出参考文章网址 有兴趣的同学可以看看 一
  • 8、2D建筑与3D模型的遮挡问题 URP Shader

    在我们的实际项目中根据实际情况 我们的建筑采用了2D面片的方式 但因为我们的英雄是3D模型 同时策划有需求 英雄可以在主城里面走动 这个时候就给我们提出了一个比较麻烦的问题 我们知道正常情况下渲染是谁的渲染队列高谁渲染在上面 我们这里英雄的
  • WPF 控件库Live Charts 动态折线图

    Live Charts库安装通过 1 PM gt Install Package LiveCharts Wpf 2 通过Nuget搜索添加LiveCharts Wpf安装 WPF页面xaml
  • oracle 去除oracle字段值得tab格

    大家都知道oracle中去掉左右空格用trim 函数 单独去左空格用ltrim 去右空格用rtrim 偶尔大家从excel中复制粘贴到数据空中的数据有可能左右会存在空格或者tab 此时可以用以下语句对所有存有字段的tab进行更新update
  • linux 下 systemd-udevd 服务解析

    最近在看linux下重定向的时候看到 的这个系统的服务 所以记下来备忘 描述 systemd udevd是监听内核发出的设备事件 并根据udev规则处理每个事件 选项 daemon 脱离控制台 并作为后台守程运行 debug 在标准错误上打
  • linux shell $0怎么输出,linux shell中$0,$?,$!等的特殊用法

    一 Shell脚本中 0 等的意义说明 1 Shell本身的PID ProcessID 即脚本运行的当前进程ID号 2 Shell最后运行的后台Process的PID 后台运行的最后一个进程的 进程ID号 3 最后运行的命令的结束代码 返回
  • 【IT项目管理】第八章课后作业

    1 制定的聘用的质量标准清单如下 标准编号 标准名称 标准内容 1 年龄 30岁以上 2 学历 博士学位 3 研究成果 至少在省级以上刊物发表文章 4 工作经验 具有2年以上教师从业经验 5 项目经历 至少主持或参与省级基金项目 2 制作E
  • 【网络原理篇2】TCP报头详解

    在这一篇文章当中 了解到TCP是属于传输层的协议 当数据从应用层向传输层发送的时候 如果使用的是TCP协议 那么就需要把应用层的数据加上TCP报头 初识网络 IP 端口 网络协议 TCP IP五层模型 革凡成圣211的博客 CSDN博客TC