对常见FTP客户端/服务器的调查与分析

前言

主要是想看看常见的服务器和客户端是如何实现协议中要求的功能的,。

比如RF959要求的记录结构(Record Structure)页结构(Page Structure)Block ModeCompress Mode,看起来就很抽象。

实测发现,那些很抽象的要求,常见的服务器和客户端都没实现。(很好,我也有理由不实现了🥰)

服务器

一、vsftpd

官网标题Probably the most secure and fastest FTP server for UNIX-like systems,可见它非常靠谱。

二、FileZilla Server

  • 待办

客户端

一、Windows自带的FTP客户端

优点: 无

缺点:

  1. 支持的命令非常少,非常难用!!!
  2. 传输/下载没有进度条提示,不知道要等多久,传输大文件时,不知道的还以为卡住了!!!
  3. 控制台中文乱码(属于是控制台原因了)!!!
  4. 只支持PORT模式,不支持PASV模式,这个非常重要!!!
  5. 闭源!!!

总之就是一坨,可能还没我自己写的好用。

二、linux自带的tnftp客户端

Linux自带的ftp是tnftp。
在我的debian12上,这个软件包的信息如下:

Package: tnftp
Version: 20210827-4+b1
Priority: optional
Section: net
Source: tnftp (20210827-4)
Maintainer: xiao sheng wen <atzlinux@sina.com>
Installed-Size: 263 kB
Provides: ftp
Depends: libc6 (>= 2.33), libedit2 (>= 2.11-20080614-0), libssl3 (>= 3.0.0)
Conflicts: lukemftp
Replaces: lukemftp
Homepage: http://en.wikipedia.org/wiki/Tnftp
Tag: network::client, protocol::ftp, role::program, uitoolkit::ncurses,
 use::downloading, works-with::file
Download-Size: 128 kB
APT-Manual-Installed: no
APT-Sources: https://mirrors.tuna.tsinghua.edu.cn/debian bookworm/main amd64 Packages
Description: 增强 ftp 客户端
 tnftp 在 NetBSD (http://www.netbsd.org) 里,许多用户亲切的称呼为增强 ftp 客户
 端。
 .
 该软件包是 NetBSD ftp 客户端到其它系统的移植。
 .
 相比于 4.4BSD 里的标准 ftp 客户端,tnftp 实现了如下增强:
  * 在 ftp 里面的命令行编辑
  * 命令行获取网址,包括支持:
      - http 代理(参见:$http_proxy, $ftp_proxy)
      - 认证
  * 上下文敏感的命令和文件名补齐
  * 动态进度显示
  * IPv6 支持(来自 WIDE 项目)
  * 修改时间保留
  * 按页显示本地和远程文件,列出的目录(参见:`lpage', `page', `pdir')
  * 被动模式支持,并能返回到主动模式
  * `set option 设置选项' 忽略 ftp 环境变量
  * TIS 防火墙工具包网关 ftp 代理支持(参见:`gate')
  * 传输速度限流(参见:`-T', `rate')

它的命令很多,比widnows的丰富,但是,
在实现FTP服务器和客户端时,也发现了一些它的一些问题。

1. ASCII 表示类型不能正常传输

它的ASCII模式根本不能正常传输文件。

用我自己编写的服务器程序,发现客户端会提前关闭数据连接(data connection),导致服务器在向关闭的套接字写入时产生SIGPIPE信号。(这个信号需要处理,否则服务器程序会abort()退出)

以为是我的问题,使用了权威的vsftpd来测试,发现也是同样结果。

在这里插入图片描述
在这里插入图片描述
抓包观察,可以看到一个很抽象的地方:客户端tnftp发送TYPE A来向服务器vsftpd请求使用ASCII模式传输,服务器也响应了 “200 Switching to ASCII mode”,结果在RETR Country.mmdb的时候,又提示了BINARY mode,前后矛盾。

实际上,即使是将二进制文件中的\r全部去掉,并且把\n换成协议要求的\r\n,再以ASCII模式传输,仍然会出现这样的问题,很难理解tnftp里面是如何处理的。

2. 传输模式不一致

实测还发现,如果服务器不支持SYST命令(例如返回 ”502 command is not implememnted“),那么tnftp会默认使用ASCII表示类型传输。

但是,如果服务器支持SYST,且服务器是UNIX/Linux系统(返回 “215 UNIX Type: L8”),那么tnftp就会默认使用BINARY模式传输(也就是表示类型为图像/binary)。

3. SYSY和SIZE

实测发现,如果支持SYST命令,但是不支持SIZE命令,那么会出现很奇怪的现象:RETR下载文件时,会先发送PASV请求,紧跟着再发送PORT请求,搞不懂什么情况。

(服务器如果按照串行来处理命令,就会因为PASV导致服务器阻塞在的accept()等待客户端连接,但是PORT又导致客户端用accept()等待服务器连接。客户端卡住不能用。)

4. 代码可读性极差

下载了一份tnftp的代码,可读性很差。
三四百行的函数随处可见,goto满天飞,非常琐碎。很佩服开发者能够把它给维护起来。

大概就是下面这张图:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法】回溯:与递归,dfs的同质与分别,剪枝与恢复现场的详细理解,n皇后的回溯解法及算法复杂度分析。

目录 ​编辑 1.什么是回溯 2.关于剪枝 3.关于恢复现场 4.题目&#xff1a;二叉树的所有路径&#xff08;凸显恢复现场&#xff1a;切实感受回溯与深搜&#xff09; 问题分析 ①函数设置为&#xff1a;void Dfs(root) ②函数设置为&#xff1a;void Dfs(root,path) 解题思想&…

Day101:漏洞发现-漏扫项目篇NucleiYakitGobyAfrogXrayAwvs联动中转被动

目录 特征类-三方Poc调用&模版Poc调用 案例1&#xff1a;单点对某特征点进行安全评估 Goby-综合类 Nuclei-较综合类 Afrog-特征类 Yakit-可特征可综合 案例2&#xff1a;新型对某特征点进行安全评估 综合类-主动漏扫&中转联动&被动联动 案例1&#xff1a;…

给自己的机器人部件安装单目摄像头并实现gazebo仿真功能

手术执行器添加摄像头 手术执行器文件夹surgical_new内容展示如何添加单目摄像头下载现成的机器人环境文件启动仿真环境 手术执行器文件夹surgical_new内容展示 进入src文件夹下选择进入vision_obliquity文件夹 选择launch 有两个可用gazebo中rviz展示的launch文件&#xff0…

当我们使用git 上传码云的时候报错:Push rejected Push to origin/master was rejected

在我们推送成果去git&#xff08;码云&#xff09;的过程中报错&#xff1a;Push rejected Push to origin/master was rejected 这个问题是我们在推的时候被拒绝了 控制台报错&#xff1a; 18:46:19.665: [zengqingqingandluoxuwen] git -c credential.helper -c core.quote…

软件无线电安全之GNU Radio基础 -上

GNU Radio介绍 GNU Radio是一款开源的软件工具集&#xff0c;专注于软件定义无线电&#xff08;SDR&#xff09;系统的设计和实现。该工具集支持多种SDR硬件平台&#xff0c;包括USRP、HackRF One和RTL-SDR等。用户可以通过GNU Radio Companion构建流程图&#xff0c;使用不同…

嵌入式学习54-ARM3(中断和时钟)

知识零碎&#xff1a; import &#xff0c;定义表示这是一个外部变量的标号&#xff0c;不是在本程序定义的 export &#xff0c;表示本程序里面用到的变量提供给 其他模块 调用的。 按键模块中&#xff0c;K1和K6所连接的高电阻&#xff0c;根据外部变化变化 …

HiveQL练习(hive3.x)

零、准备工作 1. Hive环境安装 参见搭建Hive 3.x环境&#xff08;CentOS 9 Hadoop3.x&#xff09; 2. 准备数据 在虚拟机HOME目录创建如下文件内容&#xff1a; cd /root vi emp.csv内容如下&#xff1a; 7369,SMITH,CLERK,7902,1980/12/17,800,,20 7499,ALLEN,SALESMAN…

SpringMVC--获取请求参数 / 域对象共享数据

目录 1. SpringMVC 获取请求参数 1.1. 通过ServletAPI获取 1.2. 控制器方法形参获取 1.3. RequestParam 1.4. RequestHeader 1.5. CookieValue 1.6. 通过POJO获取请求参数 1.7. 解决获取请求参数的乱码问题 2. 域对象共享数据 2.1. 三大域对象 2.2. 准备工作 2.3. S…

8:系统开发基础--8.5:系统设计、8.6:系统测试 、8.7:软件维护 、8.8:软件质量保证、8.9:软件文档

转上一节&#xff1a; http://t.csdnimg.cn/X0GjWhttp://t.csdnimg.cn/X0GjW 8.5&#xff1a;系统设计 考点1&#xff1a;系统设计概述 1&#xff1a;软件设计的任务与活动 体系结构设计&#xff1a;定义软件系统各主要部件之间的关系。 数据设计&#xff1a;基于E-R图确定…

免费的 ChatGPT 网站(六个)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、insCode二、讯飞星火三、豆包四、文心一言五、通义千问六、360智脑 现在智能…

专题十三、预处理器

预处理器 1. 预处理器的工作原理2. 预处理指令3. 宏定义3.1 简单的宏3.2 带参数的宏3.3 # 运算符3.4 ## 运算符3.5 宏的通用属性3.6 宏定义中的圆括号3.7 创建较长的宏3.8 预定义宏3.9 C99 中新增的预定义宏3.10 空的宏参数3.11 参数个数可变的宏3.12 __func__ 标识符 4. 条件编…

Leetcode 416.分割等和子集

题目 思路 使用0-1背包的思路。 之前0-1背包是说有N个物品&#xff0c;一个最大承重重量为W的背包。每个物品都有各自的重量和value,要让放入背包中物品价值总和最大。 这道题如何对应成0-1背包&#xff0c;看下面的分析。 背包的大小&#xff1a;要想两个子集元素和相等&am…

宝塔面板Docker+Uwsgi+Nginx+SSL部署Django项目

这次为大家带来的是从零开始搭建一个django项目并将它部署到linux服务器上。大家可以按照我的步骤一步步操作&#xff0c;最终可以完成部署。 步骤1&#xff1a;在某个文件夹中创建一个django项目 安装django pip install django创建一个django项目将其命名为djangoProject …

【板栗糖GIS】如何给微软拼音输入法加上小鹤双拼

【板栗糖GIS】如何给微软拼音输入法加上小鹤双拼 用过在注册表里新建的方法&#xff0c;结果弄完没有出现小鹤双拼方案&#xff0c;想到了自己写reg表 目录 1. 新建一个txt文件 2. 把.txt的后缀名改成.reg&#xff0c;双击运行 3. 在设置中找到微软输入法-常规 1. 新建一个…

二分查找(函数法)

1.二分查找的前提 只有单调的序列才能进行二分查找&#xff1b; 一般为单调不减&#xff0c;单调不增需要像 sort() 一样修改比较函数&#xff1b; 2.binary_search( ) 函数 binary_search( ) 是算法库&#xff08;algorithm&#xff09;函数里面的&#xff0c;用于在一个已经…

【web网页制作】html+css旅游家乡山西主题网页制作(3页面)【附源码】

山西旅游网页目录 涉及知识写在前面一、网页主题二、网页效果Page1、景点介绍Page2、酒店精选|出行攻略Page3、景色欣赏 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码4.1 主页模块源码4.2 源码获取方式 作者寄语 涉及知识 山西旅游主题网页制作&am…

【大语言模型】轻松本地部署Stable Diffusion

硬件要求&#xff1a; 配备至少8GB VRAM的GPU&#xff0c;如果你的电脑只有CPU&#xff0c;请看到最后。根据部署规模&#xff0c;需要足够的CPU和RAM。 软件要求&#xff1a; Python 3.7或更高版本。支持NVIDIA GPU的PyTorch。Hugging Face的Diffusers库。Hugging Face的Tr…

Training - PyTorch Lightning 分布式训练的 global_step 参数 (accumulate_grad_batches)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/137640653 在 PyTorch Lightning 中&#xff0c;pl.Trainer 的 accumulate_grad_batches 参数允许在执行反向传播和优化器步骤之前&…

CSS常用十大选择器(理论+代码实操)

HTML代码实例 注意&#xff1a;拷贝后本地运行注意head标签中的link标签的href属性是否正确 我的目录结构&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Title</title><lin…

人机区别之一在于机器智能还不能提出问题

人机区别在于机器智能目前还不能提出问题。虽然机器智能已经可以通过程序和算法执行各种任务&#xff0c;但它们仍然无法像人类一样主动思考和提出问题。机器智能只能根据预设的指令或对特定情况的响应来进行操作&#xff0c;而无法产生自己的独立思考和主动提问。这是因为机器…