传输层TCP

报头
  


  
1.报头和有效载荷如何分离将,有效载荷向上交付?
tcp有个标准报头长度为20,那是不是以为我们可以像udp一样分离依靠报头大小去分离,我们仔细去看我们报头中还有个选项没包含到。


我们还有个首部长度,四位可以表示1111,最大为15,它要乘以4才能表示报头长度,也就是说报头长度必须是4的倍数,选项大小最大为40字节,所以我们再读取报头时,首先读前20个标准报头长度,再从首部中读取整个报头的长度。

16位窗口大小
  

  
当发送方发了很多数据,把对方的接受缓冲区填满了,但是发送方不知道对方缓冲区满了,发送方还要发,可能就造成了数据泄漏,为了使传输的效率变高,防止数据泄漏,我们就要解决这个问题的关键,就是让发送方知道对方的接受缓冲区被填满,强制停止发送
我们有个策略叫做流量控制,这个策略由tcp协议完成的,也就是说是OS中的tcp模块完成的,tcp协议也叫传输控制协议
所以我们根本不用去考虑接受缓冲区被填满的情况,在文件IO的原理是一样的
如何流量控制
  
  
发送方得知道接收方的接受能力,就是要知道接受方接受缓冲区的剩余空间。

我们在通信的时候不是单发面的发送,服务器接收到消息给客户端确认的消息(ACK)(确认应答机制),我们接收方缓冲区的剩余空间就会被填充到窗口大小,客户端也就知道了要缓慢发送还是停止发送。停止发送也就是说直接让客户端的发送方写满发送缓冲区,就让进程阻塞,直到OS重新给发送,这也就是同步机制


ACK


这个词也许很陌生,但我们在通信时就是发送报头+数据ACK肯定也是一种报文.
它的作用:是确认应答,表示接收方已经成功接收到某个数据段。
tcp保持可靠性
如果有应答,对于发送方,能保证上面的消息全部接受到。


关于确认应答和tcp数据发送模式

Tcp发送数据的方式
1.串型发送 一条一条发 (理解)
  
  
2.并行发送(常见)
发送时间,进行重叠,同一时刻发送多条报文
  
  
保证数据按序到达?
server收到的报文可能是乱序的,他是不可靠的——报文按序到达,依靠报头中的32位序号解决,32位序号,根据序号进行排序
服务端发送ACK也要一对一的回应给客户端那些报文被收到了,此时由32位确认序号保证,例如32位序号为100的报文的ACK中确认序号为101,确认序号之前的所有报文已经被收到,这样的设计有一个好处,就是允许了少量的ACK丢失。
既然有了32位序号,为什么又要有确认序号呢,他们两的值不能是一样的吗?
捎带应答,是指它既对报文进行了应答的同时又捎带了数据,为了防止乱序,就要填充自己的32为序号,又要给对方确认应答,所以又要填充自己的32位确认序号
由此可见:tcp保证可靠性,但不仅仅可靠性,还积极的提高了效率

标记位

server一定会接收到各种不同的报文

例如:三次握手syn,四次挥手fin

此时就得引入标记位
例如如果是syn报文,syn的标记位置为一

16位紧急指针

URG


标志位为URG
urg指针标记为一,当发送紧急报文时,紧急报文也得排队,但是需要尽快处理,所以得让它插队,紧急报文会携带紧急数据,而紧急指针表示的是数据的偏移量,接收方会优先去依靠紧急指针提供的便宜量查看数据中的紧急数据,
值得一提的是:紧急指针只存在1个字节

紧急指针有怎么使用呢?标识紧急任务,当上传任务可能上错了想要让他暂停,就把紧急数据变为1,让他赶紧暂停上传任务

psh


当我们的接收缓冲区满了之后,发送方会定时发送询问报文,而我们的接受方同时也会发送一个窗口大小更新报文。
询问报文:就是把psh标记为一,让服务器赶紧把数据向上层交付
psh不仅仅只在这种情况下使用,在任何需要让接收方尽快将数据进行上层交付的情景都可以使用
例如:我们在输入指令的时候,通常都是发送push的报文,让接收方尽快对报文进行解释

reset
tcp是保证可靠性的,那么三次握手是不是必须成功,错误的
我们的可靠性指的是我们发送消息,对方能确认收到,我们发的消息丢失对方收不到,对方也能知道对方没收到,这才叫可靠性。

在建立通信,三次握手中,第一次客户端syn发送出错时,我们是知道的,因为没有收到服务器的syn+ack,第二次客户端syn+ack发送出错时,我们也是知道的,因为此时连接没有建立好,当第三次ack发送时,因为它是最新的一条消息,他是没有应答的,我们不知道它到底发没发送成功,当客户端发送第三次握手ack时,服务端没收到,此时客户端是知道自己建立好了连接,但是服务端是不知道的,这叫建立连接认知不一致。


在此时,客户端不知道服务端没收到ack,客户端以为建立好了连接,接下来发送消息,服务器此时不知道建立好了连接,就会发送一个reset报文,告知客户端重新建立连接
  
  
  
建立连接认知不一致
,不一定是服务端不知道是否建立连接,网络传输的过程是非常复杂的,当服务器和客户端正常通信的时候,此时拔了客户端的网线,客户端知道了断开了连接,但是服务器是不知道的,此时客户端就需要发出reset报文了。

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

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

相关文章

测试代理IP的有效性和可用性

使用代理IP的有效性和可用性直接关系到用户的工作效率,尤其是在进行数据抓取、网络爬虫和保护个人隐私等场景中。 一、测试代理IP的必要性 代理IP的可用性测试是确保代理服务正常运行的重要步骤。测试代理IP的必要性主要体现在以下几个方面: 提升工作…

【Docker命令】日常使用的Docker命令

Docker常用命令 1、基础命令2、容器管理3、镜像管理推送镜像 4、网络管理5、数据管理 1、基础命令 - docker run:运行一个容器,--name 指定容器的名称,-i 获取标准输入输出,-t显示在终端,-d放到后台运行,--rm容器停止…

STM32传感器模块编程实践(十) 2.4G NRF24L01通信模块简介及驱动源码

文章目录 一.概要二.NRF24L01模块介绍三.NRF24L01模块主要特性四.国产射频芯片SI24R1介绍五.模块接线说明六.参考原理图七.通讯协议介绍八.STM32单片机与NRF24L01模块实现远无线通讯实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 九.源代码工程下载十.小结 一.概要 NRF24…

InnoDB 存储引擎<二>页结构和行结构

目录 ⻚结构 ⾏结构 ⻚结构 ⻚在MySQL运⾏的过程中起到了⾮常重要的作⽤,为了能发挥更好的性能,可以结合⾃⼰系统的 业务场景和数据⼤⼩,对⻚相关的系统变量进⾏调整,⻚的⼤⼩就是⼀个⾮常重要的调整项 1.⻚的⼤⼩可以设置吗&…

RHCSA笔记一

常见的操作系统 UNIX 、 Linux 类、 Windows 类 搭建Linux学习环境 如何安装linux操作系统: 安装独立的 Linux 系统,不再安装其他操作系统。 安装 Windows 与 Linux 并存的多操作系统,启动时通过菜单选择要启动的操作系统。 在虚拟机中安…

十一、数据库配置

一、Navicat配置 这个软件需要破解 密码是:123456; 新建连接》新建数据库 创建一个表 保存出现名字设置 双击打开 把id设置为自动递增 这里就相当于每一次向数据库添加一个语句,会自动增长id一次 二、数据库的增删改查 1、Vs 建一个控…

探索华为云DataArts Insight:数据智能的新引擎

在快速发展的数字化时代,数据已经成为企业最宝贵的资产。如何有效地管理和利用这些数据,以实现商业价值,是每个企业需要面对的重要挑战。华为云DataArts Insight平台应运而生,作为一款强大的数据智能解决方案,它帮助企…

Kotlin-Annotations详解

在Kotlin中,注解(Annotations)是用于为代码提供元数据的一种机制。这些元数据可以被编译器、IDE(集成开发环境)或其他工具使用,以生成代码、执行编译时检查或提供运行时信息。 注解通常被用于类、方法、属…

算法的学习笔记—左旋转字符串(牛客JZ58)

😀前言 在程序设计中,字符串处理问题屡见不鲜,其中“字符串左旋”是一种常见操作,今天我们一起来探讨一个经典的左旋转字符串题目,以及一种优雅的解决方案——三步翻转法。 🏠个人主页:尘觉主页…

anaconda jupyter notebook themes install jupyter notebook样式更改,取消页面头部,全屏展示!

现在已经有很多相关的文章了,我只说简单的解决步骤: 我用的是anaconda的 jupyter notebook,这个要更改主题,方法有: 一,最简单:用 jupyter notebook自带的setting>Theme>自己选&#xff1…

模型 是否树(逻辑树之三)

系列文章 分享 模型,了解更多👉 模型_思维模型目录。决策分支,是与否的逻辑路径。 1 是否树的应用 1.1 个人IP打造中的是否树应用案例:社交媒体营销策略 在个人品牌建设中,是否树可以帮助个人识别关键的决策点&#…

纯GO语言开发RTSP流媒体服务器-RTSP推流直播、本地保存录像、录像回放、http-flv及hls协议分发

温馨提示:我们分享的文章是给需要的人,不需要的人请绕过,不知道为什么总有一些人总觉得我们发的文章是给他看的,我们不逼任何人用或了解,不要一来就攻击我们,我们不惹事但也不怕事!也希望大家和…

springboot083基于springboot的个人理财系统--论文pf(论文+源码)_kaic

基于springboot的个人理财系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了个人理财系统的开发全过程。通过分析个人理财系统管理的不足,创建了一个计算机管理个人理财系统的方案。文章介绍了个…

Depcheck——专门用于检测 JavaScript 和 Node.js 项目中未使用依赖项的工具

文章目录 Depcheck 是什麽核心功能📚检测未使用的依赖🐛检测缺失的依赖✨支持多种文件类型🌍可扩展性 安装与使用1. 安装 Depcheck2. 使用 Depcheck Depcheck 的应用总结项目源码: Depcheck 是什麽 来看一个常见错误场景&#x1…

深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间

在 Android 开发中,xmlns (.xml的namespace)命名空间是一个非常重要的概念。通过引入不同的命名空间,可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外,还有很多常见的命名空间…

故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码

故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码 目录 故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码效果一览基本介绍程序设计参考资料 效果一览 基本介绍 CNN-ResNets(卷积神经网络-残差网络)在滚动轴承故障诊断中是一种常用的方法。这种方法利用…

VisionPro - 高级 - 保存模式以备后用 - 中心圆的查找配置

前言: 在基础篇, VisionPro Basic - 01- 有关应用和作业-CSDN博客 我们提到了应用和作业的保存,那么这些都是vpp的保存格式。 我们知道,在模式工具的配置中,如果我们做好了很多的调试,最后配置好参数后,也有一个保存模式的选项。我们在保存的时候,一定要添加前缀或…

Java多线程详解②(全程干货!!!)Thread Runnable

这里是Themberfue 上节主要讲完了多线程的一些基础知识,这节通过代码进一步理解多线程🫡 多线程 Java标准库中提供了Thread类,以程序员们编写多线程代码,我们可以查看官方文档进一步了解Thread的特性以及提供的接口。 类似于Sy…

【ROS中的IMU惯性测量单元】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、IMU的部分关键数据解析二、常规IMU模块与九轴三、使用C实现获取IMU数据的节点1.IMU中的话题2.获取IMU数据程序设计思路3.获取IMU数据程操作步骤与实验现象&…

世界酒中国菜与另可数字平台达成战略合作

世界酒中国菜与另可数字平台达成战略合作,共推行业发展新高度 近日,在行业内引起广泛关注的“世界酒中国菜”项目,与“另可”数字平台成功举行了战略合作签约仪式。这一重要合作不仅是双方发展历程中的重要里程碑,更是继世界酒中…