精华内容
下载资源
问答
  • Passive Event Listener
    2022-04-12 18:04:28

    起源

    最近打开项目随便点点,控制台就开始报警:在这里插入图片描述

    Added non-passive event listener to a scroll-blocking ‘mousewheel’ event. Consider marking event handler as ‘passive’ to make the page more responsive

    可以看到警告信息是element-uiecharts两个库发出来的, 原因是使用了mousewheelwheel两个事件,但是却没有传递passive参数。

    什么是passive参数?

    passive adj.消极的,被动的

    打开MDN,搜索addEventListener可以看到,addEventListener传递的第三个参数option中有passive选项,它设置为true时表示不会调用preventDefault()方法。

    那么问题来了:一个事件是否调用preventDefault()对浏览器有什么影响嘛?

    preventDefault与浏览器

    对于一个滚动事件mousewheel(非标准)/touch(移动端事件)/wheel(标准)来说,浏览器需要先去调用他的回调函数,然后再去执行默认行为(在这里是滚动)。然而执行回调函数是需要时间的,如果回调函数中放了一个耗时的循环,它就会等待这个循环执行完再去滚动,那么页面表现就是滑动滚轮后的一段时间页面才会滚动,会有很明显的延迟感。

    除此之外,由于执行回调函数需要浏览器的主线程,因此当主线程忙着执行其他任务时就会来不及执行回调函数,页面同样会出现延迟感。

    一个小实验——耗时的回调函数

    我们让一个页面的滚动事件里执行一段耗时的程序,可以很明显的看出效果

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
      </head>
      <body>
        <li>123</li>
       	<!-- 省略100个li,vscode输入li{123}*100即可快速生成 -->
        <script>
          function fib(n) {
            if (n == 1 || n == 2) return n;
            return fib(n - 2) + fib(n - 1);
          }
          window.addEventListener(
            "wheel",
            async (e) => {
              console.log(fib(40));
            },
            { passive: false }
          );
        </script>
      </body>
    </html>
    
    

    当页面滚动时,求斐波那契数列,经过我的多次测试,我的电脑将n设置为40效果比较好,n太低了算的太快效果看不出来,太高了页面直接卡死崩溃了。

    滑动滚轮后,页面无反应,等过了约1s后页面才开始滚动,并且控制台出现如下信息:

    Handling of 'wheel' input event was delayed for 1450 ms due to main thread being busy. Consider marking event handler as 'passive' to make the page more responsive.
    由于主线程繁忙,'wheel'输入事件的处理延迟了1450毫秒。 考虑将事件处理程序标记为“passive”,以使页面响应更快。  
    

    在这里插入图片描述

    可以看到浏览器发现了这个wheel事件的回调函数时间太长了,推荐开发者设置passive属性,那么我们将passive设置为true试一下

    将passive设置为true后,虽然控制台依然会有很明显的延迟输出,但是滑动滚轮时页面很流畅,并不卡顿

    一个小实验——繁忙的主线程

    这次我们给页面添加一个计算按钮,给按钮注册一个点击后计算斐波那契数据列的事件,当点击按钮后立刻滑动滚轮查看页面表现

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
      </head>
      <body>
        <button>calc</button>
        <li>123</li>
        <!-- 省略100个li,vscode输入li{123}*100即可快速生成 -->
        <script>
          const btn = document.querySelector('button')
          btn.onclick = function(){
            fib(41)
          }
          function fib(n) {
            if (n == 1 || n == 2) return n;
            return fib(n - 2) + fib(n - 1);
          }
          window.addEventListener(
            "wheel",
            async (e) => {
              console.log('wheel');
            },
            { passive: false }
          );
        </script>
      </body>
    </html>
    
    

    结果发现点击后立马滑动滚轮,页面无反应,约2s后才有滚动效果,此时控制台也会打印出警告:

    Handling of 'wheel' input event was delayed for 1279 ms due to main thread being busy. Consider marking event handler as 'passive' to make the page more responsive.
    由于主线程繁忙,'wheel'输入事件的处理延迟了1279毫秒。 考虑将事件处理程序标记为“passive”,以使页面响应更快。  
    

    后面的就不细说了,将passive设置为true后,再执行上述操作,页面滚动就很流畅了

    为什么设置为passive就不卡了呢?

    在没有passive的时候,浏览器会等待回调函数的执行,然后再去执行滚动操作

    设置passive后,滑动滚轮时浏览器会直接对内容快照(相当于给当前页面拍了一张照片)进行滑动处理,因此滑动会很流畅

    解决passive警告

    先别急着装!!

    本项目是vue项目,我使用了default-passive-events这个包来解决passive警告,这个包的原理是给每一个事件监听器都添加一个passive:true

    1. npm i default-passive-events -S 安装
    2. main.js中添加import 'default-passive-events'

    前面说过,本项目中的这个警告是element-uiecharts两个库导致的,虽然在大部分场景下可以解决这个报警,但是当这两个库中确实有些事件调用了preventDefault时,你稍微滑动下就会疯狂报错,因此一定要慎用

    使用default-passive-events导致的报错

    如果项目中确实有方法需要调用preventDefault,而我们又引入了default-passive-events这个包,这个时候控制台就会疯狂报错

    Unable to preventDefault inside passive event listener invocation.
    

    因为我们明明告诉浏览器不会阻止默认行为了,可我们的代码还是阻止了。

    目前的解决办法似乎只有不用这个包,继续忍受着passive警告,毕竟警告总比报错好一点

    参考

    MDN关于passive的介绍

    让页面滑动流畅得飞起的新特性:Passive Event Listeners

    更多相关内容
  • default-passive-events 当支持EventListenerOptions时,默认使{passive:true} 50行代码段,默认情况下启用某些事件的()。 基本上,每次您声明新的时,它都会自动设置{Passive:true} 。 安装 yarn add default...
  • npm install --save detect-passive-events // supportsPassiveEvents is a boolean import { supportsPassiveEvents } from 'detect-passive-events' ; if ( supportsPassiveEvents ) { // passive events are ...
  • PassiveDNS 能够以被动方式收集DNS记录,从而实现事故处理辅助、网络安全监控以及数字取证等功能。该软件能够通过配置读取pcap(即数据包捕捉)文件并将DNS数据输出为日志文件或者提取来自特定接口的数据流量。 这款...
  • In this paper, we perform a systematic analysis on the passive sensitive data leakage vulnerability in Android applications, design and implement a testing tool Sensitive Data Passive Leakage ...
  • irs-aided-swipt-joint-waveform-active-and-passive-beamforming-design:本文研究了一种高效的IRS辅助SWIPT架构,其中多载波多天线AP在IRS的帮助下同时向单天线用户传输信息和功率
  • This paper revisits the simplest passive walking model by Garcia et al. which displays chaos through period doubling from a stable period-1 gait. By carefully numerical studies, two new gaits with ...
  • DroidMVP关于DroidMVP是一个小的Android库,可帮助您在Android项目中将MVP模式与Passive View和Presentation Model(是的,可以组合在一起:)一起使用。 DroidMVP关于DroidMVP是一个小的Android库,可帮助您在...
  • Inspired by synthetic aperture sonar (SAS), synthetic aperture radar (SAR) and multi-static passive radar, a similar concept of Passive Synthetic Aperture Antenna Array (PSAAA) is introduced in...
  • TCP-5082UB-D 8.2 pF Passive Tunable Integrated Circuits
  • We demonstrate a package-level passive equalization technology in which the wire-bonding-induced resonance effect is used to compensate for the limited gain strength within the Nyquist frequency....
  • PADS是基于签名的检测引擎,用于被动检测网络资产。 它旨在通过为IDS警报提供上下文来补充IDS技术。
  • psmd 侦听接口并将它看到的系统日志消息与散列一起写入磁盘。 此外,它还可以将系统消息转发到另一个系统,就像消息来自原始设备一样。
  • The authors have built the first 3D, kneed, two-legged passive-dynamic walking machine. Since the work of T. McGeer (1990, 1991), the concept of passive dynamics has added insight into animal ...
  • 当窄带外辐射源数目稀少且空间分布不均匀时,通常会在无源雷达成像中产生稀疏的无规则空间谱填充,使得传统快速逆傅里叶方法(inverse fast Fourier transform,IFFT)或极坐标方法难以获得良好的目标成像效果。...
  • Passive Analogue Filters Synthesis Using MatLab.pdf
  • PON是在所谓的“最后一公里”中缺少带宽时的解决方案。家庭用户为了获得快速因特网接入,可以选择的方法极其有限(电话或电缆系统)。同样,企业也局限于T1和T3载波提供的性能,虽然目前的无线、光纤和卫星业务都已更加...
  • AEC - Q200 Stress Test Qualification For Passive Components.zip
  • Passive Radar Tutorial.pdf

    2019-09-29 16:37:30
    Passive Radar signifying the localisation of a target by radar measurements without using own controlled emissions has been discussed, tried, reinvented, and matured within the last 80 years. Its ...
  • PON 是在所谓的“最后一公里”中缺少带宽时的解决方案。家庭用户为了获得快速因特网接入,可以选择的方法极其有限(电话或电缆系统)。同样,企业也局限于T1和T3载波提供的性能,虽然目前的无线、光纤和卫星业务都已更加...
  • Suppressing Multipath Interference by Using Smart Antenna for Passive UHF RFID System
  • matlab最简单的代码被动动态行走 Matlab中的简单被动动态行走模型的仿真和动画。 版本1.1,5-1-16 下载资料库: 模拟被动动态助steps器八steps ,默认斜率gam为0.01弧度。 在默认坡度gam为0.01弧度,脚与臀部质量之...
  • Adaptive control of robot system of up to a half passive joints
  • Precise Failure Location and Protection Mechanism in Long-Reach Passive Optical Network
  • Passive Impedance Matching

    2017-12-17 11:15:40
    Passive Impedance Matching_关于实际应用中的阻抗匹配 matching tuning的一些操作和注意点。
  • An introduction to passive radarGriffiths, Hugh D; Baker, Christopher JGriffiths, Hugh DBaker
  • Over the past decade, parity-time (PT)-symmetric Hamiltonians have been experimentally realized in classical, optical settings with balanced gain and loss, or in quantum systems with localized loss....
  • Passive learning 和policy evaluation 任务有类似之处,关键的区别在于passive learning agent 并不知道transition model P( s' | s, a)(即在动作s下执行动作a之后得到状态 s' 的概率)。同时,passive learning...

            在MDP系列博客中,我们以一个Agent在4*3网格中寻找终点最优的路径策略为例,论述了MDP问题的原理和求解。有了MDP讲解作为基础之后,我们就可以正式的切入到“强化学习”的学习中来了。强化学习的目的是通过观测到的reward来为当前环境学习一个(近似)最优的策略。在MDP系列问题中,我们有一个完整的环境模型并且reward函数也是已知的。

           在本文中我们将假设一个fully observable的环境(即当前状态可以通过每一步的感知获取)。另一方面,我们假设Agent 不知道环境是如何运行或者agent的动作是如何执行的,即我们允许出现概率动作结果。因此,agent面临的是一个未知的马尔科夫决策过程问题。首先,我们介绍三种agent的运行模式:

    1. Utility-based agent:学习状态的一个效用函数,并使用该函数来选择使得效用期望值最大化的动作。
    2. Q-LEARNING:学习一个动作-效用函数,或者称之为Q-function,即在给定state的情况下分析给定动作的效用期望。
    3. Reflex agent:直接学习一个从stateactions的映射。

    其中,utility-based agent必须有一个明确的环境模型,明确知道采用一个action将导致什么样的statesQ-learning agent可以通过比较当前可用选择对应的效用期望,它并不需要知道他们的结果,因此明确的环境模型并非是必须的。另一方面,由于他们并不知道动作所导致的结果,Q-learning不能够对未来进行展望, 因此它的学习能力也会受到限制,后面将对此进一步介绍。

           我们将介绍两种学习的策略,分别是passive learning active learning。其中passive learningagent的策略是固定的,其目标是学习状态的效用(或状态-动作对)(记住这个目标哦,很重要,这也同时包括学习一个环境模型。Active learning中,agent同样需要学习该怎么做,其关键的问题是探索(exploration:即一个agent必须尽可能对环境进行探索以便学习得到如何应对。本文的重点是介绍passive learning!

    1 Passive learning

          在passive learning中agent的策略π是固定的:即在状态s上,将总是执行动作π (s),其目标仅仅只是学习策略π有多好,即学习效用函数。我们同样以MDP中4*3网格作为环境,使用一个fully observable 环境示例来对passive learning agent 进行讲解(如下图所示)。

    Passive learning 和policy evaluation 任务有类似之处,关键的区别在于passive learning agent 并不知道transition model P( s| s, a)(即在动作s下执行动作a之后得到状态 s' 的概率)。同时,passive learning 也不知道每一个状态对应的reward。

           passive learning中,agent使用策略π进行一系列的尝试(trails),在每一个状态中agent从起点开始经历一系列的转换知道终止点(4,3)或者(4,2)才停止。它的感知输入包括当前的状态对应reward,下面展示一些典型的尝试结果:

    注意,上式中每一个状态带有一个下标来表示该状态感知得到的reward,其目标是rewards的信息来学习非终止状态的效用期望。其对应公式描述如下:

    其中指的是在执行策略后,时刻t上对应的状态(随机变量), = s,γ discount 因素,当前我们将其设置为γ = 1

    1.1 Directed utility estimation

           在1950年代,adaptive control theory领域,Widrow and Hoff 提供了一种称之为Directed utility estimation(直接效用估计),即一个状态的效用等于自该状态开始后到结束所有reward的期望值(被称之为reward-to-go)。在直接效用估计中,每一次尝试(trail)则为其经过的状态提供了效用的一个样本。

            例如,在上述三次尝试中,第一次尝试提供的关于状态(1,1)效用的样本值为0.72, (1,2)的效用样本值为0.76 和0.84,同理,(1,3)的效用值样本为0.80 和0.88,以此类推。在每一次trail 结束之后对状态的utility进行更新,更新的方式是通过取平均值。在有限次的trail 之后,state utility 最终将实现收敛。

           直接效用估计法实际上是将reinforcement learning简化为 inductive learning 问题。该方法实际上是一个监督问题,即以state 为输入,以观测到reward-to-go为输出。该方法存在的一个问题是没有考虑states的效用之间并非是相互独立的,因为一个state的utility等于它自身的reward 外加他之后的statesexpected utility。即对于一个固定策略而言,效用遵循的Bellman公式如下:

          在忽略状态之间关系的情况下,直接效用估计会导致错失学习的机会。比如说在上述三次尝试中的第二次中,首次通过了状态(3,2),且其后的状态为(3,3),根据bellman 公式我们在第一个trail中已经知道了(3,3)的utility很高,而(3,3)又和(3,2)直接相连,因此也可以推断出(3,2)的效用应该也会比较高。但是如果只是单独使用directed utility estimation,那么在第二次trail结束之前,我们并不知道(3,2)的效用是多少。因此我们可以将直接效用估计理解为在一个比需要更大的假设空间中来找到效用,在很多情况下他的局部解会和Bellman等式相冲突,即不满足在固定policy条件下的Bellman等式的关系(公式如下如21.2)。 

    1.2 Adaptive dynamic programming

            Adaptive dynamic programming (or ADP) agent 利用states 效用之间的限制关系学习的状态转移模型,并通过动态规划的方式来求解对应MDP问题。对于一个passive learning问题,这意味通过将学习得到的 和观测得到的R (s),代入到公式21.2中来计算得到states的效用。正如我们在马尔科夫决策过程原理和求解讲解的,对于固定的policy,states的utilities 可以进行线性求解,也可以使用modified policy iteration 进行求解。

           这里的关键问题之一是对的进行学习,由于我们的环境是fullly observable 的,因此可以直接采用基于统计的方法来对其进行估计。具体实现上,我们可以通过统计得到在s状态下执行a动作得到的概率是多少。对应算法原理如下图所示:

    其对的性能测评如下图所示:

          实际上算法的收敛速度主要取决于转移概率的学习速度,在一个4*3的环境下,这个可能比较简单。但是在一个巨大的状态空间环境下,转移概率的学习可能需要很长时间。这种单纯基于估计的模型,实际是一种最大似然估计。由于其计算是基于最大估计所以有可能会导致错误。解决的办法有两种,分别是贝叶斯强化学习(Bayesian reinforcement learning)和 鲁棒控制理论(robust control theory)。

    1.3 Temporal-difference (TD) learning

           这一节我们介绍另一种passive learning问题的求解方式。采用的是通过观测的转移来调整观测状态的utilities,以便使得状态符合Bellman等式。照旧,我们以下面三次trail作为示例。

    假设在第一轮trail结束之后,我们有,在第二轮中(1,3)到(2,3)之间存在转换。假设总是发生这个转换,那么我们有:

      

    由此可知,也就是说当前 可能偏小需要对其进行调整。更加通用的讲,当发生一个从状态s到 s的一个转换,我们对做如下更新:

    其中的 称之为学习率,由于计算中存在两个相邻状态效用的差值,因此被称之为temporal-difference。和公式21.2相比,这里我们仅仅只考虑了实际观测到的下一个状态 s' ,并没有考虑其对应的转换概率。这里可能大家会疑惑如果 s' 对应的是一个小概率事件,那么对的调整可能不对。实际上由于小概率事件发生的概率也会比较小。因此平均值(average value)最终将会收敛。另外,如果随着状态s被访问次数增加,我们将α值大小,那么值本身(即非平均值)最终将实现收敛。

    该算法对应的伪代码和算法性能如下面两个图所示:

    相对于Adaptive dynamic programing (ADP),TD收敛的速度更慢,但是计算量更小,方法更加的简单(不需要估计transition probobility)。实际上TD和ADP算法两者的联系非常的紧密,TD基于每一次观测来进行调整,而ADP则是基于所以可能的状态及其对应概率来进行调整。两者都对Bellman等式进行了考虑。从某个角度来讲,我们可以认为ADP是一种更加粗糙形式的TP。当然也可以使用一些启发式算法来提高ADP的计算效率,如prioritized sweeping heuristic 算法(此处不再累述)。

    后记:

            关于代码的实现,这里不再单独给出,原因是在passive learning 当中,current state s' 和reward 是通过感知(percept)的输入得到,所以在程序设计当中需要根据实际应用情况来更新percept,等回头有更加确切的例子我再更新。

    展开全文
  • •制作 OSX 内核堆风水的小技巧 •利用已出现的 bug 来提升 root 权限
  • PASSIVE 模式下,服务器端 data channel 底层的端口号,其范围是可以配置的,配置方式如下(vsftpd 的配置文件是/etc/vsftpd/vsftpd.conf): PASSIVE 模式下,客户端和服务器端的交互机制,示意图如下: PASSIVE ...

    1 背景

    某客户现场,每天都会批量生成大量 CSV 文件存放到 FTP 系统,这些 CSV 文件需要导入到大数据平台 HIVE 数仓中做后续离线分析,且 HIVE 数仓中的离线分析作业目前是使用 JENKINS 来调度的。

    由于这些 CSV 文件是每天都会生成,且文件数比较多数据量也比较大,初步计划使用 DATAX 来导入 FTP 上的 CSV 文件。

    但在调度系统 JENKINS 中,如何检测 ftp 上的 csv 文件是否 ready,并及时触发 DATAX 导入作业,成为了一个问题。

    为探索和验证 JENKINS 中 FTP 文件的检测和触发机制,笔者搭建了 FTP 服务器。

    在此通过系列文章,跟大家分享一个开源的 FTP 服务器 vsftpd, 介绍下其安装配置和使用,然后介绍下 FTP 的 ACTIVE 与 PASSIVE 模式,最后介绍下 CurlFtpFS.

    本片文章是系列文章第二篇,介绍下FTP 的 ACTIVE 与 PASSIVE 模式。

    2 FTP 的工作模式概述

    • FTP 协议不同于其他协议的一大特点是,其底层的 CLIENT 和 SERVER 之间有两个通信管道,即 command channel 和 data channel;

    • command channel 用来在客户端和服务器之间,传输命令和对命令的响应(客户端会发送命令给服务端,服务端也会发送命令给客户端);

    • data channel 用来进客户端和服务器之间,进行实际的文件数据的传输;

    • 客户端的 command channel 和 data channel,使用的端口都是随机的;

    • 默认情况下,服务端的 command channel 使用端口 21;

    • 默认情况下,在 active 模式下,服务端的 data channel 使用端口 20;

    • 在 passive 模式下,服务端的 data channel 使用一个随机的端口(其 range 可配置);

    • 两个通信通道,和端口使用情况,简化示意图如下:b11d08ccb6d27a06a9fa5789c84a20f3.png

    3 FTP 的 ACTIVE 工作模式详解

    • 所谓 ACTIVE 工作模式,是指 FTP SERVER 端主动发起并建立了到客户端的 TCP 连接,此时 FTP SERVER 端是 TCP 连接的发起方,而 FTP CLIENT 是 TCP 连接的响应方;

    • FTP ACTIVE 模式的产生早于 FTP passive 模式,是早期网络安全攻击还不那么猖獗的早期时代的产物;

    • FTP ACTIVE 模式下,文件上传/下载底层的工作机制如下:

      • 客户端使用一个随机端口,发起并建立到服务端 21 端口的 TCP连接;

      • 建立 TCP 连接后,客户端会通过一系列命令跟服务端交互以登录服务端(具体的命令,包括 AUTH,USER,PASS,OPTS等);

      • 客户端成功登录服务端后,在需要建立 data channel 数据通道时(即在进行文件上传/下载操作时),会首先通过 PORT 命令告知服务端,接下来建立 data channel 连接时,客户端可以使用的端口号;

      • 服务端在获知客户端可以使用的 data channel 端口后,会主动通过自己的 20 端口,发起并建立到客户端上述 data channel 端口的 TCP 连接,此后该 session 下的文件上传和下载,就使用该 data channel 底层的 tcp 连接来进行;

      • 后续再有文件上传/下载操作时,同样需要重复上述步骤建立 data channel,这些不同时刻建立的 data channel,其底层使用的客户端的端口号,并不一定相同;

    • ACTIVE 模式下,客户端和服务器端的交互机制,示意图如下:

    3452953c7fac640caa0e4ba7469f44f7.png
    ftp-active-mode-communication
    • ACTIVE 模式下,客户端和服务器端在进行文件上传/下载操作时,其底层的 tcp 连接,在服务端可以使用 netstat 命令查看:852fea828e06811a70aa048f144c4076.png

    • ACTIVE 模式下,客户端 FileZilla 的日志如下(进行了文件上传和下载操作):

    Status:	Connecting to xx:21...
    Status:	Connection established, waiting for welcome message...
    Response:	220 (vsFTPd 3.0.2)
    Command:	AUTH TLS
    Response:	530 Please login with USER and PASS.
    Command:	AUTH SSL
    Response:	530 Please login with USER and PASS.
    Status:	Insecure server, it does not support FTP over TLS.
    Command:	USER awsftpuser
    Response:	331 Please specify the password.
    Command:	PASS **********
    Response:	230 Login successful.
    Command:	OPTS UTF8 ON
    Response:	200 Always in UTF8 mode.
    Status:	Logged in
    Status:	Retrieving directory listing...
    Command:	PWD
    Response:	257 "/"
    Status:	Directory listing of "/" successful
    Status:	Connecting to xxx:21...
    Status:	Connection established, waiting for welcome message...
    Response:	220 (vsFTPd 3.0.2)
    Command:	AUTH TLS
    Response:	530 Please login with USER and PASS.
    Command:	AUTH SSL
    Response:	530 Please login with USER and PASS.
    Status:	Insecure server, it does not support FTP over TLS.
    Command:	USER awsftpuser
    Response:	331 Please specify the password.
    Command:	PASS **********
    Response:	230 Login successful.
    Command:	OPTS UTF8 ON
    Response:	200 Always in UTF8 mode.
    Status:	Logged in
    Status:	Starting upload of xxx
    Command:	CWD /
    Response:	250 Directory successfully changed.
    Command:	PWD
    Response:	257 "/"
    Command:	TYPE I
    Response:	200 Switching to Binary mode.
    Command:	PORT 10,23,10,64,196,12
    Response:	200 PORT command successful. Consider using PASV.
    Command:	STOR test1.ok
    Response:	150 Ok to send data.
    Response:	226 Transfer complete.
    Status:	File transfer successful, transferred 9 bytes in 1 second
    Status:	Retrieving directory listing of "/"...
    Command:	PORT 10,23,10,64,196,15
    Response:	200 PORT command successful. Consider using PASV.
    Command:	LIST
    Response:	150 Here comes the directory listing.
    Response:	226 Directory send OK.
    Status:	Directory listing of "/" successful
    Status:	Disconnected from server
    Status:	Connecting to xxx:21...
    Status:	Connection established, waiting for welcome message...
    Response:	220 (vsFTPd 3.0.2)
    Command:	AUTH TLS
    Response:	530 Please login with USER and PASS.
    Command:	AUTH SSL
    Response:	530 Please login with USER and PASS.
    Status:	Insecure server, it does not support FTP over TLS.
    Command:	USER awsftpuser
    Response:	331 Please specify the password.
    Command:	PASS **********
    Response:	230 Login successful.
    Command:	OPTS UTF8 ON
    Response:	200 Always in UTF8 mode.
    Status:	Logged in
    Status:	Starting download of /a.ok
    Command:	CWD /
    Response:	250 Directory successfully changed.
    Command:	TYPE I
    Response:	200 Switching to Binary mode.
    Command:	PORT 10,23,10,64,196,40
    Response:	200 PORT command successful. Consider using PASV.
    Command:	RETR a.ok
    Response:	150 Opening BINARY mode data connection for a.ok (4 bytes).
    Response:	226 Transfer complete.
    Status:	File transfer successful, transferred 4 bytes in 1 second

    4 FTP 的 PASSIVE 工作模式详解

    • 所谓 PASSIVE 工作模式,是指 FTP SERVER 端被动地建立了到客户端的 TCP 连接,此时 FTP CLIENT 端是 TCP 连接的发起方,而 FTP SERVER 是 TCP 连接的响应方;

    • FTP PASSIVE 模式的产生晚于 FTP active 模式,适用于更复杂的网络环境,其安全性更高;

    • FTP PASSIVE 模式下,文件上传/下载底层的工作机制如下:

      • 客户端使用一个随机端口,发起并建立到服务端 21 端口的 TCP连接;(同 ACTIVE 模式)

      • 建立 TCP 连接后,客户端会通过一系列命令跟服务端交互以登录服务端(具体的命令,包括 AUTH,USER,PASS,OPTS等);(同 ACTIVE 模式)

      • 客户端成功登录服务端后,在需要建立 data channel 数据通道时(即在进行文件上传/下载操作时),会首先发送 PASV 命令到服务端,以请求服务端告知自己,接下来建立 data channel 连接时,服务端可以使用的端口号;(不同于 ACTIVE 模式)

      • 客户端在获知服务端可以使用的 data channel 端口后,会主动通过自己的一个随机端口,发起并建立到服务端上述 data channel 端口的 TCP 连接,此后该 session 下的文件上传和下载,就使用该 data channel 底层的 tcp 连接来进行;(不同于 ACTIVE 模式)

      • 后续再有文件上传/下载操作时,同样需要重复上述步骤建立 data channel,这些不同时刻建立的 data channel,其底层使用的服务端的端口号,并不一定相同;

    • PASSIVE 模式下,服务器端 data channel 底层的端口号,其范围是可以配置的,配置方式如下(vsftpd 的配置文件是/etc/vsftpd/vsftpd.conf):c90fe9e40133e3a322a405547051d8e6.png

    • PASSIVE 模式下,客户端和服务器端的交互机制,示意图如下:06e0534917b731385f79fa0d3d7855fb.png

    • PASSIVE 模式下,客户端和服务器端在进行文件上传/下载操作时,其底层的 tcp 连接,在服务端可以使用 netstat 命令查看:4b25d8810dfa48dfc9499ef48277f3af.png

    • PASSIVE 模式下,客户端 FileZilla 的日志如下(进行了文件上传和下载操作):

    Status:	Disconnected from server
    Status:	Connecting to xxx:21...
    Status:	Connection established, waiting for welcome message...
    Response:	220 (vsFTPd 3.0.2)
    Command:	AUTH TLS
    Response:	530 Please login with USER and PASS.
    Command:	AUTH SSL
    Response:	530 Please login with USER and PASS.
    Status:	Insecure server, it does not support FTP over TLS.
    Command:	USER awsftpuser
    Response:	331 Please specify the password.
    Command:	PASS **********
    Response:	230 Login successful.
    Command:	OPTS UTF8 ON
    Response:	200 Always in UTF8 mode.
    Status:	Logged in
    Status:	Retrieving directory listing...
    Command:	PWD
    Response:	257 "/"
    Status:	Directory listing of "/" successful
    Status:	Connecting to xxx:21...
    Status:	Connection established, waiting for welcome message...
    Response:	220 (vsFTPd 3.0.2)
    Command:	AUTH TLS
    Response:	530 Please login with USER and PASS.
    Command:	AUTH SSL
    Response:	530 Please login with USER and PASS.
    Status:	Insecure server, it does not support FTP over TLS.
    Command:	USER awsftpuser
    Response:	331 Please specify the password.
    Command:	PASS **********
    Response:	230 Login successful.
    Command:	OPTS UTF8 ON
    Response:	200 Always in UTF8 mode.
    Status:	Logged in
    Status:	Starting upload of xxx
    Command:	CWD /
    Response:	250 Directory successfully changed.
    Command:	PWD
    Response:	257 "/"
    Command:	TYPE I
    Response:	200 Switching to Binary mode.
    Command:	PASV
    Response:	227 Entering Passive Mode (3,22,42,20,4,13).
    Command:	STOR 数据治理与安全-0828.docx
    Response:	150 Ok to send data.
    Status:	Connecting to xxx:21...
    Status:	Connection established, waiting for welcome message...
    Response:	220 (vsFTPd 3.0.2)
    Command:	AUTH TLS
    Response:	530 Please login with USER and PASS.
    Command:	AUTH SSL
    Response:	530 Please login with USER and PASS.
    Status:	Insecure server, it does not support FTP over TLS.
    Command:	USER awsftpuser
    Response:	331 Please specify the password.
    Command:	PASS **********
    Response:	230 Login successful.
    Command:	OPTS UTF8 ON
    Response:	200 Always in UTF8 mode.
    Status:	Logged in
    Status:	Starting download of /kafka summit.docx
    Command:	CWD /
    Response:	250 Directory successfully changed.
    Response:	226 Transfer complete.
    Status:	File transfer successful, transferred 27,690,505 bytes in 25 seconds
    Command:	TYPE I
    Response:	200 Switching to Binary mode.
    Command:	PASV
    Response:	227 Entering Passive Mode (3,22,42,20,4,9).
    Command:	RETR kafka summit.docx
    Response:	150 Opening BINARY mode data connection for kafka summit.docx (62879085 bytes).

    5 Active 模式和 Passive 模式的主要区别

    从上述对比可以看出,Active 模式 和 Passive 模式的区别,主要在于 data channel TCP 连接的建立方式:

    • Active 模式下,是服务端主动发起的到客户端的 data channel tcp 连接;

    • Passive 模式下,是客户端主动发起的到服务端的 data channel tcp 连接,服务端是被动的;

    • Active 模式下,客户端会通过 PORT 命令告知服务端自己 data channel 底层的端口号;

    • Active 模式下,服务端 data channel 底层的端口号默认是20;

    • Active 模式下,服务端会主动通过自己的端口20,发起到客户端特定端口的 TCP 链接(端口号是客户端通过 PORT 命令告知的);

    • Passive 模式下,客户端会通过 PASV 命令询问服务端其 data channel 底层的端口号;

    • Passive 模式下,服务端收到客户端的 PASV 询问命令后,会回复客户端一个可用的 data channel 端口号;(端口 range 一般通过 pasv_min_port/pasv_max_port 指定,端口ip一般通过 pasv_address指定);

    • Passive 模式下,客户端会主动通过自己的一个随机端口,发起到服务端特定端口的 TCP 链接(端口号是客户端通过 PASV 命令询问服务端获取的);

    6 Active 模式和 Passive 模式,哪种模式更适合自己?

    • 在不涉及网络地址转换(NAT)和防火墙 (firewall) 的情况下,Active 模式和 Passive 模式,都是可以工作的;

    • 但出于信息安全的考虑,大部分站点的环境都部署了 NAT 或防火墙,此时网络管理员一般会配置 inbound rules 和 outbound rules, 限制外网特定IP/端口到内网特定IP/端口的访问,和内网特定IP/端口到外网特定IP/端口的访问;且在配置具体网络策略时,一般会限制外部对内部随机端口的 inbound 访问,只允许外部对内部特定端口的 inbound 访问;但倾向于允许内部随机端口到外部的 outbound 访问;

    • FTP 客户端和 FTP 服务端可能都有自己的防火墙,且其网络安全策略的配置是独立开来,由不同组织不同人员配置和管控的,互不影响;

    • 在 FTP Active 模式下,客户端会通过 PORT 命令告知服务端自己的 DATA CHANNEL 端口,且该端口是一个随机端口,随后服务端会通过自身的 20 端口主动发起到客户端该随机端口的 TCP 连接:此时服务端一般会配置自己的防火墙,开放自己20端口到外网的 outbound 连接,所以在服务端防火墙这一侧,一般是没有问题的;但客户端一般不会配置自己的防火墙,允许外网对内网所有随机端口的 inbound 连接,所以此时 TCP DATA CHANNEL 连接的建立就会失败;

    • 而在 FTP PASSIVE 模式下,客户端会通过 PASV 命令询问服务端其DATA CHANNEL 端口,随后服务端会根据配置的端口范围(端口 range 一般通过 pasv_min_port/pasv_max_port 指定,端口ip一般通过 pasv_address指定)返回一个可用的端口给客户端,客户端在获取到服务端该端口后,会主动通过一个随机端口发起到服务端该端口的 TCP 连接:此时客户端防火墙一般会允许内部随机端口到外网的 outbound 连接,所以客户端防火墙这一侧一般是没有问题的;而在服务端,由于服务端 DATA CHANNEL 端口范围是自己可以控制的,一般也会配置服务端防火墙,允许外部随机端口到内部特定端口的 TCP 连接,所以此时 TCP DATA CHANNEL 连接的建立就不会有问题;

    • 综合来看,在涉及内网外网,公网私网,和防火墙等复杂的网络环境的情况下,推荐使用 passive 模式的 ftp, 且此时 ftp 服务端应该根据实际情况,配置合适的 DATA CHANNEL 端口(端口 range 一般通过 pasv_min_port/pasv_max_port 指定,端口ip一般通过 pasv_address指定),并由网络管理员配置防火墙策略,允许外部对内部这些特定端口的 TCP 连接;

    • 话说回来,出于用户体验的考量,FTP服务端也应该主动调整自身防火墙配置,不能要求所有客户端都配合你来调整其防火墙配置,所以推荐使用 passive 模式,而不是 active 模式;d32779fbbbe79ebc3e4f73357cce438c.png

    7 Passive 模式下,如何合理配置 Passive DATA CHANNEL  端口的范围?

    如上文所说,在复杂的网络环境下,推荐配置使用 passive 模式的 ftp,此时 ftp 服务端需要配置 Passive DATA CHANNEL 端口的范围,端口范围一般通过 pasv_min_port/pasv_max_port 指定,端口ip一般通过 pasv_address指定。

    配置完Passive DATA CHANNEL  端口的范围后,还需要网络管理员配置防火墙策略,允许外部对内部这些特定端口的 TCP 连接,但出于于网络安全的考量,我们又不想该端口范围很大,那么如何选用一个合理的Passive DATA CHANNEL  端口范围呢?

    • 合理的端口范围的大小,取决于 FTP 站点需要支持的并发连接数。

    • 需要注意,这里的并发连接数,指的是实际的并发的文件上传或下载的任务数,每个并发任务底层都有一个并发连接,都需要占用一个端口;

    • 并发连接数,并不一定是并发用户数,因为有的客户端可能会建立多个并发连接,以并发上传/下载多个文件,比如同时并发下载/上传1-个文件,就需要10个端口;

    • 可以基于对并发用户数和并发任务数的规划,设置一个初始的 Passive DATA CHANNEL 端口的范围,然后再根据实际的使用和监控情况,进一步调整。

    !关注不迷路~ 各种福利、资源定期分享!欢迎小伙伴们关注公众号!

    !欢迎小伙伴们添加明哥微信,备注“加群交流”,拉你加入ABC技术交流群!

    IT明哥
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,757
精华内容 20,302
关键字:

passive

友情链接: tda7052.zip