zoukankan      html  css  js  c++  java
  • FTP教程

    FTP:基础概念及使用
    最近需要做FTP相关的API给业务人员使用,所以了解咯下FTP。
    
    FTP是基于TCP协议,位于第五层(应用层)。
    
    FTP工作建立两条socket链路:
    
    1.控制链路(命令链路);
    2.数据链路;
    1
    2
    控制链路总是由ftp-client(以下统称client)向ftp-server(以下统称server)发起建立请求。 
    数据链路则与控制链路不同。 
    数据链路分为两类:
    
    1.server主动链接到client的某个端口,建立socket链路;
    2.client主动链接到server的某个端口,建立socket链路;
    1
    2
    由此,FTP分为两种模式:
    
    1.active模式:server主动发起链接,到client某端口;(也叫port模式)
    2.passive模式:server被动建立链接,由client主动发起链路建立请求;(即pasv模式)
    1
    2
    需要注意的是,正是由于数据链路的请求差异的建立,使得FTP分为两种不同的模式。
    
    所谓的主动与被动,都是站在server的角度来说: 
    server主动发起数据链路建立请求,则叫做active模式; 
    server被动建立数据链路,client主动,则叫做passive模式;
    
    我们通常说,FTP的两个端口分别是:
    
    1.命令端口:21;(也叫做控制端口)
    2.数据端口:20;
    1
    2
    一般命令端口总是21,即server一般都listen本机的21端口,总是等待client主动发起链路建立请求(client调用connect系统调用); 
    但是数据端口并不总是20,一般只在active模式下,数据端口才是20.
    
    active模式:
    
    server listen本机的21端口;
    client先与server建立命令链路(client调用connect系统调用,到server的命令端口21,建立socket链路),在client端的port为N;
    client监听N+1端口,发送FTP命令(PORT N+1)到server;
    server收到命令后用其数据端口(默认20)建立到client的N+1端口,传送数据;
    1
    2
    3
    4
    思考:
    
    client监听的N+1端口真的是本机命令链路的socket的N的数值加1吗?
    若client的命令链路的本机端口是12500,则数据链路的本机端口总是12501?
    若真是这样,为啥PORT还需要告知server N+1呢?server不总是知道吗?
    且,client在发起connect时,总是能保证当前的某个端口N以及N+1总是未被占用?OS可能调度别的进程监听这个N+1端口?毕竟对N/N+1监听不是一个原子操作.
    1
    2
    3
    4
    passive模式:
    
    server listen本机的21端口;
    client向server发送pasv命令,告知server我(client)处于被动模式;
    server收到客户端的模式通知后,会开放一个>1024的端口P进行监听,然后告知client我(server)现在的数据端口是P;
    client收到命令后通过N+1端口建立server:P的socket链路;
    1
    2
    3
    4
    主动/被动模式比较:
    
    在port模式中,client发送PORT命令到server;
    在pasv模式中,client发送PASV命令到server;
    
    在port模式中,命令链路的建立是由client发起的,数据链路的建立是由server发起的;
    在pasv模式中,命令链路、数据链路的链接都是由client发起的。
    1
    2
    3
    4
    5
    其实一开始有的是主动模式,被动模式是后来慢慢发展出来的。
    
    主动与被动ftp优缺点:
    1.主动模式:
    由于ftp-server主动链接ftp-client的一个随机端口,这个随机端口可能被client的firewall拒绝掉;
    2.被动模式:
    由于ftp-client主动链接ftp-server的一个随机端口,这个随机端口可能被server的firewall拒绝掉;
    1
    2
    3
    4
    5
    当client安装了firewall,而很多firewall在设置的时候都是不允许接受外部发起的连接的,所以若使用FTP的主动模式,由server发起对firewall保护下的client的链接建立请求就会被拒掉。即,许多内网的client不能用PORT模式登陆server,因为从server的TCP 20无法和内部网络的client建立一个新的socket连接,造成无法工作。
    
    那若是server安装了firewall,又会怎样? 
    许多位于firewall后或内网的server不支持PASV模式,因为client无法穿过firewall打开server的高端端口(>1024),也是被拒掉的。
    
    若是client安装了firewall,使得FTP无法使用PORT模式,则可以使用PASV模式来工作,让server开一个端口,client连过去。
    
    FTP的传输有两种方式,一种是ascii模式,一种是binary模式。
    
    ascii模式传输简单的ascii码文本,FTP有可能自动调整传输的内容以适应传输双方可能的OS可能存在的差异; 
    (例如:linux下换行,win下回车+换行,待实验); 
    binary模式工作在传输可执行文件等非文本的情况下,ftp将内容“原汁原味”地传送,不做任何修改;
    
    ascii由于潜在的“自动转换”,所以相比binary,需要多做一些工作,速度上就要有损失作为代价。
    
    怎样使用ftp来工作?
    
    通常ftp服务端是不需要我们来操心的,我们更加关心的是,如何使用ftp client来从ftp server进行文件的上载和下载。
    
    Windows下:
    
    
    
    
    
    
    
    上面比较关键的命令有:
    
    ftp
    open ip cmd-port
    get
    put
    ls
    1
    2
    3
    4
    5
    含义基本上很明显,open是打开一个控制链路,get是下载server的文件到本地,put是上载本地文件到server。(发现没有,都是以client角度看待问题的)
    
    
    
    这里用到了:
    
    1.close
    2.quit
    1
    2
    close可以退出当前用户,而quit直接退出命令行咯。
    
    最最核心的是,善于使用”help”!有啥不会的?使用help命令来帮助。
    
    
    
    ftp>help
    ftp>?
    ftp>? xxx
    1
    2
    3
    Linux下:
    
    [test1280@eb6347 ~]$ ftp
    ftp> open 127.0.0.1 21
    Connected to 127.0.0.1.
    220 Welcome to EBupt-ISMP
    530 Please login with USER and PASS.
    530 Please login with USER and PASS.
    KERBEROS_V4 rejected as an authentication type
    Name (127.0.0.1:test1280): test1280
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> pwd
    257 "/"
    ftp> ls
    227 Entering Passive Mode (127,0,0,1,103,96)
    150 Here comes the directory listing.
    drwxrwxr-x   20 514      514          4096 Nov 21 12:21 bak
    -rw-r--r--    1 514      514        318256 Nov 21 13:12 libuuid-1.0.3.tar.gz
    -rw-r--r--    1 514      514        303586 Nov 21 12:21 lua-5.3.4.tar.gz
    -rw-r--r--    1 514      514       2826473 Nov 21 12:21 ncurses.tar.gz
    -rw-r--r--    1 514      514      12788556 Nov 21 12:21 valgrind-3.12.0.tar.bz2
    226 Directory send OK.
    ftp> delete valgrind-3.12.0.tar.bz2
    250 Delete operation successful.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    
    可以看到,在Linux下的ftp客户端有更多的命令可以操作,但是常用的get/put/ls/delete等还是与Windows下是一样的。
    
    通常我还会用到:
    
    ftp> ? debug  
    debug       toggle/set debugging mode
    ftp> ? type
    type        set file transfer type
    ftp> ? prompt
    prompt      force interactive prompting on multiple commands
    ftp> ? verbose
    verbose     toggle verbose mode
    1
    2
    3
    4
    5
    6
    7
    8
    ftp> debug
    Debugging on (debug=1).
    ftp> debug
    Debugging off (debug=0).
    ftp> verbose
    Verbose mode off.
    ftp> verbose
    Verbose mode on.
    ftp> prompt
    Interactive mode off.
    ftp> prompt
    Interactive mode on.
    ftp> ascii
    200 Switching to ASCII mode.
    ftp> binary
    200 Switching to Binary mode.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    大家可以多尝试尝试verbose等命令,看看不同模式下是什么样的行为?
    
    多尝试多做实验总归是有好处的。
    
    其他:
    
    我简单实验了一下,在HPUX下ftp也是一样的使用方式,先ftp进入交互模式,然后open打开,然后put呀get呀什么的。
    
    另外,真是要点赞下vsftpd这个软件(very secure ftpd),有了它我才能自行搭建自己的FTP服务器~有时间再记录下简易地搭建自己的FTP服务器的流程。
    

      

    FTP:基础概念及使用最近需要做FTP相关的API给业务人员使用,所以了解咯下FTP。
    FTP是基于TCP协议,位于第五层(应用层)。
    FTP工作建立两条socket链路:
    1.控制链路(命令链路);2.数据链路;12控制链路总是由ftp-client(以下统称client)向ftp-server(以下统称server)发起建立请求。 数据链路则与控制链路不同。 数据链路分为两类:
    1.server主动链接到client的某个端口,建立socket链路;2.client主动链接到server的某个端口,建立socket链路;12由此,FTP分为两种模式:
    1.active模式:server主动发起链接,到client某端口;(也叫port模式)2.passive模式:server被动建立链接,由client主动发起链路建立请求;(即pasv模式)12需要注意的是,正是由于数据链路的请求差异的建立,使得FTP分为两种不同的模式。
    所谓的主动与被动,都是站在server的角度来说: server主动发起数据链路建立请求,则叫做active模式; server被动建立数据链路,client主动,则叫做passive模式;
    我们通常说,FTP的两个端口分别是:
    1.命令端口:21;(也叫做控制端口)2.数据端口:20;12一般命令端口总是21,即server一般都listen本机的21端口,总是等待client主动发起链路建立请求(client调用connect系统调用); 但是数据端口并不总是20,一般只在active模式下,数据端口才是20.
    active模式:
    server listen本机的21端口;client先与server建立命令链路(client调用connect系统调用,到server的命令端口21,建立socket链路),在client端的port为N;client监听N+1端口,发送FTP命令(PORT N+1)到server;server收到命令后用其数据端口(默认20)建立到client的N+1端口,传送数据;1234思考:
    client监听的N+1端口真的是本机命令链路的socket的N的数值加1吗?若client的命令链路的本机端口是12500,则数据链路的本机端口总是12501?若真是这样,为啥PORT还需要告知server N+1呢?server不总是知道吗?且,client在发起connect时,总是能保证当前的某个端口N以及N+1总是未被占用?OS可能调度别的进程监听这个N+1端口?毕竟对N/N+1监听不是一个原子操作.1234passive模式:
    server listen本机的21端口;client向server发送pasv命令,告知server我(client)处于被动模式;server收到客户端的模式通知后,会开放一个>1024的端口P进行监听,然后告知client我(server)现在的数据端口是P;client收到命令后通过N+1端口建立server:P的socket链路;1234主动/被动模式比较:
    在port模式中,client发送PORT命令到server;在pasv模式中,client发送PASV命令到server;
    在port模式中,命令链路的建立是由client发起的,数据链路的建立是由server发起的;在pasv模式中,命令链路、数据链路的链接都是由client发起的。12345其实一开始有的是主动模式,被动模式是后来慢慢发展出来的。
    主动与被动ftp优缺点:1.主动模式:由于ftp-server主动链接ftp-client的一个随机端口,这个随机端口可能被client的firewall拒绝掉;2.被动模式:由于ftp-client主动链接ftp-server的一个随机端口,这个随机端口可能被server的firewall拒绝掉;12345当client安装了firewall,而很多firewall在设置的时候都是不允许接受外部发起的连接的,所以若使用FTP的主动模式,由server发起对firewall保护下的client的链接建立请求就会被拒掉。即,许多内网的client不能用PORT模式登陆server,因为从server的TCP 20无法和内部网络的client建立一个新的socket连接,造成无法工作。
    那若是server安装了firewall,又会怎样? 许多位于firewall后或内网的server不支持PASV模式,因为client无法穿过firewall打开server的高端端口(>1024),也是被拒掉的。
    若是client安装了firewall,使得FTP无法使用PORT模式,则可以使用PASV模式来工作,让server开一个端口,client连过去。
    FTP的传输有两种方式,一种是ascii模式,一种是binary模式。
    ascii模式传输简单的ascii码文本,FTP有可能自动调整传输的内容以适应传输双方可能的OS可能存在的差异; (例如:linux下换行,win下回车+换行,待实验); binary模式工作在传输可执行文件等非文本的情况下,ftp将内容“原汁原味”地传送,不做任何修改;
    ascii由于潜在的“自动转换”,所以相比binary,需要多做一些工作,速度上就要有损失作为代价。
    怎样使用ftp来工作?
    通常ftp服务端是不需要我们来操心的,我们更加关心的是,如何使用ftp client来从ftp server进行文件的上载和下载。
    Windows下:






    上面比较关键的命令有:
    ftpopen ip cmd-portgetputls12345含义基本上很明显,open是打开一个控制链路,get是下载server的文件到本地,put是上载本地文件到server。(发现没有,都是以client角度看待问题的)


    这里用到了:
    1.close2.quit12close可以退出当前用户,而quit直接退出命令行咯。
    最最核心的是,善于使用”help”!有啥不会的?使用help命令来帮助。


    ftp>helpftp>?ftp>? xxx123Linux下:
    [test1280@eb6347 ~]$ ftpftp> open 127.0.0.1 21Connected to 127.0.0.1.220 Welcome to EBupt-ISMP530 Please login with USER and PASS.530 Please login with USER and PASS.KERBEROS_V4 rejected as an authentication typeName (127.0.0.1:test1280): test1280331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> pwd257 "/"ftp> ls227 Entering Passive Mode (127,0,0,1,103,96)150 Here comes the directory listing.drwxrwxr-x   20 514      514          4096 Nov 21 12:21 bak-rw-r--r--    1 514      514        318256 Nov 21 13:12 libuuid-1.0.3.tar.gz-rw-r--r--    1 514      514        303586 Nov 21 12:21 lua-5.3.4.tar.gz-rw-r--r--    1 514      514       2826473 Nov 21 12:21 ncurses.tar.gz-rw-r--r--    1 514      514      12788556 Nov 21 12:21 valgrind-3.12.0.tar.bz2226 Directory send OK.ftp> delete valgrind-3.12.0.tar.bz2250 Delete operation successful.1234567891011121314151617181920212223242526

    可以看到,在Linux下的ftp客户端有更多的命令可以操作,但是常用的get/put/ls/delete等还是与Windows下是一样的。
    通常我还会用到:
    ftp> ? debug  debug       toggle/set debugging modeftp> ? typetype        set file transfer typeftp> ? promptprompt      force interactive prompting on multiple commandsftp> ? verboseverbose     toggle verbose mode12345678ftp> debugDebugging on (debug=1).ftp> debugDebugging off (debug=0).ftp> verboseVerbose mode off.ftp> verboseVerbose mode on.ftp> promptInteractive mode off.ftp> promptInteractive mode on.ftp> ascii200 Switching to ASCII mode.ftp> binary200 Switching to Binary mode.12345678910111213141516大家可以多尝试尝试verbose等命令,看看不同模式下是什么样的行为?
    多尝试多做实验总归是有好处的。
    其他:
    我简单实验了一下,在HPUX下ftp也是一样的使用方式,先ftp进入交互模式,然后open打开,然后put呀get呀什么的。
    另外,真是要点赞下vsftpd这个软件(very secure ftpd),有了它我才能自行搭建自己的FTP服务器~有时间再记录下简易地搭建自己的FTP服务器的流程。--------------------- 作者:test1280 来源:CSDN 原文:https://blog.csdn.net/test1280/article/details/78597373 版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    javascript 编码规范
    javascript 减少全部变量
    轮播图 jquery
    SVN MAC
    php excel
    php email
    查看网站后台
    linux 下载文件
    第6周小组作业:软件测试和评估
    第4周小组作业:WordCount优化
  • 原文地址:https://www.cnblogs.com/huiandong/p/10162488.html
Copyright © 2011-2022 走看看