SMB2协议特性之oplock与lease(下

news2025/1/18 17:08:10

前期回顾

上篇文章我们介绍了oplock/lease的相关概念及其基本工作原理,由于间隔时间较长,忘记的读者可以先去回顾一下。本篇文章带大家了解一下,在实际场景中,oplock/lease是如何工作的。

实际场景分析

在一些警匪影视剧中,我们可能看到过这类场景,警方通过监听嫌疑人的电话,来获取有用信息,从而为警方的下一步行动提供依据。类似地,我们可以通过网络抓包工具(如tcpdump,wireshark等)来“监听”SMB2协议的客户端与服务端的通信内容,然后对它们之间传递的控制信息加以分析,从而了解它们是如何工作的。

接下来分几个场景看看:

(1)单客户端场景

(2)多客户端场景

(3)oplock关闭场景

这里的每个场景都是独立的,它们之间互不干扰。

在上述场景中,客户端系统采用Windows 10(企业版),服务端系统采用CentOS 7.9,SMB2 协议服务端软件使用开源软件Samba。网络抓包工具使用tcpdump,分析网络数据包使用具有图形界面的wireshark。此外,为了区分只读类型和读写类型请求,我们以执行程序的方式来替代手动操作方式,客户端执行的Python程序代码如下(openfile.py):

(一)单客户端场景

→ 场景描述

单客户端依次以只读和读写方式打开SMB2共享目录下的同一个文件。

→ 操作步骤

在一个Windows 10系统上,挂载SMB2共享目录到本地Z盘,分别打开两个命令提示符,依次执行python openfile.py ro和python openfile.py rw命令,抓取该过程的网络通信数据包截图如下(已过滤掉无关的非SMB2数据包):

→ 数据包分析

首先对上图做下简单说明,整体一行代表一次SMB2请求或者响应,No.列代表网络数据包或数据帧编号,Source列是发送方地址,Destination列是接收方地址,Protocol列是协议版本,Info列是所执行操作的描述信息。

其中,客户端以只读方式打开文件时,发出的lease请求(作为SMB2 Create请求(即数据包4)的一部分,相当于子请求)的展开信息如下图:

其中Lease Key是客户端生成的唯一标识,用于表示lease的所有者。Lease State一行代表所请求的lease类型,可以看到,即使应用程序以只读方式打开文件,SMB2客户端协议也会请求最高类型的lease(即RWH lease)。对应的响应(数据包6)的展开信息如下图:

可以看到,服务端返回的也是最高类型的lease,这个比较好理解,因为当前只有一个进程访问这个文件,相当于独占这个文件。然后,客户端运行一个新进程以读写方式打开该文件时(注意此时之前的只读访问并未退出,而是处于睡眠中),lease请求的展开信息如下图,请求的同样是RWH lease:

该请求的响应信息展开如下图,可以看到,服务端返回的也是最高类型的lease。

总结一下,单客户端多次打开同一个文件,每次都会请求RWH lease,并且授予的也都是RWH lease,不论是以只读还是读写方式打开文件。

(二)多客户端场景

→ 场景描述

两个不同的客户端(比如A和B)依次对同一个SMB2共享目录下的同一个文件(如f1.txt)进行只读操作。

→ 操作步骤

在两个不同的Windows 10系统上,挂载同一个SMB2共享目录到各自本地Z盘,都打开一个命令提示符,依次执行python openfile.py ro命令,在服务端抓取该过程的网络通信数据包截图如下(已过滤掉无关的非SMB2数据包):

→ 数据包分析

首先,客户端A(172.26.57.51)的lease请求展开如下图:

可以看到,申请的是最高类型lease,对应的服务端响应如下:

此时没有其他客户端访问该文件,相当于单客户端场景,服务端返回最高类型lease,并赋予lease epoch(即版本号)为1。客户端B(172.26.57.53)的lease请求信息如下:

可以看到,同样也是申请的最高类型lease。但是下一个数据包却是Lease break notification(如下图),而不是lease响应,这是为什么呢?原因是有其他客户端访问了同一个文件,“打破”了当前客户端A对文件的“独占”状态(RWH lease相当于独占),而为了保证多客户端数据访问的一致性,服务端必须先通知客户端A,调整其当前lease类型。

然后,客户端A发送Lease break acknowledgment请求来确认新的lease类型:

服务端通过返回STATUS_PENDING来延缓回复客户端B的打开文件请求:

然后,服务端回复客户端A的acknowledgment请求,完成对lease break处理。

然后,服务端回复客户端B的打开文件请求,并授予相应lease类型(RH lease),如下图所示,最后客户端B开始读取文件和其他操作,不再赘述。

总结一下,多个客户端打开同一个文件,每个客户端申请的都是RWH lease,第一个lease申请会被授予RWH lease,之后会根据服务端的lease分配算法进行计算,最终为每个客户端会取得一个合适的lease类型。

(三)Lease关闭场景

如果服务端关闭了oplock,那么在协议协商阶段,客户端就可以知道该服务端不支持lease,如下图:

于是,当客户端创建或者打开文件时,服务端将不再授予任何oplock,理论上客户端不能缓存任何数据了,也就相当于关闭了客户端缓存,如下图所示。

以上场景还是相对比较简单,更多复杂的场景还需感兴趣的读者去继续研究。

协议实现讨论

Oplock/lease是一种客户端缓存机制,目的是为了提升性能,客户端缓存的具体策略和参数(如缓存大小,缓存过期时间等等)主要由SMB2协议客户端决定,然而SMB2客户端大多数运行在Windows系统上,Windows系统本身又是闭源的,我们可做的工作极其有限。

另一方面,SMB2协议采用的是C/S架构,为了提升协议性能,不仅可以优化协议客户端,也可以优化协议服务端。文中使用的SMB2服务端软件是开始于1992年的开源软件Samba,该项目是目前开源社区对SMB2协议支持最完整的并且是使用者最多的项目。

虽然Samba被广泛使用,但是以如今的存储发展趋势来看,新型高速介质的逐渐普及,新兴应用的不断涌现,都对存储服务提出了更高的要求。从这个角度来看,Samba作为SMB2协议的实现,其实算不上十分出色,笔者认为这是多方面原因造成的,如下图:

基于上述原因,并考虑到对于目前很多应用场景,标准文件协议(NFS和SMB)还是不可或缺的,可以预见,开发一个没有历史包袱的高效的SMB server几乎是势在必行。

展望

FAFS是大道云行自主研发的一款企业级全闪分布式文件存储产品,可提供基于标准协议的文件服务,以高性能和自主可控为主要设计目标,产品采用了开放式架构。

其中,作为FAFS的协议层之一,一个没有历史包袱的新的SMB server正在开发中。新的SMB server,同样以高性能和自主可控为目标,且与底层分布式存储紧密结合,并充分考虑新型高速介质的特性。

此外,笔者认为,SMB2协议涉及的内容还是比较多的,尤其是Windows系统本身是闭源的,想要去深入理解并实现SMB2协议,需要做的工作还很多很多,但尽管如此也要相信,“道阻且长,行则将至;行而不辍,未来可期”。

参考资料:

[1] [MS-SMB2].pdf

https://msdn.microsoft.com/en-us/library/cc246482(PROT.13).aspx

[2] 深入SMB2协议之oplock vs lease

https://www.jianshu.com/p/fc6cd66a7a43

[3] https://www.samba.org/

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

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

相关文章

PCI驱动程序框架

PCI驱动程序框架 文章目录PCI驱动程序框架参考资料:一、 PCI驱动框架二、 RK3399驱动致谢参考资料: 《PCI Express Technology 3.0》,Mike Jackson, Ravi Budruk; MindShare, Inc.《PCIe扫盲系列博文》,作者Felix,这是…

【NS2】打印c++函数名字/bash将echo赋值给变量

需求:将tcl在c调用的路由算法名字(函数名)输出,并作为变量赋值给文件名字,但就怎么将函数名字打印出来就思考了很久,并尝试了其他网站“在shell脚本使用tcl变量、如何在bash脚本打印tcl变量、NS2&#xff0…

【实际开发12】- 经验 experience

目录 1. 经验 experience 1. 无多大价值 , 停留数据展示层面 2. 保证数据一致性问题 3. 新增时 , 可先关注核心基础数据 ( 复杂数据以修改形式完善 ) 4. 新增 / 修改 ( 幂等性处理 ) 5. 增 / 删 / 改 添加日志 , 查询无需日志 6. 需要对接多模块的通用字段设计 : String…

什么是CRM系统 企业如何选择合适的CRM系统

在如今市场竞争激烈情况下,企业更加注重客户的数据和管理,因此逐渐形成了“以客户为核心”的理念。而借助CRM系统管理客户数据已然成为一种趋势。 选择一款适合企业的CRM系统可以帮助企业实现更多的价值。但一些企业在初期根本不了解什么是CRM系统&…

Hadoop安装(一) --- JDK安装

目录 1.安装虚拟机 2.关防火墙 3.修改网络配置文件 4.重启网络服务 5.连接shell 6.安装vim工具 7.免密登陆 8. 开启远程免密登录配置 9.远程登录 10.同步时间 10.1.安装ntpdate 10.2.定时更新时间 10.3.启动定时任务 10.4.查看状态 11.修改计算机名 12.配置ho…

数据仓库的架构以及传统数据库与数据仓库的区别

一、数据仓库的分层架构 数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。 1,源数据层(ODS) 操作性数…

袁树雄和杨语莲究竟什么关系 ,《早安隆回》走红后又是《汉川》

自从《早安隆回》火爆全网后,歌迷们就有一种担心,不知道这首好听的歌曲,究竟还能再够火爆多久。歌迷们的担心也不无道理,毕竟花无百日红,人无千般好,《早安隆回》就是再好听,也不可能红一辈子吧…

windows搭建go语言开发环境

1.下载Go语言开发包可以在Go语言官网 ( https://golang.google.cn/dl/ )下载Windows 系统下的Go语言开发包,如下图所示。这里我下载的是 64位的开发包,如果读者的电脑是 32 位系统的话,则需要下载 32 位的开发包,在上图所示页面中…

Fiddler手机抓包

手机抓包软件Fiddler 下载地址以及下载流程 Fiddler 下载地址:https://www.telerik.com/download/fiddler 下载后直接一键安装即可 重要的注意项卸载最前面 pc和手机需要在同一个局域网,也就是同一个wifi 配置 Fiddler界面的简单介绍 pc端Fildde…

Windows Server 2022 Install Veeam ONE 12

借助有关 Veeam Backup & Replication™ 和 Veeam Agents 及 VMware vSphere、Microsoft Hyper-V 和 Nutanix AHV 的洞察,Veeam ONE™ 可通过交互式工具和智能学习提供深度智能监控、报告和自动化功能,帮助客户发现问题并前瞻性地解决问题。 Veeam O…

CUDA编程之CUDA流

文章目录前言CUDA流在默认流中重叠主机与设备用非默认CUDA流重叠多个核函数的执行重叠多个核函数的例子用非默认CUDA流重叠核函数的执行与数据传递不可分页主机内存与异步的数据传输函数总结参考前言 CUDA程序的并行层次主要有两个,一个是核函数内部的并行&#xff…

C++面向对象——C++ 重载运算符和重载函数

C面向对象——C 重载运算符和重载函数C 重载运算符和重载函数C 中的函数重载C 中的运算符重载运算符重载实例C 一元运算符重载C 二元运算符重载C 关系运算符重载C 和 -- 运算符重载C 赋值运算符重载C 函数调用运算符 () 重载C 下标运算符 [] 重载C 类成员访问运算符 -> 重载…

三、进程通信

一、基础知识数据传输一个进程将他的数据发送给另一个进程资源共享多个进程间共享同样的资源通知时间一个进程向另一个进程发送消息,通知他们发生了某种事情通信方式:管道和有名管道信号signal消息队列共享内存信号量套接字二、管道:无名管道…

c++11 标准模板(STL)(std::multiset)(六)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class multiset;(1)namespace pmr { template <class Key, class Compare std::less<Key>> usi…

基于python Django 餐馆点菜管理系统

问题描述&#xff1a; 随着网络的迅速发展&#xff0c;越来越多的人开始接受甚至时依赖了网络营业的这种交易形式&#xff0c;传统的点菜模式不仅浪费时间&#xff0c;效率低下&#xff0c;而且特别耗费成本与人力&#xff0c;因此不少商家开始使用网上点菜系统。网上点菜系统是…

皮尔森相关系数(Pearson correlation coefficient)

最近在看脑机接口的网络&#xff0c;看到有使用通道的皮尔森相关系数作为特征的方法&#xff0c;这里记录一下皮尔森相关系数的学习内容&#xff0c;方便以后查阅。 皮尔森相关系数(Pearson correlation coefficient&#xff09;相关系数简单相关系数复相关系数典型相关系数参考…

【MySQL】MySQL中的数学函数有哪些?

数学函数MySQL函数简介数学函数1.绝对值函数ABS&#xff08;x&#xff09;和返回圆周率的函数PI&#xff08;&#xff09;2.平方根函数SQRT&#xff08;x&#xff09;和求余函数MOD&#xff08;x&#xff0c;y&#xff09;3.获取整数的函数CEIL&#xff08;x&#xff09;、CEIL…

关于Json Web Token(token)在前后端的实践思考

1、前言 啥也不说了&#xff0c;直接进入正题&#xff0c;来学习一下Token在前端和后端的简单应用分析 Token是在客户端频繁向服务端请求数据&#xff0c;服务端频繁的去数据库查询用户名和密码进行对比&#xff0c;判断用户名和密码是否正确&#xff0c;并作出相应提示&…

华为机试题:HJ37 统计每个月兔子的总数(python)

文章目录博主精品专栏导航知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input()与list(input())的区别、及其相互转换方法2、print() &#xff1a;打印输出。3、整型int() &#xff1a;将字符串或数字转换为整…

C语言基础(二)—— 常量与变量、数据类型、进位制、关键字、原码反码补码、限定符、字符串格式化输入输出

1. 常量与变量1.1 关键字1.2 数据类型数据类型的作用&#xff1a;编译器预算对象&#xff08;变量&#xff09;分配的内存空间大小。1.3 常量在程序运行过程中&#xff0c;其值不能被改变的量常量一般出现在表达式或赋值语句中整型常量100&#xff0c;200&#xff0c;-100&…