TCP的3次握手和4次挥手

news2024/9/20 22:45:21

一、3次握手、4次挥手的简单描述

1、3次握手

三次握手(Three-way Handshake)指建立一个TCP连接时,需要客户端和服务器总共发送3个包。流程简单描述如下图所示:

在socket编程中,客户端执行connect()时,将触发三次握手。开始时客户端处于 closed 的状态,服务端处于 listen 状态。

(1)第1次握手:客户端给服务端发一个 SYN 报文(SYN=1),随机产生1个初始化序列号seq,(比如seq=x)等待服务器端确认。此时客户端处于 SYN,_SEND 状态。

(2)第2次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将TCP报文标志位SYN和ACK都置为1,ack=x+1,随机产生一个序号值seq(比如seq=k),并将该数据包发送给客户端以确认连接请求。此时服务器端进入SYN_RCVD状态。

(3)第3次握手:客户端收到 SYN 报文之后,检查ACK是否=1,ack是否=x + 1。然后客户端会发一个ACK包,包的ACK=1,ack=k+1。此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态。完成3次握手后,客户端与服务器端之间就可以传输数据了。

2、4次挥手

4次挥手即终止TCP连接,需要客户端和服务端总共发送4个包以确认连接的断开。

(1)第1次挥手:客户端发送一个 FIN 报文(FIN=1),报文中会指定一个序列号seq(比如seq=u)。此时客户端处于 FIN_WAIT1 状态。

此时客户端停止发送数据,主动关闭TCP连接,进入FIN_WAIT1状态,等待服务端的确认。

(2)第2次挥手:服务端收到 FIN 之后,会发送 ACK 报文,ack=u+1,随机产生一个序号值seq=v,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。

此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2状态,等待服务端发出的连接释放报文段。

(3)第3次挥手:如果服务端也想断开连接,和客户端的第1次挥手一样,发 FIN 报文,且指定一个序列号seq(比如seq=w)。此时服务端处于 LAST_ACK 的状态。

(4)第4次挥手:客户端收到 FIN 之后,也发送 ACK 报文,ack=w+1,此时客户端处于 TIME_WAIT 状态。客户端需要等2MSL的时间以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于 CLOSED 状态了。

MSL:报文的最长生存时间。那到底2MSL是多长时间呢?
规定是MSL为2分钟,2MSL就是4分钟。但是实际中30秒、1分钟、2分钟都在使用。

二、TCP协议头部格式

网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范详细定义。

(1)源端口: 占16bit,写入源端口号。 
(2)目的端口: 占16bit,写入目的端口号。源端口号和目地端口各占16bit两个字节,也就是端口的范围是2^16=65535。另外1024以下是系统保留的,从1024-65535是用户使用的端口范围。

(3)序号(seq): 占32bit,取值范围[0,2^32-1],一个传输方向上的字节流的每个字节的序号,通过这个来确认发送的数据有序。序号增加到最后一个后,下一个序号就又回到0。
(4)确认号(ack): 占32比特,取值范围[0,2^32-1],对上一次seq序号做出的确认号,用来响应TCP报文段,值是seq+1。若确认号=n,则表明到序号n-1为止的所有数据都已正确接收,期望接收序号为n的数据。

(5)同步标志位SYN: 用于建立会话连接,同步序列号。
(6)确认标志位ACK: 取值为1时确认号字段才有效;取值为0时确认号字段无效。TCP规定,在连接建立后所有传送的TCP报文段都必须把ACK置1。
(7)终止标志位FIN: 用来释放TCP连接。
(8)复位标志位RST: 用来复位TCP连接。
(9)推送标志位PSH: 接收方的TCP收到该标志位为1的报文段会尽快上交给上层应用,而不必等到接收缓存都填满后再向上交付。

(10)数据偏移: 占4比特,并以4字节为单位。用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远。这个字段实际上是指出了TCP报文段的首部长度。
(11)窗口: 占16比特,以字节为单位。指出发送本报文段的一方的接收窗。
(12)校验和: 占16比特,检查范围包括TCP报文段的首部和数据载荷两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部。
(13)紧急指针: 占16比特,以字节为单位,用来指明紧急数据的长度。
(14)填充:由于选项的长度可变,因此使用填充来 确保报文段首部能被4整除,(因为数据偏移字段,也就是首部长度字段,是以4字节为单位的)。

三、几个知识点

1、为什么需要3次握手?2次不行吗?

一个完整的TCP连接,必须保证:

(1)客户端必须得出结论:服务端的接收、发送能力正常;客户端自己的接收、发送能力正常。

(2)服务端必须得出结论:客户端的接收、发送能力正常;服务器自己的发送、接收能力正常。

第1次握手:客户端发送网络包,服务端收到了。
这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第2次握手:服务端发包,客户端收到了。
这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第3次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

2、什么是半连接队列?

(1)半连接队列: 服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。
(2)全连接队列: 就是已经完成三次握手,建立起的连接就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。

3、SYN-ACK 重传次数的问题
服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传。如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。
注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1s、2s、4s、8s…

4、ISN(Initial Sequence Number)是固定的吗?

ISN就是赋给seq的值。ISN随时间而变化,每个连接都将具有不同的ISN。ISN可以看作是一个32比特的计数器,每4ms加1 。这样做的目的:

(1)防止在网络中被延迟的分组在以后又被传送。
(2)3次握手的其中一个重要功能是客户端和服务端交换 ISN,以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号。

5、3次握手过程中可以携带数据吗?

第1次、第2次握手不可以携带数据。
第3次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据。

6、什么是SYN攻击?

SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复ACK包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击。

7、2MSL等待状态

报文段最大生存时间MSL(Maximum Segment Lifetime),它是任何报文段被丢弃前在网络内的最长时间。

8、四次挥手释放连接时,等待2MSL的意义?

为了保证客户端发送的最后一个ACK报文段能够到达服务器。
因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。

参考:

(1)深入浅出TCP三次握手 (多图详解)

(2)一文彻底搞懂 TCP三次握手、四次挥手过程及原理

(3)面试官,不要再问我三次握手和四次挥手

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/725839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

仿苹果鼠标滚轮控制 文字渐入 淡出效果

废话不多说&#xff0c;上代码&#xff0c;纯jscss3 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…

测试服务器CPU情况

要查看服务器的CPU情况&#xff0c;你可以使用 TOP 命令结合一些选项来执行相应的测试top 命令&#xff1a;运行 top 命令可以实时监视系统的各个进程和 CPU 使用情况在 top 命令的输出中&#xff0c;有几个重要的指标参数可以帮助你了解系统的 CPU 使用情况和进程信息。以下是…

2023.07.05java面试总结

1、springboot 怎么创建新的对象 2、sprintboot 怎么引用第三方类 3、list set map 区别 4、jvm常用配置 5、list怎么排序&#xff0c;怎么按多个字段排序 6、io怎么读取文件 7、angular现在使用什么版本&#xff0c;angular入口 项目结构 8、promise用法 9、和equals …

c++11 标准模板(STL)(std::basic_ostream)(七)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

安信可蓝牙PB-02 SDK二次开发记录

目录 1.开发环境 & 烧录调试2.例程踩坑(1).编译烧录 watchdog 例程 1.开发环境 & 烧录调试 详细参考下面两篇教程 【安信可PB-01/02模组专题①】PB-01/02模组开发板应用- BLE-UART固件的使用教程 【安信可PB-01/02模组专题③】PB-01/02模组开发板应用-快速入门SDK二次…

代码随想录算法训练营第十天 | 二叉树系列1

二叉树系列1 二叉树理论基础注意点小记二叉树的种类二叉树的存储方式二叉树的遍历 要熟悉自己所用编程语言常用的数据容器的底层实现一定要会自己实现所用数据结构的定义 二叉树的递归遍历递归三部曲前中后序递归遍历前序遍历--我的代码前序遍历--代码随想录的代码中序遍历--我…

【解决】Pyinstaller打包报错IndexError: tuple index out of range

问题 这个问题主要是在Python3.7以上的版本中遇到&#xff0c;用pyinstaller打包的时候发现报错 /usr/local/lib/python3.10/dis.py argval const_list[const_index], IndexError: tuple index out of range解决方案 vim 进入报错的文件&#xff0c;/usr/local/lib/python…

Css 基础:选择器,三大特性

1.emmet的 快速格式化代码 配置 "editor.formatOnType": true, "editor.formatOnSave": true 2.基础选择器 3.复合选择器 4.单行文本垂直居中原理 5.css背景 6.CSS三大特性 层叠性&#xff1a;相同选择器设置相同样式&#xff0c;发生在样式冲突时&#xf…

VUE:el-button里面的倒计时显示,验证码发送后两分钟倒计时

验证码倒计时显示 框架需求样式图代码template部分script部分style部分部分内容解读 框架 UI&#xff1a;elementUI 前端&#xff1a;vue 需求 发送验证码后&#xff0c;2分钟内不可以在发送&#xff0c;button置灰&#xff0c;120s后可以点击重新发送验证码 样式图 代码 …

【算法设计与分析】拉丁矩阵问题——对于给定的m和n,计算出不同的宝石排列方案数。

问题描述 现有n种不同形状的宝石&#xff0c;每种宝石有足够多颗。欲将这些宝石排列成m行n列的一个矩阵&#xff0c;m≤n&#xff0c;使矩阵中每行和每列的宝石都没有相同的形状。试设计一个算法&#xff0c;计算出对于给定的m和n&#xff0c;有多少种不同的宝石排列方案。 数…

Java 基础进阶篇(三):权限修饰符、final 关键字与枚举

文章目录 一、权限修饰符二、final 关键字2.1 final 作用2.2 final 修饰变量举例2.3 常量三、枚举3.1 枚举的格式3.2 枚举的特征3.3 枚举的应用 一、权限修饰符 权限修饰符 用于约束成员变量、构造器、方法等的访问范围。 权限修饰符&#xff1a; 有四种作用范围由小到大 (priv…

Unity 如何导入二进制Spine文件

Unity 如何导入二进制Spine文件 前言步骤1.修改拓展名2.修改参数3.导出文件4.导入文件5.修改材质球属性6.生成动画 参考 前言 总是忘记Spine导出二进制到Unity的设置&#xff0c;记录一下。 步骤 1.修改拓展名 纹理打包器也修改一下拓展名&#xff08;日常操作&#xff09;…

word@制表位和列数据对齐@填空下划线制作

文章目录 refs制表位(tab stop)制表位类型 制作对其的下划线填空表单&#x1f47a;利用前导符代替下划线制作待填空下划线 制表位对其列数据模拟简单表格测试数据设置引线使用标尺设置 FAQ refs Insert or add tab stops - Microsoft SupportUsing the ruler in Word - Micros…

GaN HEMT主要性能指标有哪些?宽禁带材料电性能测试方案

GaN HEMT器件性能的评估&#xff0c;一般包含静态参数测试&#xff08;I-V测试&#xff09;、频率特性&#xff08;小信号S参数测试&#xff09;、功率特性&#xff08;Load-Pull测试&#xff09;。静态参数&#xff0c;也被称作直流参数&#xff0c;是用来评估半导体器件性能…

JVM理论(一)-基础概念

JVM概述 JVM就是二进制字节码的运行环境,负责装载字节码到其内存,解释/编译为对应平台上的机器指令执行,每条java指令在java虚拟机规范中都有详细定义,包括如何取、处理操作数等;JVM特点如下 一次编译,到处运行&#xff08;各CPU的架构不同的情况下JVM为了实现跨平台,字节码指…

fastadmin使用PHPexcel上传文件处理兼容问题 (已解决)

介绍 fastadmin&#xff1a;支持使用7.0以上版本的PHP PHPexcel&#xff1a;不支持使用7.0以上的PHP版本 2.下载地址 https://codeload.github.com/PHPOffice/PHPExcel/zip/1.8 3&#xff1a;解决兼容 将文件导入到vendor下面&#xff0c;创建一个函数来使用这个文件&…

5.8.10 TCP协议

5.8.10 TCP协议 我们通过一个实例来看一下TCP协议 如图 图中是六个IP数据报的前40个字节的内容&#xff0c;使用的是16进制数表示的&#xff0c;该数据报的背景如下图 主机H通过快速以太网连接Internet&#xff0c;主机H的IP地址是192.168.1.100&#xff0c;服务器S的IP地址是…

高迸发 架构设计方案

前言 ​​在实际生活业务场景开发中&#xff0c;在我们的网站知名度越来越大的时候&#xff0c;随之而来的就是业务体量越来越大&#xff0c;用户群体越来越大&#xff0c;随之而来的技术要求也越来越高&#xff0c;其中核心点对网站的稳定性要求是硬性的。如果一个系统都无法…

新装idea的一些常用设置

新装idea的一些常用设置 新安装的idea常用配置 1、提示内容忽略大小写 File -> Settings -> Editor -> General -> Code Completion -> Match case 2、修改字体大小 File -> Settings -> Editor -> Font -> Size 3、取消启动时自动打开最后开…

阿里云国际站:阿里云计算服务指的是什么?

标题&#xff1a;阿里云计算服务指的是什么&#xff1f; 一、阿里云计算服务的定义   阿里云计算服务&#xff0c;是阿里巴巴集团旗下的云服务平台&#xff0c;提供了从云服务器、云数据库到大数据处理等丰富的云计算服务。它通过构建一种共享的计算资源池&#xff0c;使得用…