zoukankan      html  css  js  c++  java
  • [计算机网络] FTP 协议

    其实这篇文章本来打算写 P2P 协议的,结果发现写 P2P 协议的时候,需要写 FTP 协议,然后写完之后发现已经写了很多了.
    好吧,这篇文章就先来写 FTP 协议,下篇文章再写 P2P 协议.

    先来一个场景:
    如果想要下载一个电影,一般都是通过什么方式呢?
    能想到的,或者最先想到的就是通过 HTTP 来下载对吧?但是你有没有过这样的体验,就是通过浏览器下载的时候,只要这个文件稍微大一些,下载的速度就会特别慢,特别是下载自己最想要看的电影的时候,你会觉得,我的天啊,怎么这么慢啊~
    还有一种下载文件的方式,就是通过 FTP ( File Transfer Protocol ,文件传输协议).

    • FTP 有两个端口,一个是 20 ,一个是 21 ,所以 FTP 会采用两个 TCP 连接来传输一个文件.
      • 控制连接:服务器以被动的方式,打开众所周知用于 FTP 的端口 21 ,客户端则主动发起连接.该连接将命令从客户端传给服务器,并传回服务器的应答.常用的命令有: list -获取文件目录; reter -取一个文件; store -存一个文件.
      • 数据连接:每当一个文件在客户端与服务器之间传输时,就创建一个数据连接

    FTP 的两种工作模式(详细讲讲这部分)

    • 每传输一个文件,都要建立一个全新的数据连接. FTP 有两种工作模式,分别是主动模式( PORT )和被动模式( PASV ),这些都是站在 FTP 服务器的角度来说的.
      • 主动模式:客户端随机打开一个大于 1024 的端口 N ,向服务器的命令端口 21 发起连接,同时开放 N+1 端口监听,并向服务器发出 "port N+1 "命令,由服务器从自己的数据端口 20 ,主动连接到客户端指定的数据端口 N+1 .
      • 被动模式:当开始一个 FTP 连接时,客户端打开两个任意的本地端口 N (大于 1024)

    主动模式( PORT )下, FTP 连接步骤:
    1 ,客户端随机打开一个大于 1024 的端口 N ,同时一个 FTP 进程连接至服务器的 21 的命令端口.此时,我们来梳理一下,源端口为客户端的随机端口 N ,远程端口为服务器端的端口 21 ;
    2 ,客户端开始监听端口 ( N + 1 ),同时向服务器发送一个端口命令(通过服务器的 21 命令端口),这条命令就是为了告诉服务器客户端正在监听的端口号并且已准备好从这个端口接收数据;
    3 ,服务器打开 20 端口,并且建立和客户端数据端口的连接,然后向服务器发送一个应答,告诉服务器,已经建立好了一个连接.
    看似完美,但是其实是有个问题的,比如客户端的数据端口,防火墙并没有开放,那么你就没办法完成数据的传输.
    这也是被动模式( PASV )想要解决的问题.

    被动模式( PASV )下, FTP 连接步骤:
    这种模式,是在客户端通知服务器,它处于被动模式时才启用.
    在被动方式 FTP 中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的连接被防火墙过滤掉的问题.
    1 ,当开启一个 FTP 连接时,客户端打开两个任意的非特权本地端口( N>1024 和 N+1 );
    2 ,打开两个端口之后,第一个端口连接服务器的 21 端口,与主动方式的 FTP 不同,客户端不会提交 PORT 命令并允许服务器来回连它的数据端口,而是提交 PASV 命令;
    3 ,此时,服务器会开启一个任意的非特权端口 (P > 1024)并发送 PORT P 命令给客户端.然后客户端发起从本地端口 N+1 到服务器的端口 P 的连接用来传送数据.
    对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的 FTP :
    1 ,从任何大于 1024 的端口到服务器的 21 端口(客户端的初始化连接);
    2 ,服务器的 21 端口到任何大于 1024 的端口(服务器响应到客户端的控制端口的连接);
    3 ,从任何大于 1024 端口到服务器的大于 1024 端口(客户端初始化数据连接到服务器指定的任意端口);
    4 ,服务器的大于 1024 端口到远程的大于 1024 的端口(服务器发送 ACK 响应和数据到客户端的数据端口)

    总结一下,上面所说的那些.
    在网络传输中,如果想要使用 FTP 协议,如果不是大神,玩的不是很 6 ,建议选择被动模式,一般情况下,能满足需求;
    如果您是大神,玩的超级 6 ,当我上面什么都没说~

    感谢您的阅读哇~

  • 相关阅读:
    C语言 sprintf 函数 C语言零基础入门教程
    C语言 printf 函数 C语言零基础入门教程
    C语言 文件读写 fgets 函数 C语言零基础入门教程
    C语言 文件读写 fputs 函数 C语言零基础入门教程
    C语言 fprintf 函数 C语言零基础入门教程
    C语言 文件读写 fgetc 函数 C语言零基础入门教程
    C语言 文件读写 fputc 函数 C语言零基础入门教程
    C语言 strlen 函数 C语言零基础入门教程
    Brad Abrams关于Naming Conventions的演讲中涉及到的生词集解
    适配器模式
  • 原文地址:https://www.cnblogs.com/zll-0405/p/12534119.html
Copyright © 2011-2022 走看看