春节过后,万物复苏,在这元宵佳节的前一天,决定继续开启新年的学习计划,生命在于运动,提高源于学习,在经过漫长的Linux网络编程学习后,接下来会以一个综合的小项目来将所学的知识点综合运用,首先是对项目的一些概念进行了解,纯理论,有些枯燥,但是很重要,当然不用去背,大概了解一下既可,下面开始。

FTP简介

文件传输协议FTP(File Transfer Protocol,由RFC 959描述)。

FTP工作在TCP/IP协议族的应用层,其传输层使用的是TCP协议,它是基于客户/服务器模式工作的。

FTP支持的文件类型

①、ASCII码文件,这是FTP默认的文本格式【常用】

②、EBCDIC码文件,它也是一种文本类型文件,用8位代码表示一个字符,该文本文件在传输时要求两端都使用EBCDIC码【不常用】

③、图象(Image)文件,也称二进制文件类型,发送的数据为连续的比特流,通常用于传输二进制文件【常用】

④、本地文件,字节的大小有本地主机定义,也就是说每一字节的比特数由发送方规定【不常用】

所以我们要实现的FTP也只支持ASCII码文件和图像文件类型,对于这两种文件类型,到底有什么区别呢?下面做一个简要的介绍:

对于文本文件和二进制文件,最直观的区别就是文本文件是可以查看,而二进制打开看到的是乱码,实际上,这两者在物理结构(或存储结构)上都是由一系列的比特位构成的,它们之间的区别仅仅是在逻辑上:ASCII码文件是由7个比特位构成,最高位总是0(因为一个字节=8位),所以ASCII码文件最多能表示的字符数为2^7=128个,通过man帮助也能看到:

而如果最高位为1则打开就会是乱码,也就是二进制文件最高位应该就是1,这是一个区别。

另外一个区别就是\r\n换行符,在不同平台上是不一样的:windows上换行是用\r\n表示;linux上换行是用\n表示;mac上换行是用\r表示。如果在传输文件的时候,以这两种文件类型传输实际上对\r\n的解析方式是不同的,至于有什么不同,这里通过FTP客户端连接FTP服务端来做一个演示,首先启动FTP服务器,这里用vsftpd服务器:

接下来进行ftp文件配置:

配置好之后接下来重新启动vsftpd服务:

接下来用一个ftp客户端来进行连接,连接ftp服务器的客户端有很多工具,这里用“LeapFtp”:

接下来新建一个文件进行上传:

可以用十六进制的文本编辑器来查看一下内容:

接下来开始上传它至FTP服务器:

上传之后的大小也是8个字节,来用命令查看一下:

那如果是用二进制文件上传又会是怎么样呢?

那这两种类型难道没有差别么,实际上在我的机器上是没差别,在有些机器上是有区别的,区别如下:

如果以ASCII方式来传输文件,并且从windows->linux会将\r\n转换成\n,而从linux->windows会将\n转换成\r\n;而如果以二进制文件来传输文件,那么不做任何转换。

在C语言阶段其实我们也学过了打开文件可以以ASCII和二进制两种方式打开,这两者的区别也就只是换行符的不同,跟上面一样。

FTP文件的数据结构【仅做了解】

文件结构,这是FTP默认的方式,文件被认为是一个连续的字节流,文件内部没有表示结构的信息。

记录结构,该结构只适用于文本文件(ASCII码或EBCDIC码文件)。记录结构文件是由连续的记录构成的。

页结构,在FTP中,文件的一个部分被称为页。当文件是由非连续的多个部分组成时,使用页结构,这种文件称为随机访问文件。每页都带有页号发送,以便收方能随机地存储各页。

文件的传输方式【文件的数据结构会影响传输方式】

流方式,这是支持文件传输的默认方式,文件以字节流的形式传输。【主流FTP也仅仅实现了这种方式】

块方式,文件以一系列块来传输,每块前面都带有自己的头部。头部包含描述子代码域(8位)和计数域(16位),描述子代码域定义数据块的结束标志登内容,计数域说明了数据块的字节数。

压缩方式,用来对连续出现的相同字节进行压缩,现在已很少使用。

FTP工作原理

启动FTP

在客户端,通过交互式的用户界面,客户从终端上输入启动FTP的用户交互式命令

建立控制连接

客户端TCP协议层根据用户命令给出的服务器IP地址,向服务器提供FTP服务的21端口(该端口是TCP协议层用来传输FTP命令的端口)发出主动建立连接的请求。服务器收到请求后,通过3次握手,就在进行FTP命令处理的用户协议解释器进程和服务器协议解释器进程之间建立了一条TCP连接。

以后所有用户输入的FTP命令和服务器的应答都由该连接进行传输,因此把它叫做控制连接。

建立数据连接

当客户通过交互式的用户界面,向FTP服务器发出要下载服务器上某一文件的命令时,该命令被送到用户协议解释器。

其中用户的动作会解析成相对应的一些FTP命令,如看到的:

其实也可以用windows的命令来进行FTP连接,也能很清晰地看出用户的每个动作都会解析成对应的FTP命令:

FTP命令【先列出来众览下,之后会一一实现】

命令  类型

命令

功能说明

访问控制命令

USER

服务器上的用户名。

PASS

用户口令。

CWD或XCWD

改变工作目录。

CDUP或XCUP

回到上一层目录(父目录)

QUIT

退出

ACCT

SMNT

REIN

传输参数命令

PORT

数据端口,主要向服务器发送客户数据连接的端口,格式为PORT h1,h2,h3,h4,p1,p2,其中32位的IP地址用h1,h2,h3,h4表示,16位的TCP端口号用 p1,p2表示。

PASV

此命令要求服务器数据传输进程在随机端口上监听,进入被动接收请求的状态。

TYPE

文件类型,可指定ASCII码,二进制等。

STRU

文件结构

MODE

传输模式

服务命令

RETR

获得文件

STOR

保存文件,向服务器传输文件。如果文件已存在,原文件将被覆盖,如果文件不存在,则新建文件。

APPE

与STOR功能类似,但如果文件在指定路径已存在,则把数据附加到原文件尾部,如果不存在,则新建一个文件。

LIST

列目录详细清单

NLST

列出名字列表

REST

重新开始,参数代表服务器要重新开始的那一点,它并不传送文件,而是略过指定点前的数据,此命令后应该跟其他要求文件传输的FTP命令。

ABOR

异常终止。此命令通知服务中止以前的FTP命令和与之相关的数据传输。如果先前的操作已完成,则没有动作,返回226;如果没有完成,返回426,再返回226。

PWD或XPWD

打印当前目录

MKD或XMKD

新建目录

RMD或XRMD

删除目录

DELE

删除文件

RNFR,RNTO

重命名

SITE CHMOD

修改权限

SYST

获取系统信息

FEAT

服务器特性

SIZE

获得文件大小

STAT

返回服务器状态

NOOP

该命令不指定任何动作,只是要求服务器返回OK响应。

HELP

帮助

STOU

暂不实现

FTP应答

FTP应答格式

服务器通过控制连接发送给客户的FTP应答,由ASCII码形式的3位数字和一行文本提示信息组成,它们之间用一个空格分割。应答信息的每行文本以回车<CR>和换行<LF>对结尾。

如果需要产生一条多行的应答,第一行在3位数字应答代码之后包含一个连字符“-”,而不是空格符;最后一行包含相同的3位数字应答代码,后跟一个空格符,关于这个可以实际查看下:

FTP应答作用

确保在文件传输过程中的请求和正在执行的动作保持一致

保证用户程序总是可以得到服务器的状态信息,用户可以根据收到的状态信息对服务器是否正常执行了有关操作进行判定。

FTP应答数字含义【做了解,不需要记,想知道什么含义到时对照查看既可】

第一位数字标识了响应是好,坏或者未完成

应答

说明

1yz

预备状态

2yz

完成状态

3yz

中间状态

4yz

暂时拒绝状态

5yz

永久拒绝状态

第二位数响应大概是发生了什么错误(比如,文件系统错误,语法错误)

应答

说明

x0z

语法 - 这种响应指出了语法错误。给出的命令不存在、没有被实现、或多余。

x1z

信息 - 对于请求信息的响应,比如对状态或帮助的请求。

x2z

连接 - 关于控制连接和数据连接的响应。

x3z

身份验证和帐户 - 对登陆过程和帐户处理的响应。

x4z

未使用

x5z

文件系统 - 请求传输时服务器文件系统的状态或其他文件系统动作状态。

第三位为第二位数字更详细的说明

如:

500 Syntax error, command unrecognized. (语法错误,命令不能被识别)可能包含因为命令行太长的错误。

501 Syntax error in parameters or arguments. (参数语法错误)

502 Command not implemented. (命令没有实现)

503 Bad sequence of commands. (命令顺序错误)

504 Command not implemented for that parameter. (没有实现这个命令参数)

FTP应答示例【定义的宏,之后程序会用到,先列出来】

#define FTP_DATACONN          150

#define FTP_NOOPOK            200

#define FTP_TYPEOK            200

#define FTP_PORTOK            200

#define FTP_EPRTOK            200

#define FTP_UMASKOK           200

#define FTP_CHMODOK           200

#define FTP_EPSVALLOK         200

#define FTP_STRUOK            200

#define FTP_MODEOK            200

#define FTP_PBSZOK            200

#define FTP_PROTOK            200

#define FTP_OPTSOK            200

#define FTP_ALLOOK            202

#define FTP_FEAT              211

#define FTP_STATOK            211

#define FTP_SIZEOK            213

#define FTP_MDTMOK            213

#define FTP_STATFILE_OK       213

#define FTP_SITEHELP          214

#define FTP_HELP              214

#define FTP_SYSTOK            215

#define FTP_GREET             220

#define FTP_GOODBYE           221

#define FTP_ABOR_NOCONN       225

#define FTP_TRANSFEROK        226

#define FTP_ABOROK            226

#define FTP_PASVOK            227

#define FTP_EPSVOK            229

#define FTP_LOGINOK           230

#define FTP_AUTHOK            234

#define FTP_CWDOK             250

#define FTP_RMDIROK           250

#define FTP_DELEOK            250

#define FTP_RENAMEOK          250

#define FTP_PWDOK             257

#define FTP_MKDIROK           257

#define FTP_GIVEPWORD         331

#define FTP_RESTOK            350

#define FTP_RNFROK            350

#define FTP_IDLE_TIMEOUT      421

#define FTP_DATA_TIMEOUT      421

#define FTP_TOO_MANY_USERS    421

#define FTP_IP_LIMIT          421

#define FTP_IP_DENY           421

#define FTP_TLS_FAIL          421

#define FTP_BADSENDCONN       425

#define FTP_BADSENDNET        426

#define FTP_BADSENDFILE       451

#define FTP_BADCMD            500

#define FTP_BADOPTS           501

#define FTP_COMMANDNOTIMPL    502

#define FTP_NEEDUSER          503

#define FTP_NEEDRNFR          503

#define FTP_BADPBSZ           503

#define FTP_BADPROT           503

#define FTP_BADSTRU           504

#define FTP_BADMODE           504

#define FTP_BADAUTH           504

#define FTP_NOSUCHPROT        504

#define FTP_NEEDENCRYPT       522

#define FTP_EPSVBAD           522

#define FTP_DATATLSBAD        522

#define FTP_LOGINERR          530

#define FTP_NOHANDLEPROT      536

#define FTP_FILEFAIL          550

#define FTP_NOPERM            550

#define FTP_UPLOADFAIL        553

Linux网络编程综合运用之MiniFtp实现(一)的更多相关文章

  1. Linux网络编程综合运用之MiniFtp实现(四)

    从今天开始,正式进入MiniFtp的代码编写阶段了,好兴奋,接下来很长一段时间会将整个实现过程从无到有一点点实现出来,达到综合应用的效果,话不多说正入正题: 这节主要是将基础代码框架搭建好,基于上节介 ...

  2. Linux网络编程综合运用之MiniFtp实现(九)

    上次中实现了FTP命令的映射来避免很多if....else的判断,这次主要是开始实现目录列表的传输,先看一下目前实现的: 数据连接创建好之后则开始进行目录列表的传输了,而要传输目录列表,首先要将目录列 ...

  3. Linux网络编程综合运用之MiniFtp实现(五)

    转眼兴奋的五一小长假就要到来了,在放假前夕还是需要保持一颗淡定的心,上次中已经对miniFTP有基础框架进行了搭建,这次继续进行往上加代码,这次主要还是将经历投射到handle_child()服务进程 ...

  4. Linux网络编程综合运用之MiniFtp实现(八)

    上节中实现了"USER"和"PASS"命令,如下: 事实上FTP是有很多命令组成的,如果就采用上面的这种方法来实现的话,就会有很多if...else if语句, ...

  5. Linux网络编程综合运用之MiniFtp实现(七)

    上节中实现了配置文件的解析,这节来实现用户登录的验证,首先用客户端来登录vsftpd来演示登录的过程: 接着再连接miniftpd,来看下目前的效果: 接下来实现它,与协议相关的模块都是在ftppro ...

  6. Linux网络编程综合运用之MiniFtp实现(六)

    间隔了一周时间没写了,由于今年的股势行情貌似不错的样子,对于对股市完全不懂的我也在蠢蠢欲动,所以最近一周业余时间在“不务正业”-----学习炒股.发现学习它其实挺费神的,满脑子都是走势图,而且是神经有 ...

  7. Linux网络编程综合运用之MiniFtp实现(三)

    前面已经对FTP相关的一些概念有了基本的认识,接下来就要进入代码编写阶段了,也是非常兴奋的阶段,在开启这个它之前先对项目需求进行一个梳理,对其我们要实现的FTP服务器是一个什么样子. ftp命令列表 ...

  8. 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"

    [深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...

  9. 【linux草鞋应用编程系列】_5_ Linux网络编程

    一.网络通信简介   第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章.   二.linux网络通信     在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...

随机推荐

  1. STS 重写父类方法的操作

    本来这种东西真的没什么好写的,但是很多时候真的是要用到的,不知道的话自己手动敲,会累死人的.所以记录在这里,自己的笔记,有需要的赶紧拿去,省的手动录入那么辛苦. 在代码窗口点击右键,依次选择“Sour ...

  2. Springboot创建项目(idea版本)

    一:概述 由于springboot项目,不管是java工程还是web工程都可以直接以jar方式运行,所以推荐创建jar工程,这里创建jar工程项目为例. 二:两种方式创建springboot项目 1. ...

  3. f(n-1) + f(n-2)的编译器处理

    https://gcc.godbolt.org   int addx(int a){ return a + 2; } int gooo(){ return addx(3) + addx(4) + ad ...

  4. web api 记录部署IIS获取服务器地址的类型

    获取服务器地址类型分多种,以下记录 1.HttpContext.Current.Server.MapPath("~/File") 返回的值为 D:\3Project\Code\Mo ...

  5. The underlying connection was closed: An unexpected error occurred on a send

    操作系统是Windows Server 2003 x64 SP2,使用Framework 4.0,在使用WebClient访问某些特定的HTTPS站点时,会引发异常: Unhandled Except ...

  6. Socket与WebSocket以及http与https重新总结

    Socket与WebSocket以及http与https重新总结 一.Socket 网络中的Socket是一个抽象的接口 ,而是为了方便使用TCP或UDP而抽象出来的一层 ,可以理解为网络中连接的两端 ...

  7. Java网络编程 -- AIO异步网络编程

    AIO中的A即Asynchronous,AIO即异步IO.它是异步非阻塞的,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,一般我们的业务处理逻辑会变成一个回调函数,等待IO操 ...

  8. Redis事务控制

    Redis事务控制 1.Redis事务控制的相关命令汇总 命令名 作用 MULTI 表示开始收集命令,后面所有命令都不是马上执行,而是加入到一个队列中. EXEC 执行MULTI后面命令队列中的所有命 ...

  9. unlink remove

    int unlink(const char *pathname); 删除一个文件的目录项并减少它的链接数 unlink()会删除参数pathname指定的文件.如果该文件名为最后连接点,但有其他进程打 ...

  10. poi操作Word创建超链接

    项目引入poi: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ ...