【杂记-TCP协议三次握手、四次挥手始末详解】

2024-05-28 18:20

本文主要是介绍【杂记-TCP协议三次握手、四次挥手始末详解】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、三次握手前:

使用TCP协议的原因
TCP协议的目的是为了保证数据能在两端准确、连续的传输。
传输中使用Socket数据结构
TCP协议可使一个设备能同时与多个设备交互信息,它必须要保证不同传输通道之间不会产生串联或相互影响,所以TCP使用Socket数据结构来实现不同设备之间的连接。
Socket包含两个成分:IP地址和端口号,一个设备可以对应一个IP,其中不同的传输通道用不同的端口号区分开来,于是同一个设备发送给其他不同设备的信息就不会产生混乱。
传输控制块TCB的作用
设备可能会产生多种数据并分发给不同的设备,为了确保数据能够正确分发:TCP使用TCB,也叫传输控制块的数据结构把发给不同设备的数据封装起来,该结构看做是信封。
TCB数据块包含数据发送双方的Socket信息,以及装载数据的缓冲区。在两个设备要建立连接和发送数据之前,双方会分配内存建立起TCB数据块。
TCB的打开方式及其状态
无论是客户端还是服务端,在建立连接前都需要准备好TCB数据结构。
客户端TCB主动打开:客户端主动向服务器表达自己想建立数据连接的请求,此时TCB状态为:Active Open(Create TCB)。
服务端TCB被动打开:由于服务器不知道有哪个设备想向它发起连接,因此在构建TCB模块时会默认将客户端对应的Socket数据初始化为0,服务器保持监听,等待客户端从该端口向它发起连接请求,此时TCB状态为:Passive Open(Create TCB)。
双方把自己的Socket和TCB数据结构准备好后,就可以进入三次握手的过程。

二、三次握手过程:

TCP协议终端两种数据包
一种数据包用来传输数据;一种数据包用来发送控制信息(SYN、ACK等),TCP报头中的标志位用于表明数据包是用于数据发送还是用于传输控制信息。
SYN:Synchronize,同步。
ACK:Acknowledge,确认。
TCP报头的标志位
当标志位中的SYN比特位启动时,表明当前数据包目的是实现双方数据状态同步。
当标志位中的ACK比特为启动时,表明数据包用于通知接收方已收到了数据。
一是客户端通知服务器,“我想建立连接”。二是双方通知对方自己数据发送时的“初始序列号”。三是实现参数交换,把自己的有关信息发送给对方。
简述三次握手的过程
TCP三次握手只是建立连接的过程,和后续的数据传输关系不大。
1、两端未建立连接时,均处于初始状态CLOSED。
2、客户端给服务端发送带有初始序列号ISN的SYN数据包,由CLOSED状态进入到SYN_SENT状态。
3、服务端Socket处于监听状态LISTEN,当收到来自客户端的数据包后,会将客户端的ISN的值加1作为ACK包,并和SYN包一起回发给客户端,由LISTEN状态进入到SYN_RCVD状态。
4、客户端收到来自服务端的数据包后,会将客户端的ISN的值加1作为ACK包,并发送给服务端,由SYN_SENT状态进入到ESTABLISH状态。
5、服务端收到来自客户端的ACK数据包后,由SYN_RCVD状态进入到ESTABLISH状态。
6、至此连接连接建立成功,双方互相发送数据。
初始序列号是随机数
为了防止由于网络波动等原因,先后接收到同一序列号导致握手异常,所以初始序列号是一个随机数,而不是每次都以1开始。
另外,三次握手是实现客户端和服务端交互ISN,以便让对方知道如何按序列号组装数据,如果ISN是固定的,攻击者很容易猜出后续的确认号。

三、其他要点

半连接状态(队列)
服务器第一次收到客户端的SYN时(或服务端给客户端回SYN+ACK包时),处于SYN_RCVD状态,此时双方并没有建立连接,服务器会将这种状态下的请求放在一个队列中, 将这种队列称之为半连接队列,全连接队列就是完成三次握手之后,建立的连接就会放在全连接队列中,如果队列满了就有可能出现丢包的现象。
SYN-ACK重传
服务器发送完SYN-ACK包,如果没有收到客户端的ACK确认包,服务器进行首次重传,等待一段时间还没有收到客户端确认包,会进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。
关于数据包的大小
在TCP数据传输过程中往往需要通过控制数据包调整各种控制参数,在三次握手过程中,需要传输的控制参数为最大分片大小,也就是数据包中一次能发送的最大字节数,当要发送的数据大于该参数时,数据就必须分成若干小块分别发送。
握手为什么是三次?
第一次握手,服务端收到客户端发送的数据包,服务端可以得到结论:客户端的发送能力、服务端的接收能力正常。
第二次握手,客户端收到了服务端发送的数据包,客户端得到结论:服务端的接收与发送能力、客户端的接收与发送能力是正常的。
但是,此时服务端不能确认客户端的接收能力是否正常,就需要第三次握手。
即,最少需要三次握手的真正原因是:客户端和服务端都能得到“自己和对方的接收与发送能力均正常”的结论。
握手过程可携带数据吗?
第一次、第二次握手不可以携带数据,其原因是防止服务器受到攻击,服务器不用花费太多时间去处理第一次和第二次,而第三次的时候,客户端已经处于Establish状态,且知道了服务器的接收发送能力正常,所以可以携带数据。

四、四次挥手过程

报文发送过程和两端状态
1、客户端申请断开连接,发送FIN报文(报文中会指定一个序列号)给服务端,客户端由Establish状态进入到FIN_WAIT1状态。
2、服务端收到FIN报文,发送ACK报文(把客户端的序列号值+1作为ACK报文)给客户端,服务端由Establish状态进入到CLOSED_WAIT状态,客户端由FIN_WAIT1状态进入到FIN_WAIT2状态。
3、服务端发送FIN报文(指定一个序列号)给客户端,服务端由CLOSED_WAIT状态进入到LAST_ACK状态。
4、客户端收到FIN报文,发送ACK报文(把服务端的序列号值+1作为ACK报文)给服务端,客户端由FIN_WAIT2状态进入到TIME_WAIT状态。
5、服务端收到ACK报文,由LAST_ACK状态进入到CLOSED状态。
6、客户端在2MSL计时时间后,由TIME_WAIT状态进入到CLOSED状态。
为什么客户端要进入TIME_WAIT状态
客户端发送了ACK之后不会直接到CLOSED状态,需原因就是要确保服务器是否已经收到了ACK报文,如果没有收到的话,服务器会重新发送FIN报文给客户端,客户端再次收到ACK报文之后,就知道之前的ACK丢失了,然后再次发送ACK报文。
而TIME_WAIT持续时间至少是一个报文的来回时间,也就是2MSL,计时时间内没有再次收到FIN报文,就代表对方成功接收ACK报文,此时才会处于CLOSED状态。

这篇关于【杂记-TCP协议三次握手、四次挥手始末详解】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011328

相关文章

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

Linux之软件包管理器yum详解

《Linux之软件包管理器yum详解》文章介绍了现代类Unix操作系统中软件包管理和包存储库的工作原理,以及如何使用包管理器如yum来安装、更新和卸载软件,文章还介绍了如何配置yum源,更新系统软件包... 目录软件包yumyum语法yum常用命令yum源配置文件介绍更新yum源查看已经安装软件的方法总结软

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例: