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

Redis分布式锁

一、全局ID生成器

1.1 概念

全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具。具有以下特点:
(1)唯一性;(2)高可用;(3)高性能;(4)递增性;(5)安全性。
在这里插入图片描述

1.2 实现

1.2.1 UUID

返回结果是为字符串,不是自增。使用较少。

1.2.2 Redis自增

在这里插入图片描述

1.2.3 snowflake算法

1.2.4 数据库自增

二、集群下的线程并发安全问题

通过加锁机制(synchronize)可以解决单机情况下的线程安全问题,但是在集群模式下就不行了。
在这里插入图片描述
修改nginx的配置文件nginx.conf:
在这里插入图片描述
说明:上图中的配置说明"/api"请求会转到"/backend"请求,且配置了两个服务(172.0.0.1:8081与172.0.0.1:8082)实现负载均衡,即实现集群模式。
使用锁下单(确保一个用户只能下一单):
在这里插入图片描述
但是若同一用户发了两次请求,一次请求发送到8081服务,另一次发送到8082服务,可以发现两次请求都获取到了锁,且都完成了下单,导致不符合业务要求。
原因是锁监视器存在机器本地的JVM中,而一台机器有自己的JVM,锁机制在集群模式下失效。该问题用分布式锁来实现。

三、分布式锁

分布式锁:满足分布式模式或集群模式下多进程可见并且互斥的锁。

3.1 三种实现方法

在这里插入图片描述

3.2 基于Redis的分布式锁

3.2.1 思路

在这里插入图片描述
注意:需要设置key的生存时间,防止服务宕机导致锁未释放。

3.2.2 代码实现

接口:
在这里插入图片描述
实现类:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用锁:
在这里插入图片描述

3.2.3 锁误删的问题

3.2.3.1 产生原因

在这里插入图片描述
以上图图示说明,线程1获取了锁,但是执行时线程阻塞了,导致锁超时释放。而此时线程2去获取了锁。在线程2执行过程中,线程1执行完并去释放锁,实际上释放的是线程2设置的锁,即导致了锁误删。

3.2.3.2 流程修改方法

在这里插入图片描述
原流程:
在这里插入图片描述
修改后流程:
在这里插入图片描述

3.2.3.3 代码实现

在这里插入图片描述
在这里插入图片描述

3.2.4分布式锁的原子性问题

在这里插入图片描述
3.2.3中的锁误删问题的解决方法还有一个问题是,当线程1要删锁时,判断完锁是自己后,阻塞了一段时间,锁超时释放。之后线程2获取了锁,线程1阻塞结束继续执行,进行删锁,又导致了锁误删。因此,判断锁是否是自己的与删除锁的操作需要具备原子性。

3.2.5 Lua脚本解决多条命令原子性问题

Redis提供了Lua脚本(一种编程语言),在一个脚本中编写多条Redis命令,确保多条命令执行时的原子性。
Lua变成语言的基本语法的参考网站:

https://www.runoob.com/lua/lua-tutorial.html

在这里插入图片描述
执行脚本指令:
eval
例如:
在这里插入图片描述
Lua脚本编写如下:
在这里插入图片描述
java的执行redis的lua脚本的接口:
在这里插入图片描述
在项目中新建脚本文件:
在这里插入图片描述
加载脚本(提前加载好):
在这里插入图片描述
在这里插入图片描述

3.3 基于Redis分布式锁的问题

在这里插入图片描述
注意:上述四个问题出现的概率极低,不考虑这些问题的锁的性能也够用了。

四、Redisson

4.1 Redisson介绍

Redisson是封装好的实现Redis分布式锁的依赖,可以直接使用(意思是前面实现锁的代码其实都不用自己写)。使用方法如下。

4.1.1 引入依赖

在这里插入图片描述

4.1.2 配置Redisson客户端

有两个配置方式,一种是使用java配置进行配置;一种是使用配置文件与springboot整合实现,并且官方还提供一种springboot start。建议使用第一种方法。
在这里插入图片描述

4.1.3 使用Redisson的分布式锁

在这里插入图片描述
例如:
在这里插入图片描述

4.2 Redisson可重入锁原理

之前介绍的自定义锁未实现可重入机制。Redisson可实现。
例如:
在这里插入图片描述
实现机制是当获取锁时判断获取锁的是否是当前线程。
在这里插入图片描述

4.3 Redisson分布式锁锁重试问题

在这里插入图片描述

4.4 Redisson分布式锁主从一致性问题

4.4.1 问题产生原因

在这里插入图片描述
首先,redis的主节点获取锁后,开始向从节点同步信息,但就在此时主节点发生了故障即同步尚未完成。Redis有哨兵监控集群状态,当它发现主节点宕机后,从从节点种选择一个作为主节点。Java应用去访问新的主节点时发现锁已丢失,即锁失效了,此时再有其他线程来获取锁还是可以成功的,这就会产生线程并发安全的问题即主从一致性导致的锁失效问题。

4.4.2 Redisson解决方案

Redisson将所有的节点都看成独立的redis节点,相互之间没有主从关系。此时获取锁的方式就变了,之前是找到master节点然后获取锁;但现在必须依次向多个redis节点都去获取锁,这些都保存了锁标识才算获取锁成功(即使用联锁)。
也可以保留主从节点关系,只是有多个主节点:
在这里插入图片描述
不具备主从关系的代码实现:
三个独立的redisclient,,
创建联锁,
在这里插入图片描述
在这里插入图片描述

4.5 使用JVM阻塞线程

在这里插入图片描述
未使用redis缓存的秒杀下单流程如下。
在这里插入图片描述
如上图,对流程进行优化。“判断秒杀库存”和“校验一人一单”由redis完成,再通过消息队列完成下单操作。
具体实现:
在这里插入图片描述
代码实现:
新增秒杀优惠券的同时,将优惠券信息保存到redis中,
基于lua脚本,实现秒杀库存、一人一单,决定用户是否抢购成功,
在这里插入图片描述

如果抢购成功,将优惠券id和用户id封装后存入阻塞队列,
在这里插入图片描述
在这里插入图片描述

开启线程任务,不断从阻塞队列中获取信息,实现异步下单功能,

在这里插入图片描述
说明:上图中的线程的任务是从阻塞队列中不断地取出订单。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、消息队列

4.5中使用JVM线程可能造成内存不足的情况,且存在数据安全问题(重启或宕机后阻塞队列中的信息全部丢失)。
在这里插入图片描述

5.1 基于List结构模拟消息队列

在这里插入图片描述
在这里插入图片描述
使用BRPOP指令。
在这里插入图片描述
优缺点:
在这里插入图片描述

5.2 基于PubSub的消息队列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3 基于Steam的消息队列

Stream是Redis 5.0引入的一种新数据类型(即可实现持久化),可以实现一个功能完善的消息队列。

相关文章:

Redis分布式锁

一、全局ID生成器 1.1 概念 全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具。具有以下特点: (1)唯一性;(2)高可用;(3&…...

【Maven】依赖管理

4. Maven的依赖管理 在 Java 开发中,项目的依赖管理是一项重要任务。通过合理管理项目的依赖关系,我们可以有效的管理第三方库,模块的引用及版本控制。而 Maven 作为一个强大的构建工具和依赖管理工具,为我们提供了便捷的方式来管…...

leetcode——移除数组

26.删除有序数组中的重复项 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素…...

vue项目部署到github pages后页面显示不出来??

问题: 当我们在命令行执行 npm run build 后,项目的目录下会生成一个 dist 文件夹,它里面又包含一个 static 文件夹和一个 index.html 文件,这是 webpack 最终打包好的文件 项目上传到仓库后发现页面为空,找不到文件路…...

为什么爱用低秩矩阵

目录 为什么爱用低秩矩阵 一、定义与性质 二、区别与例子 为什么爱用低秩矩阵 我们更多地提及低秩分解而非满秩分解,主要是因为低秩分解在数据压缩、噪声去除、模型简化和特征提取等方面具有显著的优势。而满秩分解虽然能够保持数据的完整性,但在实际应用中的场景较为有限…...

如何在MySQL中计算两个日期的间隔天数

目录 1. DATEDIFF函数2. TIMESTAMPDIFF函数3. PERIOD_DIFF函数4. 函数对比 在MySQL 5.7中,计算两个日期之间的间隔天数是一项常见的任务。 1. DATEDIFF函数 DATEDIFF函数可以直接计算两个日期之间的天数差异。 -- 计算2024年1月1日和2024年1月10日之间的天数差异 …...

SQL面试题——抖音SQL面试题 共同问题—共同使用ip用户检测问题

共同使用ip用户检测问题 现有用户登录日志表,记录了每个用户登录的IP地址,请查询共同使用过3个及以上IP的用户对; +---+--------------+-------------------+ | id| ip| etime| +---+--------------+-------------------+ | 2|223.104.41.101|20…...

python学习笔记2

下载安装PyCharm 打开pycharm官网: https://www.jetbrains.com.cn/en-us/pycharm/download/?sectionwindows 找到社区版(免费) 下载之后打开,不停下一步就行 打开pycharm软件后,新建py文件 基本输出:…...

IS-IS的原理

IS-IS的基本概念: 概述: IS-IS,中间系统到中间系统,是ISO国际标准化组织为它的无连接网络协议设计的一种动态路由协议 IS-IS支持CLNP网络和IP网络,采用数据链路层封装,区别于ospf只支持IP网络&#xff0…...

现代应用程序中基于 Cell 架构的安全防护之道

在飞速发展的软件开发领域,基于 Cell 的架构日益流行起来。其概念源自船舶舱壁的设计准则,即单独的水密舱室能允许故障孤立存在。通过将这个概念应用于软件,我们创建了一个架构,将应用程序划分为离散的、可管理的组件,…...

Rust : 生成日历管理markdown文件的小工具

需求: 拟生成以下markdown管理小工具,这也是我日常工作日程表。 可以输入任意时间段,运行后就可以生成以上的markdown文件。 一、toml [package] name "rust-workfile" version "0.1.0" edition "2021"[d…...

Burp Suite 全面解析:开启你的 Web 安全测试之旅

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...

RocketMQ: 消息积压问题的解决

概述 1 ) 什么是消息积压 在分布式消息系统中,消息积压是指消息生产速度超过消息消费速度,导致未处理的消息在消息队列中累积的现象这种现象可能会导致系统性能下降、资源占用增加,甚至影响系统的正常运行 2 )消息积…...

Qt的定时器应用案例 || Qt的图片添加显示

目录 1.ui界面 2.头文件 3.cpp源文件 4.main文件 5.关于ui_mytimerevent.h的代码编译错误 6.图片的添加展示方式 7.结果展示 8.参考文章 1.ui界面 2.头文件 #ifndef MYTIMEREVENT_H #define MYTIMEREVENT_H#include <QMainWindow> #include <QTime> //#in…...

24.12.02 Element

import { createApp } from vue // 引入elementPlus js库 css库 import ElementPlus from element-plus import element-plus/dist/index.css //中文语言包 import zhCn from element-plus/es/locale/lang/zh-cn //图标库 import * as ElementPlusIconsVue from element-plus/i…...

web安全攻防入门教程

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中&#xff0c;保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现&#xff0c;还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻…...

Android——android相对布局(RelativeLayout)及各属性

参考:Android——android相对布局&#xff08;RelativeLayout&#xff09;及属性 - 艺言弈行 - 博客园 (cnblogs.com)...

初窥 HTTP 缓存

引言 对于前端来说, 你肯定听说过 HTTP 缓存。 当然不管你知不知道它, 对于提高网站性能和用户体验, 它都扮演着重要的角色! 它通过在客户端和服务器之间存储和重用先前获取的资源副本, 来减少网络流量和降低资源加载时间, 从而提升用户体验! 以下是 HTTP 缓存的重要性: 减少…...

【LeetCode】3. 哈希表: 字母异位词分组;有效的数独

题目 字母异位词分组 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“…...

设计模式之抽象工厂 C# 范例

在设计模式中&#xff0c;抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09; 是一种创建型模式&#xff0c;它提供一个接口&#xff0c;用于创建一组相关或相互依赖的对象&#xff0c;而无需指定具体类。这种模式的关键在于通过抽象工厂来封装产品的创建&#xff…...

基于Python的猎聘网招聘数据采集与可视化分析

1.1项目简介 在现代社会&#xff0c;招聘市场的竞争日趋激烈&#xff0c;企业和求职者都希望能够更有效地找到合适的机会与人才。猎聘网作为国内领先的人力资源服务平台&#xff0c;汇聚了大量的招聘信息和求职者数据&#xff0c;为研究招聘市场趋势提供了丰富的素材。基于Pyt…...

oracle数据库的启动与关闭

一.oracle数据库的启动过程 启动实例&#xff08;Start the Instance&#xff09; 启动实例&#xff1a;一个Oracle数据库实例由内存结构和后台进程组成&#xff0c;启动实例时会加载这些内存结构和启动进程。实例是数据库的一个运行时环境&#xff0c;它包含了数据库的控制文…...

openGauss开源数据库实战十六

文章目录 任务十六 openGauss逻辑结构:触发器管理任务目标实施步骤一、测试openGauss的触发器1.创建测试表2.创建触发器对应的函数3.创建触发器4.测试触发器 二、触发器的类型1.行级触发器2.语句级触发器3.AFTER触发器和 BEFORE触发器 任务十六 openGauss逻辑结构:触发器管理 …...

智能教育的关键之一是构建智能学习系统

教育部办公厅12月27日发布《关于加强中小学人工智能教育的通知》&#xff0c;提出人工智能教育六大主要任务和举措&#xff0c;包括构建系统化课程体系、实施常态化教学与评价、开发普适化教学资源、建设泛在化教学环境、推动规模化教师供给和组织多样化交流活动。《通知》提出…...

【Linux 篇】Docker 容器星河与镜像灯塔:Linux 系统下解锁应用部署奇幻征程

文章目录 【Linux 篇】Docker 容器星河与镜像灯塔&#xff1a;Linux 系统下解锁应用部署奇幻征程前言一 、docker上部署mysql1. 拉取mysql镜像2. 创建容器3. 远程登录mysql 二 、docker上部署nginx1. 拉取nginx镜像2. 在dockerTar目录下 上传nginx.tar rz命令3. 创建nginx容器4…...

十四(AJAX)、AJAX、axios、常用请求方法(GET POST...)、HTTP协议、接口文档、form-serialize

1. AJAX介绍及axios基本使用 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content&q…...

雪花算法生成ID

下面将简单介绍雪花算法的简单应用和在web应用中的使用。 雪花算法的组成&#xff1a;雪花算法是由64位组成&#xff1a;符号位(1)、时间戳(41)、机器码(5[数据中心]5[机器ID])、计数器(12) 对于雪花算法的源码可以在这里看&#xff1a;bwmarrin/snowflake: A simple to use …...

Java - JSR223规范解读_在JVM上实现多语言支持

文章目录 1. 概述2. 核心目标3. 支持的脚本语言4. 主要接口5. 脚本引擎的使用执行JavaScript脚本执行groovy脚本1. Groovy简介2. Groovy脚本示例3. 如何在Java中集成 Groovy4. 集成注意事项 6. 与Java集成7. 常见应用场景8. 优缺点9. 总结 1. 概述 JSR223&#xff08;Java Spe…...

vue3 基本使用

Vue 3 提供了多种方式来构建用户界面&#xff0c;包括选项式 API 和 Composition API。下面我将详细介绍 Vue 3 的基本使用和语法&#xff0c;主要集中在选项式 API 上&#xff0c;因为这对于初学者来说更容易上手。 1. 创建 Vue 项目 如果你还没有一个 Vue 项目&#xff0c;…...

Redis自学之路—高级特性(实现消息队列)(七)

目录 简介 Redis的Key和Value的数据结构组织 全局哈希表 渐进式rehash 发布和订阅 操作命令 publish 发布消息 subscribe 订阅消息 psubscribe订阅频道 unsubscribe 取消订阅一个或多个频道 punsubscribe 取消订阅一个或多个模式 查询订阅情况-查看活跃的频道 查询…...

ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本)

ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本) code review! 参考笔记 1.ROS基本框架1——编写简单的发布者和订阅者(C++和Python版本) 2.ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本) 文章目录 ROS基本框架2——在ROS开发中创建并使用自定义…...

计算机的错误计算(一百七十二)

摘要 探讨 MATLAB 对于算式 的计算误差。 例1. 在 MATLAB 中计算 的值。 直接贴图吧&#xff1a; 这样&#xff0c;MATLAB 的输出中只有3位正确数字&#xff0c;有效数字的错误率为 (16-3)/16 81.25% . 因为16位的正确输出为 0.2971242332737277e-18&#xff08;ISReals…...

贵州大学oj平台高级语言第九次作业(四)

题目&#xff1a;链表的基础操作 题目描述 链表是软件中一种最基本的数据结构&#xff0c;它是用链式存储结构实现数据存储的线性表。它较顺序表(如数组)而言在插入和删除数据时不必移动其后的大批量元素。现在给你一些整数&#xff0c;然后会频繁地插入和删除其中的某些元素&a…...

手机卡限速丨中国移动5G变3G,网速500kb

以下猜测错误&#xff0c;又有新的猜测&#xff1a;河南移动的卡出省限速。可能是因为流量结算。 “2024年7月1日起&#xff0c;中国移动集团内部将开启跨省流量结算” 在深圳四五年了&#xff0c;之前没有过&#xff0c;就从上个月开始。11月底解除限速&#xff0c;12月刚开…...

种花问题算法

假设有一个很长的花坛&#xff0c;一部分地块种植了花&#xff0c;另一部分却没有。可是&#xff0c;花不能种植在相邻的地块上&#xff0c;它们会争夺水源&#xff0c;两者都会死去。 给你一个整数数组 flowerbed 表示花坛&#xff0c;由若干 0 和 1 组成&#xff0c;其中 0 …...

Node.js-Mongodb数据库

MongoDB MongoDB是什么&#xff1f; MongoDB是一个基于分布式文件存储的数据库 数据库是什么&#xff1f; 数据库&#xff08;DataBase&#xff09;是按照数据结构来组织、存储和管理数据的应用程序&#xff08;软件&#xff09; 数据库作用&#xff1f; 对数据进行增、删…...

Nginx

目录 基本介绍 Nginx核心功能 Nginx下载&安装&启动 配置防火墙 Nginx常用命令 Nginx配置文件 全局块 events块 http块 http全局块 server 块 检查配置信息 快速入门 安装JDK 安装Tomcat 反向代理分析 Location语法规则 反向代理配置-Location实例 …...

CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(没思路了)

通过网盘分享的文件&#xff1a;如果能重来.zip 链接: https://pan.baidu.com/s/1XKIJx32nWVcSpKiWFQGpYA?pwd1111 提取码: 1111 --来自百度网盘超级会员v2的分享漏洞分析 格式化字符串漏洞,在printf(format); __int64 sub_13D7() {char format[56]; // [rsp10h] [rbp-40h]…...

HTML5系列(7)-- Web Storage 实战指南

前端技术探索系列&#xff1a;HTML5 Web Storage 实战指南 &#x1f5c4;️ 致读者&#xff1a;本地存储的新纪元 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 HTML5 中的 Web Storage 技术&#xff0c;这是一个强大的本地存储解决方案&#xff0c;让我们能…...

RocketMQ: 保证消息的可靠性投递

概述 在分布式系统中&#xff0c;消息队列作为异步通信的重要组件&#xff0c;其可靠性和稳定性至关重要RocketMQ 是阿里巴巴开源的一款高性能、高可靠性的分布式消息中间件&#xff0c;广泛应用于各种场景&#xff0c;如交易订单处理、日志收集、流计算等 RocketMQ 的可靠性…...

消息传递神经网络(Message Passing Neural Networks, MPNN)

消息传递神经网络&#xff08;Message Passing Neural Networks, MPNN&#xff09; 一、引言二、消息传递框架概述1.消息传递阶段&#xff08;1&#xff09;消息生成与传播-message&#xff08;2&#xff09;消息聚合-aggregate&#xff08;3&#xff09;消息更新-update&#…...

Python干货总结篇:列表、字典、集合、元组的区别与用途

前言&#xff1a; 更详细知识点&#xff0c;搞懂列表、字典、集合、元组到底是什么&#xff0c;可关注主页文章&#xff1a;Python知识点精汇&#xff01; 目录 一、特点与用途 1.列表&#xff1a;a[ ] 2.集合&#xff1a;a{ } 3.字典&#xff1a;a{key:value} 4.元组&am…...

vue.js学习(day 18)

实例&#xff1a;面经基础版...

【Gitlab】CICD使用minio作为分布式缓存

1、安装minio 下载适合自己系统版本的安装文件https://dl.min.io/server/minio/release/windows-amd64/ yum install xxx.rpm 2、配置/etc/profile export MINIO_ACCESS_KEYroot [ui登录账号] export MINIO_SECRET_KEYminioDev001 [ui登录密码] export MINIO_OPTS"…...

医院管理系统

私信我获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 医院管理系统 摘要 随着信息互联网信息的飞速发展&#xff0c;医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求&#xff0c;创建了一个计…...

编译器优化技术

方法内联 逃逸分析 公共子表达式消除 数据边界检查消除...

高斯消元——acwing

题目一&#xff1a;高斯消元解线性方程组 883. 高斯消元解线性方程组 - AcWing题库 分析 代码 #include<bits/stdc.h> using namespace std;const int N 110; const double eps 1e-6; // 注意了double, 和1e-6 ,,这样才是double的0 int n;double a[N][N];int guass…...

华为关键词覆盖应用市场ASO优化覆盖技巧

在我国的消费者群体当中&#xff0c;华为的品牌形象较高&#xff0c;且产品质量过硬&#xff0c;因此用户基数也大。与此同时&#xff0c;随着影响力的增大&#xff0c;华为不断向外扩张&#xff0c;也逐渐成为了海外市场的香饽饽。作为开发者和运营者&#xff0c;我们要认识到…...

[代码随想录06]哈希表的使用,有效字母异位词,两数组交集,快乐数,两数之和

前言 哈希表是什么&#xff1f;一句话带你理解&#xff0c;简单来说我们对于杂乱的数据&#xff0c;怎么快速找到数据&#xff0c;如何做呢&#xff1f;一般的做法就是遍历复杂度为o(N)去找寻一个数据&#xff0c;但是吧&#xff0c;我们这样思考的话&#xff0c;还是花了大量时…...

linux网络抓包工具

linux网络抓包工具 一、tcpdump1.1 基本用法1.2 龙芯平台实例操作 二、wireshark2.1 主要功能2.2 龙芯平台实例操作 一、tcpdump tcpdump 指令可列出经过指定网络界面的数据包文件头&#xff0c;可以将网络中传送的数据包的 “头” 完全截获下来提供分析。它支持针对网络层、协…...