TCP三次握手,四次挥手(从状态的角度分析)

TCP四次挥手详解 1、四次挥手状态及消息类型 第一次挥手:假设客户端打算关闭连接,发送一个TCP首部FIN被置1的FIN报文给服务端。 第二次挥手:服务端收到以后,向客户端发送ACK应答报文。 第三次挥手:等待服务端处理完数据后,向客户端发送FIN报文。 第四次挥手:客户端接收到FIN报文后回一个ACK应答报文。 服务器收到ACK报文后,进入close状态,服务器完成连接关闭。 客户端在经过 2MSL一段时间后,自动进入close状态,至此客户端也完成连接的关闭。 2、为什么挥手需要四次? 关闭连接时,客户端发送FIN报 阅读详情

但是,我发觉我的知识来源大多来自《计算机网络-自顶向下》那本,这本书没有过多的考虑TCP三次握手中的相关状态转移细节,导致当时回答的并不是特别好,这次决定好好把这块知识好好巩固一下。
首先,我们先来一张大家都非常熟悉的图:
这里写图片描述
相信大家对这张图已经熟得不能再熟悉的,但我这次要应用程序的角度来说下:
1.客户端的socket(socket描述符)调用connect主动打开连接(当然要指定服务器的IP地址)这个时候,connect函数阻塞住等待下面的回信,然后发送SYN=1的包。
2.服务器端这时候创建socket,然后bind端口,开启监听,调用accept(阻塞),这时候收到了SYN。然后,从服务器上创建连接描述符,也就是创建了缓存空间,反回去发送SYN K,ack J+1(客户端的SYN),发送回客户端。
3.客户端这时候的connect返回,发送了ack K+1。服务端accept返回,连接成功,进行read,write读写,read这时候发生阻塞。
咋看之下,这个过程非常简单。但是,往深挖了就很多不会了,我也没太回答上来:

问题一

TCP在三次握手的时候一共传输了哪些消息:
SYN=1,ACK,序列号,看似只有这三个东西。还有目的IP,目的端口号,源IP,源端口号,还有一个最重要的接收窗口,接收窗口是在报文端里面进行控制的,但是我们的滑动窗口是在我们的操作系统中实现的。

问题二

滑动窗口的大小如何控制?
这个我们可以和拥塞窗口相互联系起来,刚开始的大小非常小,然后我们线性增大,一旦碰到了拥塞的情况,我们的窗口迅速减半。

问题三

TCP是几元组?
五元组,分别是源端口,源IP,目的端口,目的IP,还有一个运输层协议

下面,还是把四次握手的图一起放上来,好做理解:
这里写图片描述

你以为这样三次握手就完了吗。。。
我们还没讲状态呢?
来上图:
这里写图片描述
大家第一眼看这图肯定懵逼。没事,我们一步步来解决这个图。
对于三次握手:
(1).对于客户端而言:我们原来处理CLOSED的状态,然后我们客户端调用connect进行主动打开,发送SYN,之后我们便进入了SYN_SEND,这个时候我们应该准备的事情就是等待服务端的ACK了。
(2)对于服务端而言:开启服务端的时候从CLOSED转移到LISTEN,我们ACCEPT一个客户端的connect,我们处于被动打开的状态,从LISTEN状态转移到SYN_RCVD状态,并发送SYN K和ACK=SYN J+1。我们等待客户段的ACK应答。
(3)对于客户端而言:收到了服务端的SYN K和ACK=SYN J+1.客户端的阻塞connect连接成功,状态转移到了ESTABLISHED,并发送ACK=K+1,到服务端。
(4)对于服务端而言:收到客户端的ACK,状态转移到了ESTABLISHED。三次握手结束
(5)超时情况或应用close:继续转移到CLOSED的起始状态。

服务端和客户端都到了ESTABLISHED,说明可以进行传输信息。
这时候我们再来关注一下关闭服务器的场景是如何?
(1)客户端:调用close函数,发送FIN,到达FIN_WAIT_1状态,等待服务端的ACK过来。
(1)服务端:接收到客户端的FIN信息,发送ACK,并且到CLOSE_WAIT,服务端关闭与客户端的连接,并发送FIN.
(2)客户端:接收到服务端的ACK包,到达FIN_WAIT_2状态,并等待服务端发送FIN包。
(2)服务端:服务端开始发送FIN信息,到达LAST_ACK状态。
(3)客户端:接收到服务端的FIN信息,状态转移到TIME_WAIT状态。并发送 ACK包到服务端。
(3)服务端:接收到客户端的ACK信息,状态由LAST_ACK转移到CLOSED状态。
(3)客户端:超过2MSL时候后返回到CLOSED状态。

感觉字有点多,我们继续把这个过程简化到一张图上面:
这里写图片描述
这个图将我们的状态转移和三次握手、四次挥手的图都放在了一张折线图上面。
这就是我们要说的从状态转移的角度来说明TCP三次握手,四次挥手。
不知道大家有没发觉一个很奇怪的状态,也就是TIME_WAIT这个状态,是否判断2MSL超时。
给大家说明一下MSL是什么意思?MSL代表着IP报文能在互联网中存在的最长时间,2个MSL代表客户端和服务端的一个IP报文能在互联网中存在的最长时间总和。超过这个时间就说明出现了超时事件要进行重发。
那么,我们的TIME_WAIT的作用到底是什么呢,这里有两点:
1.实现终止TCP全双工连接的可靠性
2.允许老的重复分组在网络中消逝
对于1而言,假设在图中服务端的最后一个FIN未发送成功,经过一个MSL,之后服务端会重发送一个FIN。这就需要两个MSL时间让客户端进行审核。所以,客户端进入TIME_WAIT需要2个MSL时间。
对于2而言,是为了解决在结束这个连接之后,又建立起一个新的连接。为了避免这个新连接得到前一个连接的重发分组,2个MSL保证两个方向的重发分组都被抛弃掉了。
对于UDP而言,三次握手和四次挥手的过程将会被全部抛弃掉,这样看来,TCP将会比UDP多7节的传输过程。
Reference:UNIX网络编程

TCP 连接管理机制(一)——TCP三次握手详解 + 为什么要有三次握手 TCP三次握手的状态变化以及 为什么要有三次握手 阅读详情

相关推荐

【TCP 从面试的角度回答三次握手和四次挥手】

TCP 三次握手 四次挥手 面试题

liuman626_的博客 1573

TCP四次挥手详解(含常见面试题)

TCP四次挥手过程 客户端发起fin位为1的FIN报文,此时客户端进入FIN_WAIT_1状态 服务端接受到FIN 报文后,发送ack应答报文,此时服务端进入close_wait状态 客户端接受到ack应答报文后,进入FIN_WAIT_2状态 服务端处理完数据后,向客户端发送FIN报文,此时服务端进入LAST_ACK状态 客户端接受到FIN报文后,客户端发送应答ack报文,进入TIME_WAIT阶段 服务端接受到ack报文后,断开连接,处于close状态 客户端过一段时间后,也就是2MSL后,进入clos

small_engineer的博客 2万+

TCP三次握手,四次挥手问题总结

TCP三次握手,四次挥手问题总结 文章目录TCP三次握手,四次挥手问题总结TCP三次握手,四次挥手解释TCP协议基础TCP服务模型TCP头部状态转换为什么要“三次握手,四次挥手”三次握手四次挥手扩展可以了解的知识: TCP三次握手,四次挥手解释 SYN 包:建立连接请求的包 FIN 包:切断TCP 连接的包 ACK 包:针对SYN 包和FIN 包的确认应答包 1、TCP 的特点及其目的: (1)...

qq_22121229的博客 1339

TCP协议的三次握手和四次挥手(超详细讲解+详细命令行)

通过本章的探险,你将学会如何TCP协议的三次握手和四次挥手

幾微的学习博客 1万+

TCP的三次握手及四次挥手总结(从抓包角度理解)

目录 TCP报文首部 TCP连接、传输及断开过程图 TCP状态图 三次握手过程理解 四次挥手过程理解 从抓包来理解TCP建立连接、数据传输以及断开连接的过程 建立连接过程 数据传输过程 连接断开过程 为什么连接的时候是三次握手,关闭的时候却是四次握手? 为什么客户端最后还要等待2MSL(最大报文段生存时间)? 为什么不能用两次握手进行连接? 如果已经建立了连接,但是客户端...

HerofH_的博客 1214

[ 网络协议篇 ] TCP三次握手四次挥手深度解析

TCP 的三次握手和四次挥手是大厂常见的面试考题,具有一定的水平区分度。 如果你的回答不符合面试官期待的水准,有可能就直接凉凉。

qq_51577576的博客 3446

四次挥手详解

四次挥手 四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务器端发送4个数据包以确定连接的断开。在socket编程中,有客户端和服务器端任一方执行close触发。 由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只意味着这个方向不在收到数据了,直到这个方向也发送了FIN,首先进行关闭的一方执行主动关闭,而另一方执行被动关闭。 第一次辉手:客户端发送FIN=N用来关闭客户端到服务器端的数

m0_37148920的博客 5158

TCP协议中的三次握手和四次挥手(图解)

NULL 博文链接:https://420532394.iteye.com/blog/2249026

TCP四次挥手会经历这么多状态

当数据发送完毕,客户端或者服务器一方发起**释放连接**请求时,会经历四个步骤

开心学前端 : ) 1476

Windows 10/11系统下TurboDesign 6.4.0完整安装指南(附序列号+破解补丁)

本文提供Windows 10/11系统下TurboDesign 6.4.0的完整安装指南,涵盖系统环境预检、安装程序部署、序列号处理及破解补丁部署等关键步骤。通过详细的安装教程和优化配置,帮助用户高效完成这款涡轮机械设计软件的安装与调试,解决常见兼容性问题。

s4t5u6v的博客 1029

复旦微FMQL45T900平台RGMII网口调试实战:从PHY寄存器读取异常到链路建立

本文详细记录了复旦微FMQL45T900平台RGMII网口调试的全过程,重点解决了PHY寄存器读取异常问题。通过电压配置调整、时序优化和硬件信号完整性检查,最终成功建立网络链路。文章提供了实用的调试经验和解决方案,适合嵌入式开发人员参考。

weixin_29193359的博客 287

Unix 网络编程(二)- 你需要知道的传输层协议实现细节。

写在开头: 上一篇中我们分析了并实际运行了第一个socket程序,从而对网络编程的整体设计以及工作流程有了了解。作为第二篇文章,在此文中我们将分析网络编程需要的一些理论知识,主要就是TCP/IP协议栈的内容。但是,我们不会枯燥的去讲解这些协议,而且我们的目的也不是去理解这些协议所有的细节,这里我们将会从网络编程的角度去分析传统的协议栈中的运输层协议(TCP, UDP, SCTP), 与纯粹介绍协

挑灯看剑的专栏 2127

ALTERA MAX10 FPGA 串口远程升级实战:从原理到烧录的避坑指南

本文详细解析了ALTERA MAX10 FPGA如何通过串口实现远程升级。文章从工程师实战经验出发,深入剖析了MAX10片内Flash的双镜像备份原理、CONFIG_SEL引脚启动机制,并重点介绍了使用On-Chip Flash IP核进行擦写操作的核心流程。同时,提供了从Quartus工程配置、RPD文件生成、串口协议设计到驱动代码编写的完整避坑指南,旨在帮助开发者稳定、高效地完成远程升级功能部署。

weixin_29197699的博客 273

TCP 和 UDP 协议的通信解析

【代码】TCP 和 UDP 协议的通信解析。

listhi520的博客 438

ATAC-seq差异分析实战:从原始数据到GO富集(R/Bioconductor全流程)

本文提供了ATAC-seq差异分析的完整R/Bioconductor实战流程,涵盖从原始数据准备、一致峰集构建、计数矩阵生成,到使用DESeq2进行差异可及性分析,以及差异峰的基因组注释与GO富集分析。文章详细讲解了关键步骤、参数设置和常见问题,旨在帮助研究者获得可靠且可解释的生物学结果。

weixin_29246195的博客 228

NVIDIA Jetson Orin DLA架构解析与AI推理优化实践

深度学习加速器(DLA)作为专用AI推理芯片,通过固定功能架构实现卷积、池化等神经网络操作的高效能比处理。其核心原理在于硬件级优化计算单元与数据流,相比通用GPU可提升3-5倍能效。在边缘计算场景中,DLA与GPU的异构协同成为关键,特别适合自动驾驶感知、机器人视觉等实时性要求高的应用。NVIDIA Jetson Orin平台通过结构化稀疏技术,在ResNet50等模型上实现近2倍性能提升。开发实践中需注意算子支持、精度校准等关键点,结合TensorRT工具链可充分发挥DLA在低功耗场景的独特优势。

weixin_32999557的博客 397

TCP为什么是三次握手和四次挥手以及可能出现的问题

TCP为什么是三次握手和四次挥手以及可能出现的问题

wtl666_6的博客 9496

时间序列分析(Time Series Analysis) 原理与代码实例讲解

时间序列分析(Time Series Analysis) - 原理与代码实例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 关键词:时间序列预测,ARIMA模型,状态空间模型,SARIMA模型,机器学习

AI天才研究院 1246

【网络】传输层TCP协议 | 三次握手 | 四次挥手

TCP是面向字节流的。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如,发送方应用程序交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付上层的应用程序)。“第三次握手”是客户端向服务端发送数据,目的是告诉服务器,客户端有没有收到服务器“第二次握手”时传过去的数据,若发送的是“收到了”的信号,服务端接收后就正常建立TCP连接,否则建立TCP连接失败,服务器关闭连接端口,由此减少服务器开销及防止接收到失效请求而导致错误。

康师傅没有眼泪 4591

基于ADPSS的直驱风电单机模型建模指南:跟网型与构网型

本文介绍了基于ADPSS平台的直驱风电单机建模方法,包含跟网型和构网型两种控制策略。模型采用模块化设计,共享风力机与桨距角控制部分,通过FORTRAN语言实现自定义建模。跟网型采用锁相环同步和矢量控制,构网型则采用虚拟同步机技术模拟同步发电机特性。详细阐述了风力机气动模型、桨距角控制算法及代码实现,为新能源并网仿真提供了实用参考。全文约150字,涵盖模型架构、数学方程和ADPSS实现要点。

huanghm88的专栏 168

YOLOv8损失函数改进大全:从IoU到FocusIoU的20+种变体全解析(附完整适配代码+性能对比)

目标检测边界框损失函数演进与优化 摘要:边界框损失函数是目标检测模型定位精度的关键因素。本文系统分析了从基础IoU到最新FocusIoU的20余种损失函数的演进历程,包括四代主要技术:基于重叠区域的IoU/GIoU,结合距离度量的DIoU/CIoU,优化形状匹配的EIoU/RIoU,以及考虑方向性的SIoU/WIoU/FocusIoU。针对YOLOv8模型,提供了完整的损失函数实现代码和替换方案,实验表明优化后的损失函数在复杂场景下可提升mAP@0.5达3.2%。文章特别对比了不同损失在小目标、遮挡和密集场

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 996

TCP三次握手(详解)

一:引出 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西;由于TCP不存在连接的概念,只存在请求和响应,请求和响应都是数据包,它们之间都是经过由TCP创建的一个从客户端发起,服务器接收的类似连接的通道,这个连接可以一直保持,http请求是在这个连接的基础上发送的;在一个TCP的连接上是可以发送多个http请求的 二:TCP的报文格式 1:TCP在传输层和网络层数据传输的过程 TCP协议是在传输层端到端的传输信息,既然说到传输层协议,那么就讲一下传输层协议在数据传

qq_48508278的博客 9万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[Linux#63][TCP] 常见标志位 | 为什么是三次握手,四次挥手?

本文介绍了 TCP 协议中 6 个标志位的作用、三次握手和四次挥手的具体过程,以及 TIME_WAIT 状态的处理方法

No Game No Life 4865

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

到底什么是 TCP 连接:从三次握手到四次挥手,从数据结构到状态机

01. 前言:每天都在用,却说不清它是什么02. 一句话定义03. TCP 连接不是物理的,而是逻辑的04. TCP 连接的核心标识:四元组05. TCP 连接在内核中的数据结构06. TCP 连接的生命周期:状态机6.1 状态迁移图(文字版)6.2 各状态含义速查表07. 三次握手:连接的建立08. 四次挥手:连接的关闭09. Socket 编程视角:连接就是文件描述符10. 连接的“可靠性”是如何实现的?11. 常见面试问题与深入理解Q1:一个服务器最多能支持多少个 TCP 连接?

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2708

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

TCP协议——三次握手和四次挥手

理解tcp三次握手、四次挥手及相关问题

Dirty_artist的博客 1487

TCP三次握手四次挥手

一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。

shengdayong2008的博客 1479
上一篇: C++的malloc和new的区别
下一篇: C++内存泄露应对方法
写代码的柯长
博客等级 码龄11年 84粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值