当前位置: 首页 > news >正文

【计算机网络笔记】TCP连接管理(图解三次握手和四次挥手)

系列文章目录

什么是计算机网络?
什么是网络协议?
计算机网络的结构
数据交换之电路交换
数据交换之报文交换和分组交换
分组交换 vs 电路交换
计算机网络性能(1)——速率、带宽、延迟
计算机网络性能(2)——时延带宽积、丢包率、吞吐量/率
计算机网络体系结构概念
OSI参考模型基本概念
OSI参考模型中非端-端层(物理层、数据链路层、网络层)功能介绍
OSI参考模型中端-端层(传输层、会话层、表示层、应用层)功能介绍
TCP/IP参考模型基本概念,包括五层参考模型
网络应用的体系结构
网络应用进程通信
网络应用对传输服务的需求
Web应用之HTTP协议(涉及HTTP连接类型和HTTP消息格式)
Cookie技术
Web缓存/代理服务器技术
传输层服务概述、传输层 vs. 网络层
传输层——多路复用和多路分用
传输层——UDP简介
传输层——可靠数据传输原理之Rdt协议
传输层——可靠数据传输之流水线机制与滑动窗口协议
传输层——TCP特点与段结构
传输层——TCP的可靠数据传输


  • 系列文章目录
  • 前言
  • 建立连接——三次握手
  • 关闭(拆除)连接——四次挥手
  • 生命周期


前言

我们知道,TCP是一个面向连接的传输层协议,所以在进行实际的数据传输之前要先进行连接的建立,等到数据都传输完成后还要进行连接的拆除。那这个是怎么实现的?下面一起来看看。


建立连接——三次握手

TCP sender 和receiver在传输数 据前需要建立连接

  • 在建立连接的过程中,会初始化TCP变量,或者说选择自己的序列号,也会分配相应的资源,比如分配缓存、交换流量控制信息等等。

    在这里插入图片描述

  • 一般来说,连接的发起者往往是Client客户端,Server服务器这一端则是等待客户连接请求,并且在有可用资源的时候会接收这个请求并建立连接。

    在这里插入图片描述

在TCP连接建立的过程中,采用了三次握手的机制。这是非常重要的。三次握手是指TCP连接的建立过程分三个阶段(在这个过程中会涉及三个包的传输),基本原理如下:

  • Step1:客户主机向服务器发送一个SYN报文段,这个段中不携带任何数据信息,并且SYN这个标志位要置1,并且要携带所选择的初始的序列号。关于这个初始序列号如何选择是有大量的机制的,一般是随机选。
  • Step2:服务器收到SYN报文段后,如果同意建立这个连接的话就回复一个SYNACK报文段,在这个过程中,服务器会分配缓存以及相应的资源,同时选择自己初始的序列号并告知客户端。这个报文段会告诉客户机连接请求已经收到了。
  • Step3:客户机收到来自服务器的SYNACK报文段之后,会回复一个ACK报文段,这个时候SYN标志位就不再置1了,这个报文段的意思就代表客户机收到了服务器同意建立连接的报文段。并且回复的报文段中可以包含数据。

Q:为什么要有三次握手?而且三次握手机制不仅仅在计算机网络中存在,在很多现实当中也是广泛使用的。

以下解释引用自https://cloud.tencent.com/developer/article/1874945

A:原因:避免重复连接

其实在RFC 793 Transmission Control Protocol里就有指出为什么要三次握手的原因

The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.

翻译为中文大致意思是主要原因是为了防止旧的重复连接引起连接混乱问题

比如在网络环境比较复杂的情况,客户端可能会连续发送多次请求。如果只设计成两次握手的情况,服务端只能一直接收请求,然后返回请求信息,也不知道客户端是否请求成功。这些过期请求的话就会造成网络连接的混乱。

所以设计成三次握手的情况,客户端在接收到服务端SEQ+1的返回消息之后,就会知道这个连接是历史连接,所以会发送报文给服务端,告诉服务端。

所以TCP设计成三次握手的目的就是为了避免重复连接

那么可以设计成四次握手?五次握手?不可以?答案是也是可以的,不过为了节省资源,三次握手就可以符合实际情况,所以就没必要设计成四次握手、五次握手等等情况。

下面这幅图展示了三次握手的简单过程:

在这里插入图片描述

ACK number是上一个序列号+1,这是确认前面的报文段收到了,同时告知对方下一个期待的报文段的起始序列号。

如果第三个步骤中客户端的ACK没有成功发给服务器,那服务器再第二个步骤所创建的资源会保留一段时间,一直到确认这个连接不会再建立了,才会释放资源。这种TCP连接管理为经典的 DOS攻击SYN洪泛攻击 提供了环境。在这种攻击中,攻击者发送大量的SYN 请求连接报文段, 而不完成第三次握手 ,也就是不回复ACK确认报文段。 如果服务器不断地响应请求, 为这些半开连接分配资源 ( 但从未使用 ), 就会导致服务器的连接资源被耗尽。

关于TCP连接的建立就介绍到这里,下面介绍如何关闭或者说拆除连接。


关闭(拆除)连接——四次挥手

TCP连接的拆除是客户机和服务器都可以发起的。但多数情况下是客户机发起关闭的请求。

客户机的socket执行一个close函数,意味着客户机声明想要关闭连接。接下来会有四个步骤(在这个过程中会涉及四个包的传输):

  • Step1:客户机向服务器发送一个FIN控制报文段。FIN和SYN一样,是TCP报文段里一个标志位。这个标志位用于关闭连接。
  • Step2:服务器收到FIN控制报文段后,回复一个ACK报文段,关闭连接。接下来服务器会发送一个FIN报文段。
  • Step3:客户机收到FIN,回复ACK。回复之后会进入等待状态,这是为了确保服务器那端能够正确的关闭连接并且释放资源。等待的过程中,如果重复收到了FIN,说明回复的ACK出错了,那客户机就重新发送ACK,以确保服务器那端收到ACK消息。
  • Step4:当服务器收到ACK后,真正地关闭连接。

在这里插入图片描述


生命周期

TCP协议在不同的状态之间来回切换。下面展示了典型的TCP客户端和服务器的生命周期,也就是状态的变化过程。

客户端:初始的时候,TCP客户端处于关闭状态。当上层也就是应用层有一个应用需要TCP连接的时候,TCP客户端会尝试建立连接,向服务器发送SYN报文段。这时会进入SYN已发送的状态。然后等待SYN & ACK报文段,收到之后会回复ACK,这时会进入已经建立连接的状态。这个时候就可以为上层应用可靠的传输数据了。当上层应用使用完连接后并想要关闭连接,这时TCP客户端会发送FIN报文段并进入FIN_WAIT_1状态。如果收到ACK的话,进入FIN_WAIT_2状态,等待服务器端发来的FIN报文段。收到后发送一个ACK,这时再进入等待状态,一般来说会等待30s,这个过程如果又收到FIN ,会重新发送ACK,否则30s结束,进入关闭状态。

在这里插入图片描述

服务器:

在这里插入图片描述

相关文章:

【计算机网络笔记】TCP连接管理(图解三次握手和四次挥手)

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...

C++ 初阶 类和对象(中)

前言:C初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C初阶系列会持续更新,上学期间将不定时更新,但总会更的 目录 一、构造函数 1.1为什么要有构造函数&…...

【漏洞复现】Metinfo5.0.4任意文件包含漏洞复现

感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1、蚁剑直接连接图片马2、读取敏感目录3、读取php源码4、执行PHP命令5、包含木马写Shell (图片马制作新方法) 以 metinfo_5.0.4为例 该环境的文件上传…...

【计算机网络实验/wireshark】tcp建立和释放

wireshark开始捕获后,浏览器打开xg.swjtu.edu.cn,网页传输完成后,关闭浏览器,然后停止报文捕获。 若捕获不到dns报文,先运行ipconfig/flushdns命令清空dns缓存 DNS报文 设置了筛选条件:dns 查询报文目的…...

STM32:I²C通信原理概要

一、IIC通信原理 IIC通信和串口通信有一定的相似之处,都有一根共地线和两根数据线。但是传递外部信息,串口有两根数据线可以进行双向通信,也就是全双工通信。而在IIC通信下,其中一条数据线是用于提供同步时钟脉冲的时钟线(SCL)&am…...

【开题报告】基于 Spring Boot 的在线预约导游系统的设计与实现

1.引言 在旅游行业中,导游起到了重要的作用,他们为游客提供了专业的旅游服务和相关信息。然而,传统的导游预约方式可能存在一些问题,如信息不透明、预约流程繁琐等。因此,我们计划开发一个基于 Spring Boot 的在线预约…...

如何使用ps制作ico图标文件

如何使用ps制作ico图标文件 Chapter1 如何使用ps制作ico图标文件Chapter2 ICOFormat.8bi(Photoshop Ico、Cur插件)的下载使用1. ICOFormat.8bi的作用2. ICOFormat.8bi使用 Chapter3 ps手机计算机图标教程,手绘设计精美手机APP软件图标的PS教程步骤 01 制…...

【Linux】logrotate实现“日志文件定时分割“

问题背景 项目部署的过程中,经常会需要查看程序的执行日志。我之前的做法都是用nohup ... > xxx.log 2>&1 &将日志保存到xxx.log文件中的。但是问题是,程序有时会运行很长时间,一直保存在一个文件里,文件会越来越大…...

Android可绘制资源概览(背景、图形等)

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、drawable 分类3.1 Bitmap fileXML …...

力扣2095.删除链表的中间节点(java快慢指针)

Problem: 2095. 删除链表的中间节点 文章目录 思路解题方法复杂度Code 思路 利用快慢指针,快指针每次走两步,慢指针每次走一步(循环退出条件是fast指针不为空同时fast.next不为空),但是我们容易发现这样到最后slow指针…...

【Vue-Element-Admin】table添加自定义索引

通过给 typeindex 的列传入 index 属性&#xff0c;可以自定义索引。该属性传入数字时&#xff0c;将作为索引的起始值。也可以传入一个方法&#xff0c;它提供当前行的行号&#xff08;从 0 开始&#xff09;作为参数&#xff0c;返回值将作为索引展示。 <el-table:data&q…...

0008Java安卓程序设计-ssm基于Android平台的健康管理系统

文章目录 **摘要**目录系统实现开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,…...

Mac 禁用一些高占用cup的进程

什么是CrashReporter&#xff1f; CrashReporter在应用程序崩溃的任何时候都会运行&#xff0c;它旨在保存应用程序状态&#xff0c;以帮助开发人员找出应用程序崩溃原因。基本上&#xff0c;一个进程是启动、崩溃&#xff08;并调用CrashReporter&#xff09;&#xff0c;然后…...

layui form表单 调整 label 宽度

这个可以调整所有label .layui-form-label {width: 120px !important; } .layui-input-block {margin-left: 150px !important; }情况是这样的&#xff0c;表单里有多个输入框&#xff0c;只有个别label 是长的&#xff0c;我就想调整一下个别长的&#xff0c;其它不变 <di…...

轻量封装WebGPU渲染系统示例<12>- 基础3D对象实体(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/PrimitiveEntityTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 细节请见&#xff1a;引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔…...

[ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决

业务需求&#xff1a;需要做到table表格中某些行数据不能被选中&#xff0c;比如在审核一些记录数据时&#xff0c;已经被审核的数据就不能再次提交审核&#xff0c;特别是批量多选的情况&#xff0c;列表中既有已经审核的&#xff0c;也有未审核的&#xff0c;只要求选中未审核…...

【PY】倒计时日历

大家有时候会不会觉得时间记不住呢&#xff1f;PY倒计时日历可以满足你。 main.py&#xff1a; from tkinter import Tk,Canvas from datetime import date,datetime def get_events():list_events[]with open(events.txt)as file:for line in file:lineline.rstrip(\n)curre…...

windows mysql安装

1、首先去官网下载mysql安装包&#xff0c;官网地址&#xff1a;MySQL :: Download MySQL Community Server 2&#xff1a;把安装包放到你安装mysql的地方&#xff0c;然后进行解压缩&#xff0c;注意&#xff0c;解压后的mysql没有配置文件&#xff0c;我们需要创建配置文件 配…...

【蓝桥杯省赛真题42】Scratch舞台特效 蓝桥杯少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

目录 scratch舞台特效 一、题目要求 编程实现 二、案例分析 1、角色分析...

Kafka(二)消息系统设计

文章目录 前言整体设计时序图时序图解释 最后 前言 当多个系统之间通过Kafka来解耦时&#xff0c;在系统设计初期&#xff0c;基本的要求都是相似的&#xff0c;只不过是消费消息时的业务逻辑可能不同。 本文以业务系统和邮件系统解耦作为示例。业务系统需要发送邮件时&#…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...