计算机网络知识点复习——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)算法作为一种经典的无监督学习算法,在点云处理中的应用尤为广泛。它通过计算点与点之间的距离来寻找数据点的邻居,从而有效进行点云分类、聚类和特征提取。本菜在复现点云文章过程ÿ…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...