理解TCP协议三次握手、四次挥手、流量控制、拥塞控制 、重传机制

news2025/8/3 2:21:27

👨‍💻个人主页: 才疏学浅的木子
🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️
📒 本文来自专栏: 计算机网络
🌈 每日一语真正的勇气是:做出决定,全力以赴! 🌈
❤️ 支持我:👍点赞 🌹收藏 🤟关注

TCP协议的理解

  • TCP概述
  • TCP报文格式
  • 三次握手
  • 四次挥手
  • 流量控制
  • 拥塞控制
  • 重传机制
    • 超时重传
    • 快速重传
  • 为什么不进行两次握手
  • 为什么关闭连接时客户端会等待2MSL
  • 建立连接后客户端出现故障怎么办
  • TCP黏包与粘包问题
    • 什么是黏包与粘包
    • 如何解决

TCP概述

TCP是一种面向连接的协议,在发送数据前通信双方必须在彼此间建立一条连接
所谓的连接其实就是客户端和服务器的内存里保存一份关于对方的信息,如IP地址、端口
TCP是一种字节流,它会处理IP层的丢包、重复以及错误问题
在建立连接的过程中,双方交换的一些参数可以放到TCP的头部

总结 :TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接,四次挥手关闭一个连接

TCP报文格式

在这里插入图片描述

源端口、目的端口:发送方和接收方的端口号
序号:TCP连接中的字节流都有编号。如果101开始,传送了100个字节,那么下次就是从201开始
确认序号:接送方发给发送方下次需要的字节序号
首部长度:就是TCP首部的长度,记录了TCP报文数据到TCP报文段开始的距离
保留:留待以后使用
URG:紧急字段 1-代表有紧急数据 0-代表没有
ACK:在TCP报文段中,字段ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1
PSH:当两个应用在进行交互时,如果想要立马得到对方的回复就PSH设置为1
RST:RST为1时代表需要重新建立连接
SYN:在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
FIN:用来释放连接;当FIN=1时代表终止连接
窗口大小:用来进行流量控制
校验和:对整个TCP报文段进行校验和计算,由目标端进行校验
紧急指针:记录一个偏移量,指向紧急数据的最后一位(也可以是紧急数据的下一位,两者都是标准),在读取到紧急指针所指向的位置之前,TCP的接受进程都处于紧急状态,当读取到紧急数据后一位时,回复到正常状态。

三次握手

在这里插入图片描述

四次挥手

在这里插入图片描述

流量控制

如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。流量控制根本目的是防止分组丢失,它是构成TCP可靠性的一方面

流量控制主要是用滑动窗口实现
发送窗口 = 1,接收窗口 = 1 停止等待
发送窗口 > 1,接收窗口 = 1 回退N帧协议
发送窗口 > 1,接收窗口 > 1 选择重传协议

停止协议
发送方必须受到接收方返回回来的ACK数据包才能继续发送下一个不然就超时重传
性能较差一次只能发送一个
没有问题
在这里插入图片描述
出现问题
在这里插入图片描述

回退N帧协议
发送窗口
新的分组落入发送缓冲区,发送->前沿移动
超时重发机制让发送端将发送窗口中的所有方法发送出去
接收窗口
收到乱序分组,没有落入到接收窗口范围,抛弃
发送老分组的确认,累计确认

选择重传协议
发送窗口
新的分组落入发送区域缓冲区范围,发送->前沿移动
超时重发机制让发送端将超时的分组重新发送出去
来了乱序分组的确认->后沿不向前移动->新的分组无法落入发送缓冲区的范围
接收窗口
收到乱序分组,落入到接收窗口范围,接收
收到该分组的确认,单独确认

拥塞控制

在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞控制。拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器以及与降低网络传输有关的因素。相反,流量控制往往是控制点对点的通信量,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便于接收方来得及接收

在这里插入图片描述

慢开始

拥塞窗口和接收窗口共同决定的发送窗口
当主机开始发送数据时,如果把大量数据字节注入到网络中,那么会引起网络阻塞,因为现在不知道网络的负荷情况
所有较好的办法就是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍

如果不对cwnd限制马上就会导致cwnd膨胀所有就有一个慢启动阈值ssthresh
如果cwnd > ssthresh 就用拥塞避免
如果cwnd < ssthresh 就用慢开始

拥塞避免

拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送放的 cwnd 加 1

不论是慢开始还是拥塞避免只要网络出现拥塞(没有按时到达)时,就把ssthresh的值置为出现拥塞时的拥塞窗口的一半(但不能小于2),以及cwnd置为1,进行慢开始。 目的是迅速减少主机发送到网络中的分组数,使得发生 拥塞的路由器有足够时间把队列中积压的分组处理完毕。

快重传与快恢复
快重传详情看 重传机制-快速重传

快速恢复
当发送方连续收到三个重复确认,就执行"乘法减小"算法,把慢开始门限ssthresh减半。然后立即重传丢失报文段,并将cwnd设置为新的ssthresh然后进行拥塞避免算法

重传机制

超时重传

RTT:往返时间(发送方发给服务方然后发送方收到服务方应答的时间)
RTO:超时重传时间

在发送数据包时就开启一个定时器,如果定时器超时了还没有收到ACK就发起重传,如果收到了ACK就发送数据包再重置定时器

超时重传发生情况:
1、数据包丢失
2、确认应答丢失

RTO时间设置
1、RTO 较大时:重发就慢,丢了过后很久才发,效率低
2、RTO 较小时:可能没有丢失,但是RTO到了就重发,导致网络拥塞,导致更多的超时,导致更多的重发
所有RTO应略大于RTT

快速重传

快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
为什么是三次冗余ACK
通过大量经验表明三次比较合适

为什么不进行两次握手

1、确认双方的接收与发送能力是否正常
第一次握手:客户端发送网络包,服务端收到了。服务端:客户端的发送能力、服务端的接收能力正常
第二次握手:服务端发包,客户端收到了。客户端:服务的发送能力、服务端的接收能力、客户端的接收能力、发送能力正常
第三次握手:客户端发包,服务端收到了。服务端:服务端的发送能力,客户端的接收能力正常
2、防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误
如果客户端发出连接请求,因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后释放连接,客户端发出了两个连接请求报文段,其中一个丢失了,第二个到达了服务端,但是第一个丢失的报文段有可能只是由于某些网络节点长时间滞留了,延误到连接释放以后的某个节点,此时服务端认为是客户端又发出一次请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认就建立了新的连接,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源

为什么关闭连接时客户端会等待2MSL

MSL:报文段最大存活时间
1、为了保证客户端发送的最后一个ACK报文能够到达服务器,因为在这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且重启2MSL计时器
2、防止类似与”三次握手中提到了"已经失效的请求报文段"出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中就不会出现旧连接的请求报文

建立连接后客户端出现故障怎么办

TCP设有一个保活计时器,当客户端出现故障时,服务器不能一直等待下去,白白浪费资源。服务器每收到一个客户端的请求后都会复位这个计时器,时间通常设置为2小时,若超时后还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75s发送一次。若一连发送10个探测报文仍然没有反应,服务器就认为客户端出了故障,接着就关闭连接

TCP黏包与粘包问题

什么是黏包与粘包

TCP传输的是字节流,所谓流,就是发送的是一连串的数据,没有界限。TCP底层不会解析具体的数据内容,它会根据缓冲区的实际情况进行包的划分(发送和接收),由此会导致上层业务的一个完整的包被拆分成多个包进行发送(“拆包”),或者多个小包被封装成一个大的数据包进行发送(“粘包”),这就是所谓的TCP的拆包和粘包问题。

如何解决

1、固定应用层发送消息的长度,如果不够就补充空格
2、在包尾添加回车换行符进行分割
3、将消息分为消息头与消息体,消息头中包含长度
4、更复杂的应用层协议

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

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

相关文章

Mac 常用软件汇总

开发工具 1、Android Studio Android开发工程师对这个玩意是又爱又狠&#xff0c;爱它的灵活自由&#xff0c;恨他的放纵不羁。 2、Sourcetree git 图形化操作工具。 3、IntelliJ IDEA 开发Java项目神器。 4、Serial 串口调试工具。可以打印一些日志信息。 5、Navicat …

Python与pycharm-----windows安装与运行

目录 1.python下载 2.Python安装 3、安装并配置pycharm 1.python下载 上python官网下载。很多计算机自带python&#xff0c;如果不自带的话&#xff0c;需要官网下载。 选好版本&#xff0c;最好为3.7版本的。 2.Python安装 需要记下安装路径&#xff0c;免得后续找不到&am…

【算法系列】非线性最小二乘求解-梯度下降法

系列文章目录 【算法系列】卡尔曼滤波算法 【算法系列】非线性最小二乘求解-直接求解法 【算法系列】非线性最小二乘求解-梯度下降法 【算法系列】非线性最小二乘-高斯牛顿法 文章目录 系列文章 文章目录 前言 一、梯度下降法&#xff08;GD&#xff09; 二、最速下…

深度优先与宽度优先搜索(python)

算法原理 1、宽度优先搜索&#xff1a; 宽度优先搜索算法(Breadth First Search&#xff0c;BSF)&#xff0c;思想是&#xff1a; 从图中某顶点v出发&#xff0c;首先访问顶点v在访问了v之后依次从左往右访问v的各个未曾访问过的邻接点&#xff1b;然后分别从这些邻接点出发依…

loT行业生死竞速:Aqara绿米得用户得天下

作者 | 曾响铃 文 | 响铃说 日前&#xff0c;社科院发布了一份“2022年秋季中国宏观经济形势分析”报告&#xff0c;报告中指出当前&#xff0c;世界经济增长预期下挫&#xff0c;全球通胀居高不下&#xff0c;而中国经济整体仍呈持续恢复状态&#xff0c;但经济内增长动能仍…

【数据结构】树和二叉树以及经典例题

目录1.树的基本概念1.1 树的特点1.2 树的一些相关概念1.3 树的表示1.3.1 那种结构表示树最优&#xff1f;&#xff08;不是二叉树&#xff0c;就是普通的树&#xff09;1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09;2. 二叉树&#xff08;重点&#x…

嵌入式linux实现pppoe拨号上网

make menuconfig -> Device Drivers -> Network device support -> PPP (point-to-point protocol) 中&#xff0c;选中所有ppp选项。退出&#xff0c;保存配置&#xff0c;修改Makefile重新执行make zImage. 将arch/mips/boot/下的zImage下载到开发板上重启系统。 t…

oracle数据库的导入与导出

1、oracle数据库导入与导出需要注意 2、导出数据格式介绍 3、 传统方式exp(导出&#xff09;和&#xff08;imp&#xff09;导入 3.1 命令执行方式 3.2 命令格式 3.3 导出数据 3.3.1示例 3.4 导入数据 3.4.1 导入数据 4 使用PL/SQL Developer 实现数据导入与导出 4.1 导出与导…

文本分类微调技巧实战2.0

讯飞比赛答辩结束&#xff0c;笔者和小伙伴们参加了一些讯飞的比赛&#xff0c;今年讯飞文本分类比赛相比去年更加多元化&#xff0c;涉及领域、任务和数据呈现多样性&#xff0c;听完各位大佬的答辩之后&#xff0c;结合之前经验和以下赛题总结下文本分类比赛的实战思路。 1 …

allegro16.6导出版图到ADS2019仿真的方法

首先配置好allegro软件 1. 选择FILE->Script, 弹出窗口后选择Browse &#xff0c; 选择ADS对应文件夹下\Keysight\ADS2019\ial\scripts的描述文件&#xff0c;并勾选Change Directory 点击确认&#xff1b; 2.回到Scripting界面点击Replay &#xff1b; 在弹出的窗口红框位…

Au NPs/FA/PAMAM-DOX 金纳米粒子/叶酸/聚酰胺-胺型树枝状高分子修饰阿霉素的研究

下面小编要分享给大家的内容是Au NPs/FA/PAMAM-DOX 金纳米粒子/叶酸/聚酰胺-胺型树枝状高分子修饰阿霉素&#xff0c;和小编一起来看&#xff01; PAMAM-DOX 聚酰胺-胺型树枝状高分子修饰阿霉素制备方法&#xff1a; 采用逆向蒸发结合pH梯度法制备LLDs-PAMAM-DOX,观察形态,测定…

基于SpringBoot的体育场运营系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;采用HTML和Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Mav…

【QT知识】在widget中的绘制事件函数

在widget中的绘制事件函数 文章目录1. 代码实现头文件部分cpp文件部分2. 事件函数参考博客&#x1f60a;点此到文末惊喜↩︎ 1. 代码实现 头文件部分 #include <QWidget> #include <QPainter>namespace Ui { class widget_2_1; }class widget_2_1 : public QWid…

相控阵天线(四):阵列天线波束赋形(遗传算法、粒子群算法、进化差分算法)

目录波束赋形简介遗传算法波束赋形粒子群算法波束赋形差分进化算法波束赋形智能算法比较遗传算法波束赋形代码示例波束赋形简介 根据期望的方向图辐射特性(如方向图形状、主瓣宽度、副瓣电平、方向性系数)并以某种方法求得阵面电流分布并将此电流分布施加于相应通道中&#xf…

CCF CTO Club 16期活动记事——走进腾讯,实现连接

11月17日&#xff0c;有幸通过CCF CTO Club活动报名&#xff0c;参观了腾讯北京的总部&#xff0c;在腾讯总部大楼7层宴会厅尝到了美食&#xff0c;还参加了“云原生技术的探索与实践”专场讲座和讨论&#xff0c;味蕾和思维获得了双丰收。 参观腾讯总部 这次参观腾讯北京总部…

用 VS Code 搞 Qt6:信号、槽,以及QObject

用 VS Code 搞 Qt6&#xff1a;信号、槽&#xff0c;以及QObject Qt 里面的信号&#xff08;Signal&#xff09;和槽&#xff08;Slot&#xff09;虽然看着像事件&#xff0c;但它实际上是用来在两个对象之间进行通信的。既然是通信&#xff0c;就会有发送者和接收者。 1、信…

NodeJs实战-待办列表(3)-前端页面填充待办数据

NodeJs实战-待办列表3-前端页面填充待办数据为啥在前端填充待办数据&#xff1f;如何在前端填充待办数据&#xff1f;需要了解的知识页面修改后端服务封装数据返回server.js 修改效果图初始化页面添加待办事项完成待办事项为啥在前端填充待办数据&#xff1f; 第2节的页面数据…

Django基础学习

目录 1、Django MVT模型 2、Django项目和应用 2.1 项目和子应用的创建 2.2 子应用url路由配置 3、Django的templates配置 4、Django请求的处理 4.1 get请求处理 4.2 post请求处理 5、Django数据库操作 5.1、数据库连接配置 5.2、models.py配置 5.3、django数据库表的…

【node进阶】深度解析Koa框架---路由|静态资源|获取请求参数

✅ 作者简介&#xff1a;一名普通本科大三的学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强&a…

创建自己的函数库

创建自己的函数库前言一、什么是STM32标准函数库1.定义&#xff1a;2.作用&#xff1a;3.对比&#xff1a;二、构建库函数1.修改寄存器地址封装2.定义访问的结构体指针和引脚3.创建封装函数3.1创建拉低引脚函数3.2创建引脚初始化函数总结前言 回顾一下&#xff0c;前面点亮led…