【网络协议栈】Tcp协议(上)结构的解析 和 Tcp中的滑动窗口(32位确认序号、32位序号、4位首部长度、6位标记位、16为窗口大小、16位紧急指针)

绪论​
没有那么多天赋异禀,优秀的人总是努力翻山越岭。”本章主要讲到了再五层网络协议从上到下的第二层传输层中使用非常广泛的Tcp协议他的协议字段结构,通过这些字段去认识其Tcp协议运行的原理底层逻辑和基础。后面将会再写一篇Tcp到底是通过什么调高运行效率的,敬请期待!
请添加图片描述
话不多说安全带系好,发车啦(建议电脑观看)。

TCP协议字段

TCP协议段格式:
此处只需要对里面的字段内容有个印象,下面将会对这些字段进行逐渐解析。
在这里插入图片描述
将Tcp协议结构化,在代码中tcp协议结构:
在这里插入图片描述

tcp的数据发送模式:

  1. 串行发送:
    在这里插入图片描述
  2. 并行发送数据:
    在这里插入图片描述
    对于上面这种方法:server收到的报文顺序可能是乱序的(因为在网络中传输不能确定到达的先后顺序)

为保证按序到达就有了:

1. 32位序号:

接收方就可以根据报头中的序号,排序组合(每个报文都是带有自己的序号的!)

返回的确认信息也需要有序号,也就是报头中的

2. 32位确认序号

它一般设置成对应的32位序号+1
作用:

  1. 通过确认序号告诉用户已经收到了那些数据(返回应答是填写确认序号),它也能判断那些报文丢失。
  2. 通过确认序号也能知道返回到那个具体位置
    (先记住即可后面还会再底层讲解)

在这里插入图片描述
都是表示报文的序号,为何要把32位序号和32位确认序号分开
因为这样就能实现捎带通信,也就是Server将应答和信息存放到一起发送给Client客户端
再所以因为他既是数据又是应答,所以就需要有两个序号来分别代表数据和应答

也就有了:

捎带应答

捎带应答就是通过序列号和确认序列号实现把数据和应答合并成一个报文进行发送
在这里插入图片描述
用括号圈起来的(ACK和信息) 他们直接通过同一个tcp报文就发送回来了
总结:tcp保证可靠性但不仅仅保证可靠性,为了进行可靠性的同时还要提高效率(并行发送、捎带应答)


3. 4位首部长度

四位首部长度的单位是:4byte
又因为有4位所以换成10进制长度就有16个也就是:[0,15] 再 * 4(基本单位) ,得到tcp报文最长为60 byte
通过他确定就能确定有效载荷的长度,当得到报文长度再减去报头前的固定长度(20byte) 就得到了有 效载荷(数据的长度)的最长长度40byte

如果tcp长度是20,报头固定长度20byte(也表明没有有效载荷)
如果tcp长度是40,报头固定长度20byte,有效载荷数据就是20byte

报头有效载荷的分离是通过4位首部长度进行把报头和有效载荷区分出来,再将有效载荷向上交付是通过存的源和目的端口号来找到对应所需数据的软件位置。


当Client发送大量数据,但Server读取不够快就会导致接收缓冲区被填满(当装满后装不下的数据将会被丢弃!)

所以若接收方来不及接收了,发送方就不要再发送了,就需要进行流量控制(OS控制tcp协议来完成,传输控制协议(流量控制…))
如何进行流量控制:发送方就需要得知接收方的接受能力(接收缓冲区的大小


4. 6位标记位

在这里插入图片描述
serve在接收信息时,一定会收到各种各样的不同类型的tcp报文
所以对于不同的报文就需要有不同的类型进行区分和分别的使用!
所以才有各种标记位

例:ACK就是应答类型的报文!
在这里插入图片描述
具体的标记位:
1.ACK:确认报文接收到了
2. SYN:握手请求(建立链接)
3. URG:紧急报文(不在通过序号进行排序)
4. PSH:push推送,告诉对方,尽快进行把数据向上交付(指令服务)在这里插入图片描述
5. RST:reset重置,连接重置
虽然说tcp可靠的,但并不是说保证发送数据100%成功,而是数据发送出现问题了/发送成功了/发送失败了自身知道,并提供解决方案。
RST使用的例子:在这里插入图片描述

上图含义:在tcp三次握手中若第三次握手的ACK丢失后,客户是无法得知的因为客户认为的是只要把ACK报文发送过去就握手完成建立链接了,所以此时本质是没有链接上的,当客户发送信息给服务器时,服务器就会告知客户端并没有链接成功(也就是会发送设置了RST标记位的报文),这就是发送RST的情况,也就是所谓的链接不一致,需要重置连接。
tcp的三次握手就是赌最后一个报文对方收到了,也就表明了tcp的三次握手是不一定成功的!!


6. 16位紧急指针

它代表的是:需要紧急处理的数据在有效载荷中的偏移量
这样就能优先找到需要紧急处理的数据,并且紧急数据的大小只能是一个字节在这里插入图片描述
处理紧急指针的方法:
当使用recv函数时对flags字段进行设置MSG_OOB:

  1. recv参数flag为0时默认为阻塞式读取常规数据
  2. 选项为MSG_OOB时就是收到接收紧急数据(又称带外数据:正常通信外的数据)选项。

应用场景:需要加急处理的情况

  1. 终止或暂停上传行为
  2. 服务器的检测管理

7. 16位窗口大小

用来进行流量控制的字段

  1. 发送条件不满足,发送方就会写满了发送缓冲区,进程就要阻塞。
  2. 16位窗口大小,OS就会填写接收方TCP协议字段中的接收缓冲区剩余的空间大小,然后返回给发送方,这样发送方就知道接收方的接收能力,接收方就会只会发送小于16位窗口大小的数据。

如何确定接收方接收到消息:

当发送消息后,接收方会返回一条接收成功 应答消息 这样只要收到应答就能100%保证历史最近一条数据被对方收到(确认应答!

Tcp滑动窗口:

tcp的起始序号:起始序号是由tcp协议进行随机生成的
序号 = 起始序号 + 真实序号

附:在tcp通信之前,会进行三次握手交换tcp报头,在这过程中随机序号双方也就能协商好。

使用随机序号就能减少历史报文、以及黑客入侵的影响。

滑动窗口过程:
在这里插入图片描述
既然这样一发一收的方式性能较低, 那么我们一次发送多条数据, 就可以大大的提高性能(其实是将多个段的等待时间重叠在一起了).

在这里插入图片描述
并发大量暂时用不到的ACK的数据段进行提前预留,当要使用时就能直接使用减少发送间所需的时间,从而提高效率的解决方案
收到第一个ACK后(应答), 滑动窗口向后移动, 继续发送第五个段的数据; 依次类推。
操作系统内核为了维护这个滑动窗口,需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答; 只有确认应答过的数据, 才能从缓冲区删掉。
在这里插入图片描述
具体如下图:
在这里插入图片描述
上图白色窗口就是所要发的数据,可以把它理解为一个队列当数据输出后另外一个数据进来,也就是往右移的过程
在这里插入图片描述
而移动的本质其实也就是数组中指针(数组下标)的移动。

滑动窗口的大小:
由对方的接收能力决定(后面会讲 其实是对方的接收缓冲区16为窗口大小的大小和当前网络的拥塞窗口大小决定)

滑动窗口如何更新:
通过接收方返回win_start(开始放数据的位置下标值) 和 win滑动窗口的大小(接收方设定返回)
1. win_start = 确认序号(序号 + 1)
2. win_end = win_start + win(偏移量)


最开始每发送数据第一次滑动窗口的大小:同样是在三次握手期间协商的!
在这里插入图片描述

滑动窗口是会变小的,当只进行确认数据,而不取数据时,这样滑动窗口内的接收能力就会不断变小。

因为win_start是不断右移,而因为用户没有读取数据(返回win = 0),win_end指针就不会移动,所以win值就会变小

所以滑动窗口也是会变成0的,同理当win_start移动到win_end处是win就是0

滑动窗口也是能变大的,用户当把收到数据都获取(就有空间了就修改win),这样窗口就会扩大接收能力,这样的话win_end就会右移,从而让win窗口变大会,变成协商好的原窗口的大小。


窗口探测机制:
在这里插入图片描述
上述滑动窗口的变化也就是流量控制的解决方案:
1. 接收方接收能力弱时:发送慢
2. 接收能接收能力强时:发送快

接收端如何把窗口大小告诉发送端呢?
回忆我们的TCP首部中, 有一个16位窗口字段, 它就是存放了窗口大小信息

那么问题来了, 16位数字最大表示65535, 那么TCP窗口最大就是65535字节么? 实际上, TCP首部40字节选项中还包含了一个窗口扩大因子M, 实际窗口大小是 窗口字段的值左移 M 位;

会不会滑动到越界:
其实发送缓冲区设计成环形结构(因为前面已经发送的数据其实是可以被覆盖的!)

附:

确认序号的序号代表着该序号之前的数据全部收到了

滑动窗口的报文丢失了怎么办?
当发送的报文丢失时:
通过查看ACK的确认序号是否完整:
在这里插入图片描述


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量计算机网络细致内容,早关注不迷路。

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

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

相关文章

java实现的音视频格式转化器

一、前言 最近写了一款图形界面版的音视频格式转化器&#xff0c;可以实现将多种视频之间进行转化&#xff0c;非常好用&#xff0c;如将AVI转换为&#xff0c;TS&#xff0c;FLV&#xff0c;MP4等。音频可将MP3转成WAV。 二、实现 1.需引入相关maven依赖。 <!-- 核心包 -…

群控系统服务端开发模式-应用开发-业务架构逻辑开发准备工作

安装与仓库已经调整完毕&#xff0c;现在开发业务架构逻辑&#xff0c;其次再开发功能逻辑。业务架构逻辑开发与功能逻辑开发不是一回事&#xff0c;一定要明白。业务架构指的是做某一件事或是某一种类型的事的逻辑&#xff0c;在互联网web应用中通常指一套系统的外在逻辑&…

知识见闻 - 磁力片原理

磁力片是一种利用磁性原理设计的玩具&#xff0c;它的工作原理和磁性方向的排列方式非常有趣。让我们深入了解一下磁力片的核心原理和磁性方向的特点。 磁力片的基本原理 磁力片的工作原理基于磁铁的基本特性。每个磁力片都包含多个小磁铁&#xff0c;这些磁铁被精心排列&#…

强化学习数学原理学习(一)

前言 总之开始学! 正文 先从一些concept开始吧,有一个脉络比较好 state 首先是就是状态和状态空间,显而易见,不多说了 action 同理,动作和动作空间 state transition 状态转换,不多说 policy 策略,不多说 reward 奖励,不多说 MDP(马尔科夫) 这里需要注意到就是这个是无…

小程序视频SDK解决方案,提供个性化开发和特效定制设计

美摄科技作为视频处理技术的领航者&#xff0c;深知在这一变革中&#xff0c;每一个细微的创新都能激发无限可能。因此&#xff0c;我们精心打造了一套小程序视频SDK解决方案&#xff0c;旨在满足不同行业、不同规模客户的多元化需求&#xff0c;携手共创视频内容的璀璨未来。 …

守护头顶安全——AI高空抛物监测,让悲剧不再重演

在城市的喧嚣中&#xff0c;我们享受着高楼林立带来的便捷与繁华&#xff0c;却往往忽视了那些隐藏在高空中的危险。近日&#xff0c;震惊全国的高空抛物死刑案件被最高院核准并执行。案件中被告人多次高空抛物的举动&#xff0c;夺去了无辜者的生命&#xff0c;也让自己付出了…

Leetcode11:盛水最多的容器

原题地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳…

Docker本地安装Minio对象存储

Docker本地安装Minio对象存储 1. 什么是 MinIO&#xff1f; MinIO 是一个开源的对象存储服务器。这意味着它允许你在互联网上存储大量数据&#xff0c;比如文件、图片、视频等&#xff0c;而不需要依赖传统的文件系统。MinIO 的特点在于它非常灵活、易于使用&#xff0c;同时…

Pr 视频效果:波形变形

视频效果/扭曲/波形变形 Distort/Wave Warp 波形变形 Wave Warp效果用于在剪辑上创建类似波浪的动态变形效果。 此效果会自动动画化&#xff0c;波形以恒定速度移动。要改变速度或停止波动&#xff0c;需要设置关键帧。 ◆ ◆ ◆ 效果选项说明 通过调整波形的类型、高度、宽度…

(六)问题记录,simulink仿真出现模型碰撞后穿越

明明已经设置了车轮和地面之间的 spatial contact force&#xff0c;可是还会出现模型穿越&#xff08;重力作用下自由落体&#xff09;&#xff0c;如下图所示。 可仅降低小车初始高度后就不会穿越&#xff0c;如下图所示。 初步怀疑是小车初始高度大的话&#xff0c;小车在和…

【原创】统信UOS如何安装最新版Node.js(20.x)

注意直接使用sudo apt install nodejs命令安装十有八九会预装10.x的老旧版本Node.js&#xff0c;如果已经安装的建议删除后安装如下方法重装。 在统信UOS系统中更新Node.js可以通过以下步骤进行&#xff1a; 1. 卸载当前版本的Node.js 首先&#xff0c;如果系统中已经安装了N…

Kafka消费者故障,出现活锁问题如何解决?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka消费者故障&#xff0c;出现活锁问题如何解决&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Kafka消费者故障&#xff0c;出现活锁问题如何解决&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资…

照片怎么转换成pdf?盘点6种图片转pdf格式有效方法,直击要点!

照片怎么转换成pdf&#xff1f;在日常生活和工作中&#xff0c;我们难免会碰到需要将照片以pdf格式保存的情况&#xff0c;以便于更好的整理、分享或打印。虽然jpg格式的图片因其体积小而方便分享&#xff0c;但有时我们也希望将这些图片转换成pdf格式&#xff0c;以便于创建专…

《自动驾驶技术的深度思考:安全与伦理的挑战》

内容概要 在当今这个自动驾驶技术飞速发展的时代&#xff0c;我们生活的节奏恰似一场疾驰的赛车&#xff0c;然而&#xff0c;赛道上并非总是平坦。在这场技术革命中&#xff0c;安全与伦理问题像是潜伏在阴影中的幽灵&#xff0c;轮番考验着我们的道德底线与法律界限。 随着…

圆柱形腔体谐振器理论分析-20241027

圆柱形腔体谐振器 谐振电路在电子工程中起着非常重要的作用。在低频段&#xff0c;谐振电路通常由集总参数的电感和电容构成&#xff0c;即为LC谐振电路&#xff0c;其品质因数通常为数百。当频率升高到微波频段时&#xff0c;电路的尺寸与电磁波的波长可以比拟&#xff0c;集…

微信小程序——消息订阅

首先用到的就是wx.requestSubscribeMessage接口。 注意&#xff1a;用户发生点击行为或者发起支付回调后&#xff0c;才可以调起订阅消息界面 requestSubscribeMessage() {uni.requestSubscribeMessage({tmplIds: [],//需要订阅的消息模板的id的集合&#xff0c;一次调用最多可…

vscode配色主题与图标库推荐

vscode配色主题推荐:Andromedavsocde图标库&#xff1a; vscode-icons Andromeda Dark theme with a taste of the universe 仙女座&#xff1a;一套宇宙深空体验的哑暗色主题; 高对比度,色彩饱和; Easy Installation Open the extensions sidebar on Visual Studio CodeSear…

arm架构 ubuntu 部署docker

如果有旧版本需要卸载 sudo apt remove docker docker-engine docker-ce docker.io 安装依赖包 sudo apt update && apt install -y apt-transport-https ca-certificates curl software-properties-common 添加docker秘钥 阿里云 curl -fsSL http://mirrors.aliyu…

Java应用程序的测试覆盖率之设计与实现(三)-- jacoco cli 客户端

一、背景 上文已把覆盖率数据采集好了,并提供远程连接的tcp地址及端口。 jacoco cli文档jacoco cli jar包jacococli.jar 我下载好了,放在github工程里。 本文主要是介绍如何使用jacoco cli 客户端读取并生成覆盖率报告。 二、使用 1、dump覆盖率统计 java -jar doc/jacoc…

基于java的山区环境监督管理系统(源码+定制+开发)环境数据可视化、环境数据监测、 环境保护管理 、污染防治监测系统 大数据分析

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…