一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理
文章目录
- 一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理
- 1.TCP建立连接需要3次握手
- 1.1 先讲个你兄弟的故事
- 1.2 TCP 3次握手
- 1.2 TCP 3次握手8件事
- 1.3 TCP握手能不能是两次
- 2. TCP 断开连接要4次挥手
- 2.1 还回到你兄弟的故事上
- 2.2 TCP 4次挥手
- 2.2 TCP4次挥手4件事
- 2.3 TIME_WAIT的作用是啥,为什么不能直接进入CLOSED状态
- 2.4 为什么TIME_WAIT要过2MSL才能进入CLOSEd状态
- 2.5 tcp连接管理中的保活机制
一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理
- TCP是面向连接的协议,在传输前必须要知道接收方存在还是不存在,所以在传输数据前后要经过3次握手和4次挥手
1.TCP建立连接需要3次握手
1.1 先讲个你兄弟的故事
- 先来个场景大白话讲一下
- 你有一块些黄金,要卖给你的好兄弟,然后你的好兄弟收到黄金后把现金寄给你。但因为太贵重了,你们不知道对方在不在家,能不能收到
- 所以在寄快递前,你两确认了一下
- 第一步,你给你的好兄弟先接了一封信,问问他在不在家(这时候信寄出去以后,你处于等对方的回信)
- 第二步,你的好兄弟给你回了一封信,告诉你他在家,但这个时候他不知道你已经知道他在家(他把信寄给你了,你处于等待回信的状态)
- 第三步,所以你又给你的好兄弟协议了一封信,告诉他,我收到你的信了,我知道你在家了,你准备好接收。(这时候你知道他在家了,他也知道你知道他在家了)
- 第四步,那既然都知道,就寄黄金呗。
- 这样一来一回,你们一共发了三封信,目的就是为了明确对方在不在,要干啥。这就是TCP的两个主机之间的三次握手。只不过你是寄黄金,TCP是发数据
1.2 TCP 3次握手
- 讲了上面的故事,相信大家应该明白了,接下来讲细节,就是我怎么寄的信,信里面有什么,你怎么回的信,信里面有什么
- 第一次握手,客户端给服务端发一个SYN(Synchronize Sequence Numbers:同步序列编号),并指明客户端的初始序列号ISN(Initial Sequence Number:初始序列号),此时客户端处于SYN_SENT状态
- 第二握手:服务器收到客户端的SYN报文后,会将自己的SYN报文发送给客户端,同时为了确认客户端的SYN,将客户端的ISN+1作为ACK(Acknowledgment character:确认字符)的值发送给客户端,此时服务端处于SYN_RCVD状态
- 客户端收到服务端的SYN报文后,会发送一个ACK报文,ACK的值为服务器的ISN+1.此时客户端处于ESTABLISHED状态。服务端收到ACK报文之后,也处于ESTABLISHED状态。此时,双方建立了链接
- 上图
1.2 TCP 3次握手8件事
- 说白了,如果要进行通讯,服务端要知道:自己和客户端的发送和接收能力正常;客户端要知道自己和服务端的发送和接收能力正常
- 也就是要确定下列几件事
- 客户端知道自己发送能力正常
- 客户端知道自己接受能力正常
- 客户端知道服务器发送能力正常
- 客户端知道服务器接收能力正常
- 服务器知道自己发送能力正常
- 服务器知道自己接受能力正常
- 服务器知道客户端发送能力正常
- 服务器知道客户端接接收能力正常
- 也就是说,通过三次握手,我们要确定这8件事
- 那么接下来看看每次握手的作用和完成的事情
- 一. 第一次握手,客户端发送数据包,服务端收到了;
- 得到的结论:服务端知道客户端的发送能力正常,即7完成,服务端知道自己的接收能力正常,即6完成(67)
- 二. 第二次握手,服务端发送数据包,客户端收到了
- 得到的结论:在第一次握手结论的基础上,客户端知道服务端的发送能力正常,即3完成,客户端知道服务端的接收能力正常,即4完成,客户端知道客户端的接收能力正常,即2完成;客户端知道自己的发送能力正常,即1完成(123467)
- 三. 第三次握手,客户端发送网络数据包,服务端收到了
- 得到的结论:在第二次结论的基础上,服务端知道自己的发送能力正常,即5完成,服务端知道客户端的接收能力正常,即8完成(12345678)
通过3次握手,确定了8件事,即确定了双方的发送和接受能力,而且确定了对方知道彼此的接收和发送能力正常;
- 得到的结论:在第二次结论的基础上,服务端知道自己的发送能力正常,即5完成,服务端知道客户端的接收能力正常,即8完成(12345678)
- 那就可以开始传输数据了
1.3 TCP握手能不能是两次
- 通过上面的8件事我们知道,如果少一次握手,哪个第五件事和第8件事,也就是服务端无法确定客户端的接受能力正常,服务端也无法确定自己的发送能力正常。那就有可能, 服务端认为自己发了,但是客户端收不到。
2. TCP 断开连接要4次挥手
2.1 还回到你兄弟的故事上
- 通过上面TCP连接后,你两现在一个可以把黄金一批批的寄过去了,另一个可以一批一批地把现金寄过来了。但问题是,你这边黄金总有寄完的时候吧。如果寄完了,你是不是得告诉你兄弟一声,让他知道,然后他也把剩下的钱寄给你。寄给你以后,你两两清了,就不用再来回邮寄了。
- 那这时候咱们分析一下
- 第一步,你这边黄金发完了,没得发了。所以你给你兄弟写了一封信,好兄弟,以后没黄金了,咱两可以不用再联系了。
- 第二步,你兄弟收到你的来信了,知道你没黄金了,以后也不寄了,但是还差最后一批黄金的钱没给你。于是你兄弟干了两件事。先是给你回了一封信,好的兄弟我知道了。但是还有一笔没给你结,稍后我给你寄过来。如果你收到这边钱了,给我说一声。咱两就断联。于是第一件事,信寄出去了。接着第二件事,把钱寄出去
- 第三步,你收到你兄弟最后一笔寄来的钱了,给他写信说,好兄弟我收到钱了,咱们断联。
- 这时,如果你兄弟收到钱了,就知道你两车企两清了,不用来回邮寄了。
- 这样一来一回,你发两封信,你兄弟发两封信,一共4封信,目的就是清算,挥手告别。所以这就是TCP的4次挥手断连
2.2 TCP 4次挥手
- 讲了上面的故事,接下来讲细节,看看写信的时候都具体说了啥
- 第一次挥手:客户端发送一个FIN报文,报文中指定一个序列号。此时客户端处于FIN_WAIT1状态,就是停止发送,等待服务端确认
- 第二次挥手,服务端收到FIN报文后,会发送ACK报文,且把客户端的序列号+1作为ACK报文的序列号,表明已经收到客户端的报文了,此时服务端处于CLOSE_WAIT状态
- 第三次挥手:如果服务端发送完数据了,也会发给客户端一个FIN报文,且制定一个序列号,此时服务端处于LAST_ACK状态
- 第四次挥手,客户端收到FIN之后,一样发送一个ACK报文,并把服务端的序列号+1作为序列号,此时客户端处于TIME_WAIT状态、需要过一整子,确保服务端收到自己的ACK报文后才会进入CLOSED状态,服务端收到ACK报文后,就处于关闭连接,进入CLOSEd状态
- 上图
2.2 TCP4次挥手4件事
- 说白了,告别就是在数据发完的前提下,互相知道不再发送,所以需要干完这4件事
- 客户端知道自己不再发送请求了
- 客户端知道服务器不再发送数据了
- 服务端知道客户端不再发送请求了
- 服务端知道自己不再发送数据了
- 那么接下来看4次挥手怎么完成的这些事
- 一,第一次挥手,客户端告诉服务器,我不在发送请求了
- 得出结论:客户端知道自己不再发送请求了,即1完成;服务端知道客户端不再发送请求了,即3完成(13)
- 二,第二次挥手,服务器告诉客户端,我知道你不再发送请求了,但是我可能还有数据要,等我也不发了,我再另外给你通知
- 得出结论,客户端知道服务端知道客户端不再发送请求了
- 三,第三次挥手,服务器告诉客户端,我不再发送数据了
- 得出结论,客户端知道服务端不再发送数据了,即2完成;服务端知道自己不再发送数据了,即4完成(1234)
- 四,第四次挥手,客户端告诉服务端,我收到你不再发送消息的通知了,我等你差不多收到消息(2MSL后)我就关闭了
- 得出结论,大家都可以关闭了
- OK,咱们断连,不再发送数据了
2.3 TIME_WAIT的作用是啥,为什么不能直接进入CLOSED状态
- 如果没有TIME_WAIT,状态,则服务器的FIN包没有得到最后的ack确认,超时后会重传。这样会下次的新链接产生影响,可能会刚打开就收到一个重传的包,或者客户端相同的服务端发送SKY连接请求但服务器处于LAST_ACK状态,要求收到的是ack而不是SYN,因此会发送RST重新建立请求
2.4 为什么TIME_WAIT要过2MSL才能进入CLOSEd状态
- 首先MSL是指网络中最大生存时间。
- 为什么要等2MSL,是因为客户端发送了对服务端的FIN确认包ASK后,不能确保ACK被接收到。如果接收不到,服务器端如果接收不到ACK包就会重新发送FIN包,所以客户端发送后等2MSL的时间,如果这个时间内没有收到重新的FIN包,说明收到了,那可以关闭了。
2.5 tcp连接管理中的保活机制
- TCP通信中,如果双方长时间没有数据往来,服务器会周期性向客户端发送探测数据报,要求客户端回复,如果连续多次没有收到响应,救人位连接已经断开。
- 周期为75s,如果连续超过9次,则认为断开
- 长时间未发送数据值得是超过7200s
相关文章:

一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理
文章目录 一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理1.TCP建立连接需要3次握手1.1 先讲个你兄弟的故事1.2 TCP 3次握手1.2 TCP 3次握手8件事1.3 TCP握手能不能是两次 2. TCP 断开连接要4次挥手2.1 还回到你兄弟的故事上2.2 TCP 4次挥手2.2 TCP4次挥手4件事2…...

CSS——1.优缺点
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><link rel"stylesheet" type"text/css" href"1-02.css"/></head><body><!--css:层叠样式表…...

TIM——编码器测速
Encoder Interface 编码器接口 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度 每个高级定时器和通用定时器都拥有1个编…...

抢先体验:人大金仓数据库管理系统KingbaseES V9 最新版本 CentOS 7.9 部署体验
一、简介 KingbaseES 是中国人大金仓信息技术股份有限公司自主研发的一款通用关系型数据库管理系统(RDBMS)。 作为国产数据库的杰出代表,它专为中国市场设计,广泛应用于政府、金融、能源、电信等关键行业,以高安全性…...

供应链系统设计-供应链中台系统设计(七)- 商品中心设计篇
概述 上篇文章我们大致讲了一些商品中心相关的概念,例如:SPU、SKU、Item等等,在这里我们来简单的回顾一下: 商品概念的分层与定义: SPU(Standard Product Unit):代表产品系列或产品…...

Power BI如何连接Azure Databricks数据源?
故事背景: 近期有朋友询问,自己公司有一些项目使用了Azure Databricks用于数据存储。如何使用Power BI Desktop桌面开发软件连接Azure Databricks的数据源呢? 解决方案: 其实Power BI是提供了连接Azure Databricks数据源的选项的,只是配置…...
【HarmonyOS】鸿蒙应用如何进行页面横竖屏切换以及注意事项,自动切换横竖屏,监听横竖屏
【HarmonyOS】鸿蒙应用如何进行页面横竖屏切换以及注意事项,自动切换横竖屏,监听横竖屏 一、鸿蒙应用如何进行页面横竖屏调用API手动切换 1.首先要在EntryAbility 中获取主窗口对象 EntryAbility.ets import { AbilityConstant, UIAbility, Want } fr…...
编译 C++ 程序:分离与保留调试信息以支持 GDB 对 Core 文件的调试
在 C 程序开发过程中,调试是一个非常重要的环节。当程序出现问题,尤其是在生产环境中出现崩溃并生成 Core 文件时,我们需要使用调试工具(如 GDB)对程序进行深入分析,找出问题的根源。为了在需要时能够有效地…...

009:传统计算机视觉之边缘检测
本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 本节来看一个利用传统计算机视觉方法来实现图片边缘检测的方法。 什么是边缘检测? 边缘检测是通过一些算法来识别图像中物体之间或者物体与背景之间的边界&…...

JAVA创建绘图板JAVA构建主窗口鼠标拖动来绘制线条
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...

机器人对物体重定向操作的发展简述
物体重定向操作的发展简述 前言1、手内重定向和外部重定向2、重定向原语3、重定向状态转换网络4、连续任意姿态的重定向5、利用其他环境约束重定向总结Reference 前言 对于一些特殊的任务(如装配和打包),对物体放置的位姿由明确的要求&#…...

自动驾驶三维重建
大概八成估计是未来的科研方向了 文章目录 自动驾驶中的NeRF[4]CLONeR:Urban Radiance Fields[6]S-NERFBlock-NeRFSwitch-NeRFSceneRFBehind the Scenes 大规模与自动驾驶场景重建:3D高斯VastGaussianPeriodic Vibration Gaussian(复旦大学)…...
30分钟学会css
CSS 基本语法 CSS(Cascading Style Sheets)是一种样式表语言,用于描述 HTML(或 XML)文档的呈现。它可以控制网页元素的颜色、字体、布局等外观样式,实现内容与表现的分离,让网页设计更加灵活和…...

vue路由模式面试题
vue路由模式 1.路由的模式有哪些?有什么区别? history和hash模式 区别: 1.表现的形态不同: 在地址栏url中:hash模式中带有**#**号,history没有 2.请求错误时表现不同: 在hash模式中,对于404地址请求时,不会进行请求 但是在history模式中,对于404请求时,仍然会进行请求…...
Python 开发框架搭建简单博客系统:代码实践与应用
在当今数字化时代,博客作为一种流行的信息分享和交流平台,拥有广泛的受众。Python 以其强大的功能和丰富的库,为构建博客系统提供了理想的技术支持。本文将详细介绍如何利用 Python 开发框架搭建一个简单博客系统,包括功能实现、代…...

如何在 VSCode 中配置 C++ 开发环境:详细教程
如何在 VSCode 中配置 C 开发环境:详细教程 在软件开发的过程中,选择一个合适的开发环境是非常重要的。Visual Studio Code(VSCode)作为一款轻量级的代码编辑器,凭借其强大的扩展性和灵活性,受到许多开发者…...

三甲医院等级评审八维数据分析应用(一)--组织、制度、管理可视化篇
一、引言 1.1 研究背景与意义 在当今医疗领域,三甲医院作为医疗服务的核心载体,肩负着保障民众健康、推动医学进步的重任。随着信息技术的飞速发展,数据已成为医院运营管理、医疗质量提升以及科学决策的关键要素。三甲医院等级评审作为衡量医院综合实力与服务水平的重要标…...

2024 年度总结|勇敢去探索~
写作这件事,果然是一旦中断,就很难再拾起来。但年度总结这么有意义的话题,思来想去,万万不能落下。 工作 得益于同事们的帮衬和认可,年初的时候,我的角色发生了变化:需要开始承担部门内的一些…...

2024年, Milvus 社区的那些事
随着跨年钟声响起,2024 年告一段落。这一年,Milvus GitHub Stars 正式突破 3 万大关,Docker 下载量突破6700w 次,达到一个新的里程碑,在开源向量数据库领域继续引领前行。在这遥遥领先的数据背后,不妨让我们…...

vue代理问题
vue代理问题 场景:前后端分离项目问题,在前端中请求接口,返回数据这个过程,但是在这个过程中,前端会有两个环境,一个是开发环境,一个是生产环境. 在开发环境中请求接口可能会遇到跨域问题,比如请求的端口是3000,当前端口是8080,这时候就会遇到跨域问题,或者ip不同,也会存在跨…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...