TCP 连接的“三次握手”与“四次挥手”

目录

什么是“三次握手” “四次挥手”?

三个标记位 

三次握手 

四次挥手 

为什么握手三次,挥手需要四次?

为什么要等2MSL?


什么是“三次握手” “四次挥手”?

三次握手(Three-way Handshake):其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。

四次挥手(Four-way handshake):TCP 连接的拆除需要发送四个包,因此称为四次挥手。

三个标记位 

SYN(Synchronize):用于建立连接的初始握手。发送方发送一个SYN报文段给接收方,请求建立连接。

ACK(Acknowledgement):用于确认数据的传输。当成功接收到数据后,接收方发送一个带有ACK标记的报文段回复发送方,确认已经收到了数据。 

FIN(Finish):用于关闭连接。当发送方发送完所有数据后,会发送一个带有FIN标记的报文段,请求关闭连接。  接收方在收到FIN报文段后,发送一个带有ACK标记的报文段进行确认,并使用一个定时器在一段时间后关闭连接。

刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。 

三次握手 

第一次握手:客户端发送网络包,服务端收到了。
这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。
这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。
这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。 

         到此,三次握手的过程就算结束了。最后,当服务器收到客户端的 ACK 报文之后,也处于 ESTABLISHED 状态。此时,连接就已经建立成功了。 

四次挥手 

第一次挥手:客户端向服务器发送一个FIN(结束)请求,表示客户端不再发送数据。此时客户端处于FIN_WAIT_1状态。
第二次挥手:服务器收到请求后,回复客户端一个ACK响应确认,但这个响应可能还携带有未传输完的数据。此时服务器处于CLOSE_WAIT状态。注意,在第三次挥手之前,数据还是可以从服务器传送到客户端的。
第三次挥手:服务器完成数据传输后,向客户端发送一个FIN请求,表示服务器也没有数据要发送了。此时服务器状态变为LAST_ACK状态。
第四次挥手:客户端收到服务器的请求后,回复服务器一个ACK响应确认。此时客户端处于TIME_WAIT状态,需要经过一段时间确保服务器收到自己的应答报文后,才会进入CLOSED状态。


 

        到这里,四次挥手就已经结束了。最后,服务器收到ACK报文后,就关闭连接,也处于CLOSED状态了。

为什么握手三次,挥手需要四次?

        因为当握手时,服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。所以需要四次挥手。

为什么要等2MSL?

       为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。

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

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

相关文章

力扣刷题 -- 206.反转链表

题目: 方法一:创建新链表,遍历旧链表,进行头插 代码实现: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struc…

Vue 中的过渡效果与响应式数据:transition、transitiongroup、reactive 和 ref 详解

在 Vue 开发过程中,为应用添加过渡效果和处理响应式数据是提升用户体验和实现动态交互的关键。 一、transition:元素的单元素过渡效果 transition是 Vue 提供的内置组件,专门用于为单个元素或组件添加过渡动画。它会在元素插入、更新或移除…

文章七《深度学习调优与超参数优化》

🚀 文章7:深度学习调优与超参数优化——你的AI模型需要一场"整容手术" 一、模型调优核心策略:像调整游戏装备一样优化模型 1. 学习率调整:掌控训练的"油门踏板" 比喻:把模型训练想象成赛车游戏&…

Python装饰器执行时机详解:模块加载时的魔法

装饰器执行的基本原理 Python装饰器在程序运行过程中遵循独特的执行逻辑,其核心特性体现在模块加载阶段的即时执行。通过示例7-2的registration.py 模块,我们可以清晰观察到装饰器与函数执行的时序差异。 registry []def register(func):print(runnin…

基于随机森林的糖尿病预测模型研究应用(python)

基于随机森林的糖尿病预测模型研究应用 1、导入糖尿病数据集 In [14]: import pandas as pd import seaborn as sns import numpy as np import matplotlib.pyplot as plt datapd.read_csv(./糖尿病数据集.csv,encoding"gbk") data.head()#查看前五行数据Out[14]:…

【Web应用服务器_Tomcat】二、Tomcat 核心配置与集群搭建

在企业级 Java Web 应用的部署场景中,Tomcat 作为主流的 Servlet 容器和 Web 服务器,其核心配置的优化以及集群搭建对于保障应用的高性能、高可用性至关重要。 一、Tomcat 核心配置优化​ 1.1 server.xml 配置文件解析​ Tomcat 的核心配置文件server…

Linux(文件管理)

文件命名规则 除了字符“/”之外&#xff0c;所以的字符都可以使用&#xff0c;但要注意&#xff0c;在目录名或文件名中&#xff0c;不建议使用某些特殊字符&#xff0c;如&#xff1a;<、>、?、*等 如果一个文件名中包含了特殊字符&#xff0c;例如空格&#xff0c;那…

Windows服务器部署全攻略:Flask+Vue+MySQL跨平台项目实战(pymysql版)

当你的后端(Flask+pymysql,Windows开发)与前端(Vue,Mac开发)需要统一部署到Windows服务器时,通过「IIS反向代理+原生组件适配」方案可实现稳定交互。以下是针对Windows环境的专属部署指南,解决路径适配、服务启动等核心问题。 一、Windows服务器环境准备(必做!) 1…

wpf 输入框 在输入时去除水印

wpf ScrollViewer 在输入数据时去除水印 在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;ScrollViewer控件通常用于显示滚动内容。如果你想在ScrollViewer中使用数据输入&#xff08;例如文本输入&#xff09;&#xff0c;并且希望在输入时去除水…

动态思维——AI与思维模型【91】

一、定义 动态思维思维模型是一种强调在思考问题和分析情况时&#xff0c;充分考虑到事物的变化性、发展性和相互关联性&#xff0c;不局限于静态的、孤立的视角&#xff0c;而是以发展变化的眼光看待事物&#xff0c;能够根据不同时间、环境和条件的变化&#xff0c;灵活调整…

多模态大语言模型arxiv论文略读(五十五)

MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文标题&#xff1a;MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文作者&#xff1a;Kunpeng Song, Yizhe Zhu, Bingchen Liu, Qing Yan, Ahmed Elgammal, Xiao…

Go-web开发之帖子功能

帖子功能 route.go r.Use(middleware.JWTAuthMiddleware()){r.POST("/post", controller.CreatePostHandler)r.GET("/post/:id", controller.GetPostDetailHandler)}post.go 定义帖子结构 type Post struct {Id int64 json:"id" …

C++ 项目中的多语言字符串管理方案(支持自动提示与动态加载)

&#x1f4ac; C 项目中的多语言字符串管理方案&#xff08;支持自动提示与动态加载&#xff09; 在中大型 C 应用中&#xff0c;我们常常会面临界面提示文本繁多、需要支持多语言切换的问题。为了解决字符串管理混乱、缺乏自动提示、难以维护等问题&#xff0c;本文将提供一种…

数控滑台:将制造业推向智能化的关键装备

随着制造业的不断发展和智能化进程的加速推进&#xff0c;数控滑台作为一种关键的装备&#xff0c;在各种工业生产中发挥着越来越重要的作用。数控滑台不仅提高了生产效率&#xff0c;节约了人力物力资源&#xff0c;还大大降低了生产过程中的错误率&#xff0c;保障了产品的质…

【STM32】定时器输入捕获

STM32 定时器输入捕获功能笔记 一、什么是输入捕获&#xff08;Input Capture&#xff09; 输入捕获是利用定时器的输入通道&#xff0c;在检测到信号电平变化&#xff08;如上升沿或下降沿&#xff09;时&#xff0c;立即将当前计数器的值捕获并保存到捕获寄存器&#xff08…

Qt通过QXlsx库文件写入到excl文件,读取excl文件

第一&#xff1a;下载QXlsx库文件 https://download.csdn.net/download/qq_32663053/90739425 第二&#xff1a;在Qt项目中引入QXlsx库&#xff0c;需要把QXlsx库文件放在项目文件夹下 第三&#xff1a;将tableview中的数据存入到excl文件 代码&#xff1a; void MainWindow…

【KWDB 创作者计划】一款面向 AIoT 的多模数据库实战体验

一、KWDB&#xff1a;AIoT 时代的数据库新选择 KWDB 是由开放原子开源基金会孵化的分布式多模数据库&#xff0c;专为物联网、工业互联网等场景设计。其核心价值在于时序与关系数据融合处理能力&#xff1a; ​多模统一引擎​&#xff1a;单个实例可同时建立时序库&#xff08…

【教学类-102-22】蝴蝶彩色1——通义万相“彩色蝴蝶”透明切边基础图片制作(五款板式、批量下载、修图、透明、切边)

一、下载图片 关键词&#xff1a;卡通简笔画&#xff0c;白色背景&#xff0c;黑白轮廓线&#xff0c;、鲜艳&#xff0c;彩色&#xff0c;一只蝴蝶&#xff0c;简单&#xff0c;可爱&#xff0c;矢量图&#xff0c;大。 简笔画 强度1 4:3(长方形适配A4纸&#xff09; 五…

【JAVA】方法定义与重载:JVM方法调用机制(8)

核心知识点详细解释 Java方法的定义和使用 在Java中&#xff0c;方法是一段具有特定功能的代码块&#xff0c;它可以接受参数并返回一个值。方法的定义包括方法的修饰符、返回类型、方法名、参数列表和方法体。其基本语法如下&#xff1a; 修饰符 返回类型 方法名(参数列表)…

基于STM32的带恒温系统智能外卖柜设计

标题:基于STM32的带恒温系统智能外卖柜设计 内容:1.摘要 随着外卖行业的迅速发展&#xff0c;对外卖存放设备的智能化和功能性要求日益提高。本设计的目的是开发一种基于STM32的带恒温系统智能外卖柜。方法上&#xff0c;以STM32微控制器为核心&#xff0c;结合温度传感器、加…