计算机网络知识点复习——TCP协议的三次握手与四次挥手(连接与释放)
TCP协议的三次握手与四次挥手(连接与释放)
- 一、前言
- 二、简单的知识准备
- 1. TCP协议的主要特点
- 2. TCP报文段
- 三、TCP连接的建立(三次握手)
- 四、TCP连接的释放(四次挥手)
- 五、TCP连接与释放的总结
- 六、结束语
一、前言
本篇文章主要是介绍TCP连接的建立以及连接的释放过程,也就是我们常说的“三次握手”和“四次挥手”。
二、简单的知识准备
1. TCP协议的主要特点
TCP是在不可靠的IP层之上实现的可靠的数据传输,它是面向连接的传输层协议,提供全双工通信,数据传输是面向字节流的。
2. TCP报文段
TCP传送的数据单元为报文段,一个TCP报文分为首部和数据两部分,其首部的前20B是固定的。TCP的全部功能体现在其首部的各个字段中,这里大家主要注意下面几个字段的意义即可:
- 序号(seq):指的是本报文段所发送的数据的第一个字节的序号。
- 确认号(ack):表示期待收到对方的下一个报文段的第一个数据字节的序号(seq)。如ack=n+1,那么序号seq=n及之前的数据已经收到,期待收到序号n+1及之后的数据。
- 确认位(ACK):仅当ACK=1时,确认位(ack)才有效,若ACK=0时,确认位(ack)无效。
- 同步位(SYN):SYN=1时有效,意义有两种:
①SYN=1,ACK=0,表示该报文为连接请求报文。
②SYN=1,ACK=1,表示该报文为连接同意报文。- 终止位(FIN):用于释放连接,当FIN=1时,表示数据已发送完毕,并要求释放连接。
三、TCP连接的建立(三次握手)
为了能够更好的了解TCP连接的建立过程,我特意画了一幅图:

在连接建立前,服务器处于LISTEN(监听)状态,等待连接:
第①次握手:客户机A发送请求连接报文,报文段首部中同步位SYN=1,第一个数据字节初始序号seq=x,客户机A进入SYN-SENT(同步已发送)状态。(注:SYN报文段不能携带数据,但消耗一个序号,下面第②次握手一样)
.
第②次握手:服务器B收到连接请求报文,同意连接,发送接受连接报文,报文段中SYN=1,ACK=1,ack=x+1(序号x的数据已收到,期待接收seq=x+1数据),seq=y,服务器B进入SYN-RCVD(同步收到)状态。(在这里分配了服务器的资源)
.
第③次握手:客户机收到连接接受报文后,还需向服务器发送确认报文,报文段首部中ACK=1,ack=y+1,seq=x+1,客户机A进入连接已建立状态,可以开始传送数据。(注:在第③次握手发出的报文可以携带数据了,这里很容易被忽视)
以上就是TCP三次握手的主要过程。
四、TCP连接的释放(四次挥手)
同样的,这里用一个例图来进行介绍,毕竟图文结合能够让我们更好的理解。

参与TCP连接的两个进程都能终止该连接,连接释放的过程通常也被称为四次挥手:
.
第①次挥手:客户机A数据发送完成,主动关闭TCP连接,发送连接释放报文,报文段首部终止位FIN=1,同样的该报文需要消耗一个序号,设序号seq=u,客户机A进入FIN-WAIT-1(终止等待1)状态。
.
第②次挥手:服务器B收到连接释放报文后随即发出确认报文,报文段首部字段中ACK=1,ack=u+1,序号seq=v(这里的v等于前面已传送数据的最后一个字节的序号加1),服务器进入CLOSE-WAIT(关闭等待)状态,就此,从客户机A到服务器B的连接就释放了(半关闭状态)。( 注:TCP是全双工的,可以看成TCP连接有两条通路,在客户机A成功发送FIN报文并确认后,A就不能发送数据了,但是服务器B还可以发送数据,这里对应图中中间的数据传送标志)
.
第③次挥手:若服务器没有数据发送了,就发出连接释放报文,报文首部字段中FIN=1,注意这里需要重复上次已发送的确认号ack=u+1,ACK=1,而由于在半关闭状态服务器B可能向客户机A发送了数据,所以序号需设为seq=w****而不是seq=v+1,然后服务器B进入LAST-ACK(最后确认)状态。
.
第④次挥手:客户机收到连接释放报文后,还需发出确认,因此确认报文中的ACK=1,确认号ack=w+1,序号seq=u+1。但此时TCP连接还需要等待2MSL(最长报文段寿命)后,客户机才进入最后的CLOSED(连接关闭)状态。
五、TCP连接与释放的总结
这里简单的对TCP三次握手与四次挥手的过程进行总结,主要记住每个阶段中的主要字段的状态即可:
(1)TCP连接的建立(三次握手):
① SYN=1,seq=x。
② SYN=1,ACK=1,seq=y,ack=x+1。
③ ACK=1,seq=x+1,ack=y+1。
.
(2)TCP连接的释放(四次挥手):
① FIN=1,seq=u。
② ACK=1,seq=v,ack=u+1。
③ FIN=1,ACK=1,ack=u+1,seq=w
④ ACK=1,seq=u+1,ack=w+1
六、结束语
好了,对于TCP的三次握手以及四次挥手的介绍就到这里了,我是风行男孩,咱们有缘再见!(码字不易,如本篇文章若有帮助,留个赞当痕迹就好)
相关文章:
计算机网络知识点复习——TCP协议的三次握手与四次挥手(连接与释放)
TCP协议的三次握手与四次挥手(连接与释放) 一、前言二、简单的知识准备1. TCP协议的主要特点2. TCP报文段 三、TCP连接的建立(三次握手)四、TCP连接的释放(四次挥手)五、TCP连接与释放的总结六、结束语 一、…...
SpringDataJPA系列(7)Jackson注解在实体中应用
SpringDataJPA系列(7)Jackson注解在实体中应用 常用的Jackson注解 Springboot中默认集成的是Jackson,我们可以在jackson依赖包下看到Jackson有多个注解 一般常用的有下面这些: 一个实体的示例 测试方法如下: 按照上述图片中的序号做个简…...
【Spring Boot 3】【Web】统一封装 HTTP 响应体
【Spring Boot 3】【Web】统一封装 HTTP 响应体 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总…...
Linux如何做ssh反向代理
SSH反向代理是一种通过SSH协议实现的安全远程访问方式,它允许客户端通过SSH连接到一台具有公网IP的代理服务器,然后这台代理服务器再将请求转发给内部网络中的目标主机。以下是实现SSH反向代理的步骤: 一、准备工作 确保服务器配置ÿ…...
Verilog语法+:和-:有什么用?
Verilog语法:和-:主要用于位选择,可以让代码更简洁。 一、位选择基础 在Verilog中,位选择可以通过直接索引来实现,例如: reg [7:0] data; wire select_a; wire [2:0] select_b; assign select_a data[3]; assign select_b …...
stm32F103 串口2 中断 无法接收指定字符串 [已解决]
stm32F103 串口2中断接收指定字符串 USART 初始化和中断配置示例中断处理函数示例关键点总结 确保在串口配置中正确使能空闲中断 ( USART_IT_IDLE) 是关键。这个中断可以帮助你在串口接收一帧数据完成后,进行相应的处理和分析。 为了确保你在串口配置时能避免类似问…...
Matlab/Simulink和AMEsim联合仿真(以PSO-PID算法为例)
目录 安装软件和配置环境变量 Matlab/Simulink和AMEsim联合仿真详细流程 非常重要的一点 Simulink模型和AMEsim模型用S-Function建立连接 从AMEsim软件打开Matlab Matlab里的设置 Matlab的.m文件修改(对于PSO-PID算法) 运行程序 我印象中好像做过…...
超声波测距模块HC-SR04(基于STM32F103C8T6HAL库)
超声波测距模块参考资料 1.电路连接及引脚配置 触发信号PA3只需要输出10us的高电平,所以直接设置成 普通的GPIO端口即可;回响信号使用外部中断,上升沿信号产生外部中断,打开定时器,下降沿再产生一次中断,读…...
Go语言结构体和元组全面解析
Go语言中的复合类型与其应用 在编程中,标准类型虽然方便,但无法满足所有需求。Go通过支持结构体和元组类型,为开发者提供了自定义数据类型的能力。本文将介绍如何定义结构体、如何使用指针操作结构体、如何通过元组返回多个值等内容…...
集成电路学习:什么是SDK软件开发工具包
SDK:软件开发工具包 SDK,即Software Development Kit(软件开发工具包),是一套由软件提供商或其他组织提供的开发工具集合。这些工具旨在帮助开发者更快速、更便捷地创建、测试和部署软件应用程序。以下是对SDK的详细解…...
java后端如何发送http请求
用java后端发送请求需要用到的一个工具包为HttpClient。HttpClient是Apache的一个子项目,是高效的、功能丰富的支持HTTP协议的客户端编程工具包。 引入依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId&…...
装WebVideoCreator记录
背景,需要在docker容器内配置WebVideoCreator环境,配置npm、node.js WebVideoCreator地址:https://github.com/Vinlic/WebVideoCreator 配置环境,使用这个教程: linux下安装node和npm_linux离线安装npm-CSDN博客 1…...
【编程底层思考】什么是GC Roots
在Java虚拟机(JVM)中,GC Roots是垃圾收集(Garbage Collection,GC)过程中的起点,用于确定对象是否可被回收。GC Roots集合是一组必须活跃的(即必须保留在内存中的)引用&am…...
[STL --stack_queue详解]stack、queue,deque,priority_queue,容器适配器
stack stack介绍 1、stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 2、stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供…...
240907-Gradio插入Mermaid流程图并自适应浏览器高度
A. 最终效果 B. 示例代码 import gradio as grmermaid_code """ <iframe srcdoc <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width" />…...
ubuntu 安装python3 教程
本篇教程,主要介绍如何在Ubuntu上安装python3教程。 1、查看是否有python 在安装前,首先看看自己系统上,是否存在python环境,可能有些系统,默认就安装过python,如果已经有python了,可以直接跳过安装教程。 2、安装步骤 apt update && apt install -y python3 p…...
NOR Flash、NAND Flash……
存储类型描述Compact Flash一种用于便携式电子设备的数据存储设备,于1994年由SanDisk公司推出。SRAM静态随机存取存储器,不需要刷新电路即能保存数据,速度快但集成度低、功耗大。PSRAM伪静态随机存取存储器,结合了SRAM和DRAM的特点…...
【高性能代码】提高代码的性能有哪些方式,如何写出高性能代码,一段代码如何提高这段代码的执行性能,高性能代码开发
【高性能代码】提高代码的性能有哪些方式,如何写出高性能代码,一段代码如何提高这段代码的执行性能,高性能代码开发 提高代码的性能是软件开发中一个重要的方面,尤其是在处理大数据、高并发或实时性要求较高的应用时。以下是一些提…...
2024整理 iptables防火墙学习笔记大全_modepro iptables
Iptables名词和术语 2iptables表(tables)和链(chains) 2表及其链的功能 2 Filter表 2 NAT表 2 MANGLE表 2iptables的工作流程 3iptables表和链的工作流程图 3 二、 iptables实战应用 4iptables命令参数详解 4 iptable…...
实验记录 | 点云处理 | K-NN算法3种实现的性能比较
引言 K近邻(K-Nearest Neighbors, KNN)算法作为一种经典的无监督学习算法,在点云处理中的应用尤为广泛。它通过计算点与点之间的距离来寻找数据点的邻居,从而有效进行点云分类、聚类和特征提取。本菜在复现点云文章过程ÿ…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
