【杂记-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

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

LabVIEW FIFO详解

在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式,包括目标范围内FIFO(Target-Scoped)、DMA FIFO以及点对点流(Peer-to-Peer)。 FIFO类型 **目标范围FIFO(Target-Sc

019、JOptionPane类的常用静态方法详解

目录 JOptionPane类的常用静态方法详解 1. showInputDialog()方法 1.1基本用法 1.2带有默认值的输入框 1.3带有选项的输入对话框 1.4自定义图标的输入对话框 2. showConfirmDialog()方法 2.1基本用法 2.2自定义按钮和图标 2.3带有自定义组件的确认对话框 3. showMessageDialog()方法 3.1

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(