TCP 协议的相关特性

一些TCP协议的基础标志位:

URG:紧急指针是否有效

ACK:确认号是否有效

PSH:提示接收端应用程序立刻把数据读走

RST:要求重新建立连接,也叫复位报文段

SYN:请求建立连接,同步报文段

FIN:通知要断开连接了我这里,结束报文段

一,确认应答

这是核心机制,但也比较简单,也就是你发送过去了一个数据是(1-1000),那边确认应答之后,给你回了一个(1001),就是告诉你下一个数据的开始序列是那个,也是这边确认收到了的意思。(确认应答也是ACK)

图:

二,超时重传

就比如你发送了一个消息,别人一直没有理你,你这边就想着是不是没有收到啊,再发了一次,这也就是超时重传。

也就是主机A这边发送了一个消息,在一个特定时间里面,主机B的确认应答一直没有发送过来,就会进行重新发送,以确保数据不会出现丢包。

但要注意的是也可能出现ACK丢失的情况,就会重复发了一段。这时候就需要去重了,接收方这边有一个数据结构叫做数据缓冲区,当有数据进入这个区,应用程序以read,就会把这个重复的从缓冲区删掉。

三,连接管理

 分为建立连接和断开连接,

建立连接:三次握手:

也就是通信双方要互相保存对方的信息,具体完成需要三次网络交互。

首先发起请求方先发一次 同步报文,接受请求方在接受到了之后,向客户端发一个同步报文(SYN)+应答报文(ACK),在接受到服务器发的SYN+ACK之后,客户端这边在发一个应答报文(ACK)。

建立连接的意义:

投石问路,确认当前通信路径是否通畅。

协商参数,确认一些通信中必备的通信参数

具体做法是这样的:

 断开连接也就是四次挥手,也就是客户端这边给服务器这边发送一个FIN(结束报文),进入了一个time_wait状态,如果出现大量的这个状态,就证明服务器触发了大量的主动断开TCP连接操作,服务器这边回一个(ACK)应答报文,这时服务器会进入一个close_wait状态,如果出现了大量close_wait状态,那就可能应用程序忘记调用close了,等客户端这边的应用程序代码执行到close的时候,再发一个(FIN),在客户端这边收到之后,就给服务器发一个ACK,告诉服务器我这边结束了,不要再联系了。

具体情况时这样的:

四,滑动窗口

这个好理解,在上面传输数据的时候,都是一个一个往过传输的,效率很慢,所以就需要一个加快传输效率的方法,滑动窗口就出现了,也就是把很多条数据一起发送过去,这样就降低了等待时间。

具体实现:

这边发送前五条数据的时候,不用等待ACK就直接发送。

窗口大小代表着继续发送数据的最大值,这边的就是4000

收到第一个ACK后就继续发送第五个数据以此类推 

注意问题:

第一个,返回的ACK 丢了咋办,这个没事,后面还有一直跟着返回的ACK,客户端这边还能继续确认,不影响什么。

第二个,数据包丢了,比如第二个数据包2000丢了。这边ACK返回的全都是下一个是1001 ,如果客户端这边收到了三个这个,就会重新发送1001~2000这个数据包。这边接受到第二个数据包之后,直接返回的就是给你发的那个最后卡住的地方,前面的值已经接受到了,在接收缓冲区。这种机制也叫做高速重发控制(快重传)

拿图表示:

五,流量控制

接收端这边处理数据是有限的,如果接收端这边满了,发送端再发数据就很容易造成丢包,引起丢包重传的低效操作。

因此接收端这边就会把自己可以接收的缓冲区的大小放到TCP首部,也就是窗口大小,窗口越大,接收的数据越多,效率就越高,反之则越低。

一旦这边窗口满了,就会告诉客户端那边停止发送。

上图:

六,拥塞控制

和流量控制类似,都是启动了滑动窗口来进行控制,也就是站在接收方的角度,影响这发送方的速度,也就是一开始让你先发点,看没有丢包就继续加,加到窗口大的很,开始丢包了,就赶快减少,减少到不丢包为止,也就是在丢包的边缘疯狂试探。

上图:

七,延时应答

也就是ACK不会立即返回,会等一段时间再返回,这样也是为了提高传输效率,比如现在窗口的大小是5kb,这边传过来一个1kb的数据,如果立即返回ACK,那过去的窗口大小只有4kb,等一会应用程序可能把1kb的数据消费了,这是返回ACK就有5kb了。

此处延时有两种方法:

一种是按照一定时间来延时

第二个是按照接收到的数据量。

八,捎带应答

建立在演示应答基础上的提高效率的方法:

比如在客户端这边一般都是一问一答机制,但在延时应答的时候,ACK 等了一会会,这是给客户端的请求,ACK正好可以捎带着一起返回了,可以提高效率

九,面向字节流(粘包问题)

在字节流  读写数据的情况下,会涉及到一个很严重的问题,也就是粘包问题。

就比如你一次发送了好几个单词,比如dog,cat,hello。你发过去后,由于字节流,就可能一次读一个字节或者若干字节,所以可能给你读成dogcathello这种了。

此处粘的主要应用层的数据包,也就是要区分一个到一个应用层数据包之间的界限。

主要用两点:

1)使用分隔符,任何字符都可以,只要在数据中不存在的都可以

2)约定包的长度

十,异常情况

1)进程终⽌:进程终⽌会释放⽂件描述符,仍然可以发送FIN.和正常关闭没有什么区别.

2)机器重启:和进程终⽌的情况相同。

3)机器掉电/⽹线断开,接收端认为连接还在,⼀旦接收端有写⼊操作,接收端发现连接已经不在了,就会进⾏reset,即使没有写⼊操作,TCP⾃⼰也内置了⼀个保活定时器,会定期询问对⽅是否还在,如果 对⽅不在,也会把连接释放。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++缺省参数函数重载

缺省参数 大家知道什么是备胎吗? C中函数的参数也可以配备胎。 3.1缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。 void TestFunc(int a 0…

引擎:Shader

一、原理 创建Shader脚本,创建材质球,将物体的渲染效果Shader脚本挂载到材质球,最后把材质球挂到3d物体上面从而实现渲染。 二、模型边缘发光 原理:正对着摄像机的模型三角面边缘光最弱,垂直于摄像机的模型三角面边缘光…

opencv进阶 ——(九)图像处理之人脸修复祛马赛克算法CodeFormer

算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型,由南洋理工大学和商汤科技联合研究中心联合开发,它能够接收模糊或马赛克图像作为输入,并生成更清晰的原始图像。算法源码地址:https://github.com/sczhou/CodeFormer…

什么是Spark RDD?(RDD的介绍与创建)

什么是Spark RDD?(RDD的介绍与创建) 一、RDD介绍 1、特点2、RDD的存储和指向3、RDD与DAG4、RDD的特性5、RDD分区6、RDD操作类型 二、RDD创建 1、引入必要的 Spark 库2、配置 Spark3、RDD创建4、示例代码 一、RDD介绍 RDD: 弹性分布式数据集(Resilient…

Go微服务: 基于rocketmq:5.2.0搭建RocketMQ环境,以及示例参考

概述 参考最新官方文档:https://rocketmq.apache.org/zh/docs/quickStart/03quickstartWithDockercompose以及:https://rocketmq.apache.org/zh/docs/deploymentOperations/04Dashboard综合以上两个文档来搭建环境 搭建RocketMQ环境 1 ) 基于 docker-c…

K8S==ingress配置自签名证书

安装openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 生成证书 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout example.local.key -out example.local.crt -subj "/CNexample.local/Oexample.local"创建K8S secr…

【JVM】已验鼎真,鉴定为:妈妈加载的(双亲委派模型)

【JVM】已验鼎真,鉴定为:妈妈加载的(双亲委派模型) 在Java的世界中,类加载器(ClassLoader)是Java虚拟机(JVM)用来动态加载类的基础组件。双亲委派模型(Paren…

Java基础27,28(多线程,ThreadMethod ,线程安全问题,线程状态,线程池)

目录 一、多线程 1. 概述 2. 进程与线程 2.1 程序 2.2 进程 2.3 线程 2.4 进程与线程的区别 3. 线程基本概念 4.并发与并行 5. 线程的创建方式 方式一:继承Thread类 方式二:实现Runable接口 方式三:实现Callable接口 方式四&…

C#操作MySQL从入门到精通(10)——对查询数据进行通配符过滤

前言 我们有时候需要查询数据,并且这个数据包含某个字符串,这时候我们再使用where就无法实现了,所以mysql中提供了一种模糊查询机制,通过Like关键字来实现,下面进行详细介绍: 本次查询的表中数据如下: 1、使用(%)通配符 %通配符的作用是,表示任意字符出现任意次数…

【简单讲解TalkingData的数据统计】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

Python04:python代码设置作者/创建时间/文件名称

我们新建一个py文件时,如果希望文件开头有固定的内容,怎么设置呢? 比如代码作者、文件创建时间等。。。 1、点击左上角【Python】–>【Settings】设置 2、在弹出的新窗口找到【File and Code Templates】–>【Python Script】–>在右…

鸿蒙小案例-音乐播放器

之前参加鸿蒙比赛的音乐播放器 效果展示 HF音乐效果展示 功能列 有一些功能没写上去,自行发掘 说明: 1.API:网易云接口,QQ个人接口, 需要请看gitee 2.本地关系型数据由bug,提的工单已确认,建议使用API11,12,9的不稳…

java代码审计之fastjson反序列化漏洞

fastjson反序列化漏洞分析 Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。该产品主要提供了两个接口&…

创新入门|营销中的视频内容:不可或缺的策略

视频在营销中日益重要。你是否也发现,视频内容最近似乎无处不在?它占据着社交媒体的推文、网站首页,甚至电子邮件中的位置。事实上,并不是你一个人有这样的感受。在过去十年中,视频作为一种营销手段日益成熟和强大。这是因为,人类天生就是视觉动物。我们大脑处理视觉信息的速度…

Priority_queue

一、priority_queue的介绍和使用 1.1 priority_queue的介绍 1.优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 2.优先队列类似于堆, 在堆中可以随时插入元素, 并且只能检索最大堆…

硕士课程 可穿戴设备之作业一

作业一 第一个代码使用的方法是出自于[1]。 框架结构 如下图,不过根据对代码的解读,发现作者在代码中省去了对SSR部件的实现,下文再说。 Troika框架由三个关键部件组成:信号分解,SSR和光谱峰值跟踪。(粗…

word 无法自动检测拼写

word 有时候不能分辨是哪种语言,比如把英语错认为法语 。 例如:Interlaayer spacace,发现误认为是法语。 1、选中Interlaayer spacace 2、点击语言下拉按钮 选择设置校对语言 发现校对语言为法语 3、手动修改校对语言为英语,并点击确认。 4、发现现…

升级鸿蒙4.2新变化,新增 WLAN 网络自动连接开关!

手机已经成为现代人生活中不可或缺的一部分,手机里的功能可以满足大部分人的生活场景,但是最依赖的应该就是手机网络,手机网络突然变差怎么办——消息发不出去?刷新闻速度变慢?仔细检查后,发现其实不是手机…

【一步一步了解Java系列】:重磅多态

看到这句话的时候证明:此刻你我都在努力 加油陌生人 个人主页:Gu Gu Study专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者:小闭…

E10:流程主表表单字段值变化触发事件

效果– //window.WeFormSDK.showMessage("这是一个E10的提示", 3, 2); const onClickCreate () > console.log("create"); const onClickSave () > console.log("save"); const onClickCancel () > dialogComponent?.destroy();/…