【计算机网络】TCP网络特点2


断开连接 四次挥手


原因

TCP 四次挥手是为了满足 TCP 连接的全双工特性:两个方向都可以自由传输

保证数据传输的完整性:两方都完成了数据发送和接收并且都同意断开连接

可靠地终止连接以及避免数据混淆和错误等需求:每个方向都需要单独确认导致四次挥手过程

这些步骤确保了网络通信的可靠性和稳定性,是 TCP 协议的重要组成部分

流程

  1. 第一次挥手
    • 动作发起方:客户端。当客户端完成数据传输任务后,想要关闭连接,就会向服务器发送一个带有 FIN(Finish)标志位的报文段,表示客户端不再发送数据。
    • 客户端状态变化:发送完 FIN 报文后,客户端进入 FIN_WAIT_1(终止等待 1)状态,等待服务器的确认。
  2. 第二次挥手
    • 动作发起方:服务器。服务器收到客户端的 FIN 报文后,知道客户端想要关闭连接,就会返回一个 ACK(Acknowledgment)确认报文段,表示已经收到了客户端的关闭请求。
    • 服务器状态变化:此时服务器进入 CLOSE_WAIT(关闭等待)状态。在这个状态下,服务器可能还会继续向客户端发送一些剩余的数据。而客户端收到服务器的 ACK 报文后,进入 FIN_WAIT_2(终止等待 2)状态,继续等待服务器发送关闭连接的请求。
  3. 第三次挥手
    • 动作发起方:服务器。当服务器完成所有数据的发送后,就会向客户端发送一个带有 FIN 标志位的报文段,告知客户端自己也准备好关闭连接了。
    • 服务器状态变化:发送完该报文后,服务器进入 LAST_ACK(最后确认)状态,等待客户端的最后确认。
  4. 第四次挥手
    • 动作发起方:客户端。客户端收到服务器的 FIN 报文后,会向服务器发送一个 ACK 确认报文段,表示已经收到了服务器的关闭请求。
    • 客户端状态变化:发送完 ACK 报文后,客户端进入 TIME_WAIT(时间等待)状态。在这个状态下,客户端会等待一段时间通常是 2 倍的报文最大生存时间 2MSL,以确保服务器能够收到最后一个 ACK 报文。如果在 TIME_WAIT 状态期间没有收到服务器的重传请求,客户端就会认为服务器已经成功收到了 ACK 报文,然后关闭连接,进入 CLOSED 状态服务器收到客户端的 ACK 报文后,也会关闭连接,进入 CLOSED 状态。

注意

                1 经过四次挥手就已经断开了

                2 客户端和服务端都可以主动断开

                3 每次收到一个有效的数据就立即回复ACK告诉对方接收成功防止超时重传

                4 其他包可以和ack一起发送

问题

问题一: 被动方在FIN包之后,为什么没有立即回复FIN包,为什么要立即回复ACK包?

               1 主动方发送完FIN之后 就不在发送数据了 

               2 可是被动方可能还需要发送数据 

               3 要立即ACK回复防止超时重传 

               4 不能发送FIN因为被对方可能还需要发送数据 

               5 FIN包在TCP协议中也被当成一种特殊报文需要ACK确认 确保信息传递准确和可靠性

问题二: 主动断开方在发送最后一次ACK包之后为什么要等待2msl以后再关闭?

               1 2mls (两个数据包在网络中存在最大时间

               2 主动方发送的ack可能丢失 触发被动发超时重传 会再向主动方发送FIN

              3  2mls时间再没有收到新的fin则说明被动方收到了最后指令主动方可以关闭了


滑动窗口

定义

滑动窗口是 TCP用于流量控制和拥塞控制的一种机制。它允许发送方在收到接收方的确认之前可以连续发送多个数据包,而接收方通过告知发送方自己的接收窗口大小来控制发送方的发送速度。

流程

发送方操作
  • 开始时,发送窗口大小由接收方告知。发送方在窗口内发送数据段,每发送一个数据段,窗口的下限不变,但上限会根据已发送但未确认的数据段数量动态变化。
  • 当收到接收方的确认(ACK)后,发送窗口下限会根据确认号向前移动。
接收方操作
  • 接收方根据自己的缓冲区大小设定接收窗口大小。
  • 接收方在处理数据的过程中,会不断地从缓冲区中取出数据进行处理,
  • 当缓冲区有了更多空间后,又会增大接收窗口大小并告知发送方,
  • 发送方可以再次增大发送窗口上限,发送更多的数据。

作用

流量控制
  • 防止接收方被发送方的数据 “淹没”
提高传输效率
  • 相比于停止 - 等待协议
  • 发送方发送一个数据段后等待接收方确认,收到确认后再发送下一个数据段
  • 滑动窗口允许发送方在收到确认之前发送多个数据段,
  • 充分利用了网络带宽,提高了数据传输的效率。

应用

接收方缓冲区状态
  • 如前面所述,当接收方缓冲区快满时,会减小接收窗口大小;当缓冲区有更多空间时,会增大接收窗口大小
网络拥塞状况
  • 在拥塞控制机制下,如果网络出现拥塞(如路由器缓冲区溢出、链路带宽饱和等情况),发送方会减小发送窗口大小,减少注入网络的数据量,以缓解拥塞。
应用层需求和协议限制
  • 有些应用可能对数据传输的速度和顺序有特殊要求,这也会影响窗口大小的调整。

在数据接收时候 如果丢失了数据 接收端返回最小序列丢失号之前ACK


流量控制

原因

避免数据丢失:如果发送方发送的数据量超过了接收方缓冲区所能容纳,超出部分的数据将会丢失

确保接收方正常处理数据:接收方处理数据的速度是有限的。如果发送方发送数据的速度太快,接收方可能来不及处理,导致数据在缓冲区堆积。这不仅可能会引起数据丢失,还可能会使接收方系统出现性能问题。

方法

接收方传递信息给发送方 使其不要太快发送数据 

是一种端对端的控制 主要方式就是返回ACK中会包含接收窗口大小

利用窗口大小控制发送方的数据发送多少

接收方发送ack返回窗口大小

利用窗口大小控制发送数据大小


粘包问题

粘包原因

TCP字节流传输

  • TCP 是面向字节流的协议是一种没有边界的 可合并的传输数据方式 ,它不像 UDP(用户数据报协议)那样有消息边界。这意味着 TCP 会把应用层交付的数据仅仅看作是一连串的字节,而不关心这些字节具体代表几个完整的消息。例如,发送方连续发送了两个小消息,在接收方的底层缓冲区中,这两个消息可能会被当作一个连续的字节流接收,从而出现粘包现象。

Nagle 算法的影响

  • Nagle 算法是为了减少网络中微小数据包(小包)的数量而设计的。它会将多个小的发送请求合并为一个较大的发送请求。例如,应用程序连续调用多次发送函数发送小数据块,Nagle 算法会将这些小数据块缓存起来,直到满足一定条件(如积累了足够的数据或者收到了之前发送数据的确认)才会发送。这样一来,在接收方就可能会收到合并后的大数据块,产生粘包问题。

解决方法


1 设置标志位

起始标志位

缺点:最后一个包 不知到哪个是结尾

场景:适用在发送的内容比较固定,或者已知的场景下

结束标志位

缺点:但是传输数据可能和标志相同 无法判断 错误拆包

场景:发送内容都是固定的没有用户输入内容 不可能和标志位重复


2 固定包大小

缺点: 弊端 当传输数据小于空间时候 会浪费空间

适用场景: 发送大文件 文件较大 就得分几次发送


3 先发送长度 在发送数据包

方法: 发送长度,发送数据


4 短连接

方法:  每次发送SOCKET时候 使用新的缓冲区 将数据放在不同缓冲区就不会粘包

             每次发送之前申请新的socket

 缺点: 每次发送之前都需要建立连接 浪费时间和空间  资源

使用场景: 用户发送数据操作间隔时间很长时候


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

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

相关文章

Opengl光照测试

代码 #include "Model.h" #include "shader_m.h" #include "imgui.h" #include "imgui_impl_glfw.h" #include "imgui_impl_opengl3.h" //以上是放在同目录的头文件#include <glad/glad.h> #include <GLFW/glfw3.…

【MySQL】SQL语言

【MySQL】SQL语言 文章目录 【MySQL】SQL语言前言一、SQL的通用语法二、SQL的分类三、SQLDDLDMLDQLDCL 总结 前言 本篇文章将讲到SQL语言&#xff0c;包括SQL的通用语法,SQL的分类,以及SQL语言的DDL,DML,DQL,DCL。 一、SQL的通用语法 在学习具体的SQL语句之前&#xff0c;先来…

.netcore + postgis 保存地图围栏数据

一、数据库字段 字段类型选择(Type) 设置对象类型为&#xff1a;geometry 二、前端传递的Json格式转换 前端传递围栏的各个坐标点数据如下&#xff1a; {"AreaRange": [{"lat": 30.123456,"lng": 120.123456},{"lat": 30.123456…

T265相机双目鱼眼+imu联合标定(全记录)

最近工作用到t265&#xff0c;记录一遍标定过程 1.安装驱动 首先安装realsense驱动&#xff0c;因为笔者之前使用过d435i&#xff0c;装的librealsense版本为2.55.1&#xff0c;直接使用t265会出现找不到设备的问题&#xff0c;经查阅发现是因为realsense在2.53.1后就不再支持…

【C语言指南】C语言内存管理 深度解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C语言指南》 期待您的关注 引言 C语言是一种强大而灵活的编程语言&#xff0c;为程序员提供了对内存的直接控制能力。这种对内存…

Python学习从0到1 day26 第三阶段 Spark ④ 数据输出

半山腰太挤了&#xff0c;你该去山顶看看 —— 24.11.10 一、输出为python对象 1.collect算子 功能: 将RDD各个分区内的数据&#xff0c;统一收集到Driver中&#xff0c;形成一个List对象 语法&#xff1a; rdd.collect() 返回值是一个list列表 示例&#xff1a; from …

【机器学习】机器学习中用到的高等数学知识-1.线性代数 (Linear Algebra)

向量(Vector)和矩阵(Matrix)&#xff1a;用于表示数据集&#xff08;Dataset&#xff09;和特征&#xff08;Feature&#xff09;。矩阵运算&#xff1a;加法、乘法和逆矩阵(Inverse Matrix)等&#xff0c;用于计算模型参数。特征值(Eigenvalues)和特征向量(Eigenvectors)&…

java项目-jenkins任务的创建和执行

参考内容: jenkins的安装部署以及全局配置 1.编译任务的general 2.源码管理 3.构建里编译打包然后copy复制jar包到运行服务器的路径 clean install -DskipTests -Pdev 中的-Pdev这个参数用于激活 Maven 项目中的特定构建配置&#xff08;Profile&#xff09; 在 pom.xml 文件…

【数据库取证】快速从服务器镜像文件中获取后台隐藏数据

文章关键词&#xff1a;电子数据取证、数据库取证、电子物证、云取证、手机取证、计算机取证、服务器取证 小编最近做了很多鉴定案件和参加相关电子数据取证比武赛&#xff0c;经常涉及到服务器数据库分析。现在分享一下技术方案&#xff0c;供各位在工作中和取证赛事中取得好成…

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined

VUE_PROD_HYDRATION_MISMATCH_DETAILS 未明确定义。您正在运行 Vue 的 esm-bundler 构建&#xff0c;它期望这些编译时功能标志通过捆绑器配置全局注入&#xff0c;以便在生产捆绑包中获得更好的tree-shaking优化。 Vue.js应用程序正在使用ESM&#xff08;ECMAScript模块&#…

git撤销、回退某个commit的修改

文章目录 撤销某个特定的commit方法 1&#xff1a;使用 git revert方法 2&#xff1a;使用 git rebase -i方法 3&#xff1a;使用 git reset 撤销某个特定的commit 如果你要撤销某个很早之前的 commit&#xff0c;比如 7461f745cfd58496554bd672d52efa8b1ccf0b42&#xff0c;可…

Flume和kafka的整合

1、Kafka作为Source 【数据进入到kafka中&#xff0c;抽取出来】 在flume的conf文件夹下&#xff0c;有一个flumeconf 文件夹&#xff1a;这个文件夹是自己创建的 创建一个flume脚本文件&#xff1a; kafka-memory-logger.conf Flume 1.9用户手册中文版 — 可能是目前翻译最完…

JavaSE常用API-日期(计算两个日期时间差-高考倒计时)

计算两个日期时间差&#xff08;高考倒计时&#xff09; JDK8之前日期、时间 Date SimpleDateFormat Calender JDK8开始日期、时间 LocalDate/LocalTime/LocalDateTime ZoneId/ZoneDateTIme Instant-时间毫秒值 DateTimeFormatter Duration/Period

支持向量机SVM——基于分类问题的监督学习算法

支持向量机&#xff08;SVM&#xff0c;Support Vector Machine&#xff09;是一种常用于分类问题的监督学习算法&#xff0c;其核心思想是通过寻找一个最佳的超平面来将不同类别的数据点分开&#xff0c;从而实现分类。支持向量机广泛应用于模式识别、文本分类、图像识别等任务…

node对接ChatGpt的流式输出的配置

node对接ChatGpt的流式输出的配置 首先看一下效果 将数据用流的方式返回给客户端,这种技术需求在传统的管理项目中不多见,但是在媒体或者有实时消息等功能上就会用到,这个知识点对于前端还是很重要的。 即时你不写服务端,但是服务端如果给你这样的接口,你也得知道怎么去使用联…

SobarQube实现PDF报告导出

文章目录 前言一、插件配置二、使用步骤1.新生成一个Token2.将拷贝的Token加到上文中执行的命令中3.查看报告 三、友情提示总结 前言 这篇博文是承接此文 .Net项目在Windows中使用sonarqube进行代码质量扫描的详细操作配置 描述如何导出PDF报告 众所周知&#xff0c;导出PDF功…

[Codesys]常用功能块应用分享-BMOV功能块功能介绍及其使用实例说明

官方说明 功能说明 参数 类型 功能 pbyDataSrcPOINTER TO BYTE指向源数组指针uiSizeUINT要移动数据的BYTE数pbyDataDesPOINTER TO BYTE指向目标数组指针 实例应用-ST IF SYSTEM_CLOCK.AlwaysTrue THENCASE iAutoState OF0: //读写完成信号在下次读写信号的上升沿或复位信号…

sql注入之二次注入(sqlilabs-less24)

二阶注入&#xff08;Second-Order Injection&#xff09;是一种特殊的 SQL 注入攻击&#xff0c;通常发生在用户输入的数据首先被存储在数据库中&#xff0c;然后在后续的操作中被使用时&#xff0c;触发了注入漏洞。与传统的 SQL 注入&#xff08;直接注入&#xff09;不同&a…

springboot实现简单的数据查询接口(无实体类)

目录 前言&#xff1a;springboot整体架构 1、ZjGxbMapper.xml 2、ZjGxbMapper.java 3、ZjGxbService.java 4、ZjGxbController.java 5、调用接口测试数据是否正确 6、打包放到服务器即可 前言&#xff1a;springboot整体架构 文件架构&#xff0c;主要编写框选的这几类…

我的第一个PyQt5程序

PyQt5的开发环境配置完成之后&#xff0c;开始编写第一个PyQt5的程序。 方法一&#xff1a;使用将.ui转换成.py文件的方法 import sys from FirstPyQt import Ui_MainWindow from PyQt5.QtWidgets import *#QtCore,QtGui,QtWidgets # from QtTest import Ui_MainWindow#导入Q…