深入浅出理解TCP三次握手与四次挥手
目录
- 引言
- 1.为什么需要三次握手?
- 2. 三次握手的过程
- 3. 为什么需要四次挥手?
- 4. 四次挥手的过程
- 5. 为什么挥手需要四次,而握手只需三次?
- 6. 三次握手与四次挥手的时序图
- 7. TIME_WAIT状态的意义
- 8. 总结
- 9.面试时候问到什么是三次握手和四次挥手
引言
在计算机网络中,TCP(Transmission Control Protocol,传输控制协议) 是一种可靠的面向连接的协议,广泛应用于Internet的通信中。理解TCP中的三次握手和四次挥手机制,是掌握网络通信基础的重要环节。本文将深入浅出地介绍三次握手与四次挥手的工作原理。
1.为什么需要三次握手?
在通信开始时,TCP需要在客户端和服务器之间建立可靠的连接,确保双方准备好接收和发送数据。为此,TCP使用了三次握手的过程。这个握手的目的包括以下几点:
- 确保双方都收到了对方的消息,建立可靠的连接。
- 允许双方协商初始化序列号(Initial Sequence Number, ISN),以确保数据传输中的每一字节都有序。
2. 三次握手的过程
三次握手的具体过程如下:
-
第一次握手(SYN)
客户端发送一个SYN(Synchronize Sequence Numbers)报文给服务器,请求建立连接。这个报文包含了客户端的初始序列号ISN(c),表示客户端希望开始通信。- 客户端状态:SYN_SENT
-
第二次握手(SYN-ACK)
服务器接收到客户端的SYN报文后,响应一个SYN-ACK报文。这个报文既包含服务器的初始序列号ISN(s),也确认了客户端的ISN(c)。- 服务器状态:SYN_RCVD
-
第三次握手(ACK)
客户端收到SYN-ACK报文后,发送一个ACK报文确认服务器的序列号ISN(s),至此三次握手完成,双方进入连接建立状态。- 客户端状态:ESTABLISHED
- 服务器状态:ESTABLISHED
此时,连接已建立,双方可以开始传输数据。
3. 为什么需要四次挥手?
TCP不仅通过三次握手建立连接,还通过四次挥手来终止连接。由于TCP连接是全双工的(即双方可以同时发送和接收数据),因此关闭连接时需要双方分别关闭各自的数据传输通道。
4. 四次挥手的过程
-
第一次挥手(FIN)
客户端发送一个FIN(Finish)报文,表示它完成了数据传输,并希望关闭到服务器方向的连接。- 客户端状态:FIN_WAIT_1
-
第二次挥手(ACK)
服务器接收到客户端的FIN报文后,回复一个ACK报文,表示已收到关闭请求,但仍可能有未完成的数据需要发送。- 服务器状态:CLOSE_WAIT
- 客户端状态:FIN_WAIT_2
-
第三次挥手(FIN)
服务器发送完所有数据后,发送一个FIN报文,表示可以关闭连接。- 服务器状态:LAST_ACK
-
第四次挥手(ACK)
客户端收到服务器的FIN报文后,回复一个ACK报文,确认连接终止。此时,客户端进入TIME_WAIT状态,确保服务器收到了ACK,并等待一段时间后完全关闭连接。- 客户端状态:TIME_WAIT
- 服务器状态:CLOSED
5. 为什么挥手需要四次,而握手只需三次?
挥手需要四次的原因在于TCP连接的全双工性质。握手时,双方同步建立连接,发送方向和接收方向是对等的。而在挥手过程中,双方的关闭操作是独立的,一个方向关闭并不意味着另一个方向也可以立即关闭,因此需要额外的报文确认。
6. 三次握手与四次挥手的时序图
下面是一个简化的时序图,帮助大家理解三次握手和四次挥手的交互过程:
三次握手:
客户端 服务器| || SYN || ---------->|| || SYN-ACK ||<---------- || || ACK || ---------->|| 连接建立 |四次挥手:
客户端 服务器| || FIN || ---------->|| || ACK ||<---------- || || FIN ||<---------- || || ACK || ---------->|| 连接关闭 |
7. TIME_WAIT状态的意义
TIME_WAIT是TCP连接关闭过程中最后的一个重要状态。客户端在发送最后的ACK后进入TIME_WAIT,保持一段时间(一般为2倍的最大报文生存时间,即2MSL),确保服务器收到了ACK。如果在此期间服务器没有重发FIN报文,客户端才会真正关闭连接。
TIME_WAIT的主要作用有两点:
- 防止丢失的报文干扰后续连接。TIME_WAIT确保旧连接的报文不会影响新连接。
- 确保ACK可靠传输。客户端可能需要重新发送ACK确认服务器的FIN报文,因此需要保持连接一段时间。
8. 总结
通过三次握手,TCP确保双方能够可靠地建立连接,开始数据传输;通过四次挥手,TCP安全地终止连接,避免数据丢失和混乱。理解三次握手和四次挥手机制不仅有助于我们深入掌握TCP协议,还能帮助我们在网络调试与优化中,正确分析和解决连接问题。
这个过程虽然看似简单,但其背后蕴含了许多设计上的精妙之处,比如对序列号的管理、对状态的控制以及对数据传输可靠性的保证。
希望这篇文章能帮助你更好地理解TCP中的三次握手与四次挥手!
9.面试时候问到什么是三次握手和四次挥手
在面试中,如果被问到TCP的三次握手和四次挥手,可以简洁明了地回答:
三次握手是为了建立可靠的连接,客户端和服务器通过SYN和ACK报文进行序列号的同步,确保双方都能够正确接收和发送数据。握手的三次分别是:客户端发送SYN,服务器响应SYN-ACK,客户端再确认ACK,连接建立。
四次挥手是用于断开连接,由于TCP是全双工通信,双方的数据通道需要分别关闭,因此客户端和服务器会各自发送FIN和ACK报文,确保连接的双向关闭。挥手的四次则是客户端和服务器分别发送和确认FIN报文,最终安全断开连接。
这种介绍简要概括了流程和目的,展示了你对TCP连接机制的理解。
相关文章:
深入浅出理解TCP三次握手与四次挥手
目录 引言1.为什么需要三次握手?2. 三次握手的过程3. 为什么需要四次挥手?4. 四次挥手的过程5. 为什么挥手需要四次,而握手只需三次?6. 三次握手与四次挥手的时序图7. TIME_WAIT状态的意义8. 总结9.面试时候问到什么是三次握手和四…...
如何在Windows和Linux查看正在监听的端口和绑定的进程
端口(Port)和进程(Process)是计算机网络和操作系统中的重要概念,它们之间有着密切的关系。以下是对这两个概念的详细介绍以及它们之间的关系(附Windows和Linux查看端口和进程的命令): 端口(Por…...
如何用深度神经网络预测潜在消费者
1. 模型架构 本项目采用的是DeepFM模型,其结构结合了FM(因子分解机)与深度神经网络(DNN),实现了低阶与高阶特征交互的有效建模。模型分为以下几层: 1.1 FM部分(因子分解机层&#…...
基于opencv答题卡识别判卷
我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色:深度实…...
ShardingSphere分库分表产品介绍
目录 一、ShardingSphere分库分表产品介绍 二、客户端分库分表与服务端分库分表 1、ShardingJDBC客户端分库分表 2、ShardingProxy服务端分库分表 3、ShardingSphere混合部署架构 三、分库分表,能不分就不分! 1、为什么要分库分表? 2、…...
Java经典面试题-多线程打印
threadsynchronized 就好像一个圆圈,A->B->C->A。。。。。 synchronized能够保证多个线程进入实,只用一个线程能进入。 /**多线程交替打印* */ public class Task {private final Object lock new Object();private int count 0;public st…...
FireFox简单设置设置
文章目录 一 设置不显示标签页1原来的样子2新的样子3操作方法 二 设置竖直标签页栏1 效果图2 设置方法 三 设置firefox不提醒更新 一 设置不显示标签页 1原来的样子 2新的样子 3操作方法 地址栏输入 about:config搜索icon,双击选项列表中browserchrome.site icons的值&#…...
Sollong手机——一站式Web3生态解决方案
从定义上讲,Web3公司也属于互联网公司,不过与传统互联网公司相比,他们有一个很明显的特征:他们不断尝试做去中心化的事,一步步将数据和金融的控制权从美联储(央行和金融机构)、苹果(…...
《重生到现代之从零开始的数据结构生活》—— 顺序表1
线性表 线性表:是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的 数据结构,常⻅的线性表有顺序表、链表、栈、队列、字符串等等 线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连…...
2本书让你轻松入门大模型!《大模型入门:技术原理与实战应用》+《自然语言处理:大模型理论与实践》
随着大模型技术的不断完善和普及,我们将进入一个由数据驱动、智能辅助的全新工作模式和生活模式。个人和企业将能够利用大模型来降本增效,并创造全新的用户体验。 人工智能是人类探索未来的重要领域之一,以GPT为代表的大模型应用一经推出在短…...
【JDK17 | 1】Java 17 深入剖析:新特性与变革
引言 Java 17 是 Oracle 发布的一个重要版本,它不仅是一个长期支持(LTS)版本,还引入了许多新的特性和改进,为开发者提供了更强大的工具和更优雅的编程体验。在本专栏的文章中,我们将对 Java 17 的新特性进行深入剖析,帮助开发者更好地理解和利用这一版本。 1. 新特性概述…...
strtok
strtok函数原型 char *strtok(conset char *str,conset char *dst); 功能: 将字符串分割成一个一个片段 当strtok()在参数str的字符串中发现参数dst中包含的分割字符时,则会将该字符改为\0字符 当连续出现…...
零信任身份安全的基本原则
零信任身份安全的核心原则就是 “持续验证,永不信任”。可以通过以下6个方面理解: 对“谁”和“什么”进行认证和授权 在零信任身份安全模型中,对用户和设备的身份进行认证和授权是至关重要的。认证是确认用户或设备是其所宣称的身份的过程…...
【AAOS】Android Automotive 9模拟器源码下载及编译
源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r61 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch aosp_car_x86_64-userdebug make -j8 运行效果 emulator Home界面 MAP All apps S…...
手动降级wsl中的numpy
下载完pytorch之后想验证一下cuda好不好使,在测试的时候发现一个warning python中报错如下 我下载的pytorch版本比较低,numpy太高,所以需要手动给numpy降级 pip install numpy\<2 降级后再进到python验证cuda就没有warning和报错了&…...
极客兔兔Gee-Cache Day7
protobuf配置: 从 Protobuf Releases 下载最先版本的发布包安装。解压后将解压路径下的 bin 目录 加入到环境变量即可。 如果能正常显示版本,则表示安装成功。 $ protoc --version libprotoc 3.11.2在Golang中使用protobuf,还需要protoc-g…...
R包:APAlyzer从RNA-seq数据计算APA表达丰度
文章目录 介绍教程实战案例数据脚本运行 介绍 今天安利APAlyzer工具,它是通过RNA-seq数据获取3′UTR APA, intronic APA等表达谱的R包。 APAlyzer将bam文件比对到PolyA-DB数据库识别APA。 Most eukaryotic genes produce alternative polyadenylation (APA) isofo…...
YOLOv11改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性
一、背景 目标检测和实例分割中的关键问题: 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值,这降低了边界框回归的收敛速度和准确性。 现有损失函数的不足: 现有的基于 ℓ n \ell_n ℓn范数的损失函数简单但对各种尺度…...
dayu_widgets-简介
前言: 越来越多的人开始使用python来做GUI程序,市面上却很少有好的UI控件。即使有也是走的商业收费协议,不敢使用,一个不小心就收到法律传票。 一、原始开源项目: 偶然在GitHub上发现了这个博主的开源项目。https://github.com/phenom-films…...
改变数组页面重新渲染的操作/那些操作不会重新渲染页面以及解决方法
在前端开发中,当数组数据发生变化时,是否会导致页面重新渲染,以及如何进行相关操作,这取决于使用的具体框架或库(如React、Vue等)及其内部机制。以下是对这一问题的详细解答: 一、会导致页面重…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
