Skip to content

File Transfer Protocol

파일 전송 프로토콜(File Transfer Protocol, FTP)은 TCP/IP 프로토콜을 가지고 서버와 클라이언트 사이의 파일 전송을 하기 위한 프로토콜이다. 파일 전송 프로토콜은 TCP/IP 프로토콜 테이블의 응용 계층에 속하며, 역사는 오래 되었지만 지금도 인터넷에서 자주 사용된다.

연결 종류

HTTP와는 달리 연결의 종류는 2가지가 있다:

  • 명령 연결: 먼저 제어 포트인 서버 21번 포트로 사용자 인증, 명령을 위한 연결이 만들어지고, 여기를 통해 클라이언트에서 지시하는 명령어가 전달된다.
  • 데이터 전송용 연결: 실제의 파일 전송은 필요할 때 새로운 연결이 만들어진다.
    • 능동 모드(포토 모드): 서버가 자신의 데이터 포트인 20번 포트에서부터 클라이언트가 지정한 지점으로의 데이터 연결을 만든다. 클라이언트가 지정하는 포트는 주로 1023 보다 큰 번호가 매겨진 포트이다. 클라이언트가 방화벽, NAT(IP 마스킹) 등을 사용하는 환경일 때에 잘 동작하지 않을 수 있는데, 이때 수동 모드를 이용하면 된다.
    • 수동 모드: 클라이언트가 서버가 지정한 서버 포트로 연결할 수 있게 한다. 이 때에는 보통 양쪽 포트 모두 1023 보다 큰 포트를 사용한다.

어느 모드에서도 2개의 연결을 만드는 점은 다르지 않다. 하지만 FTP 포트를 변경하게 되고 방화벽이 있는 경우, 방화벽 Inspection 모드 설정에 따라 FTP 통신은 정상적이지만, get 명령이나 ls 명령 등 FTP-DATA포트를 이용한 통신은 정상적으로 이루어지지 않을 수 있다.

Example

get
다운로드
mget
다수의 파일을 다운로드
put
업로드
mput
다수의 파일을 업로드
ls
접속한 SFTP 의 파일 목록 출력
!ls
로컬 서버의 파일 목록 출력
!{명령어}
로컬 서버에서 실행

주요 FTP 명령문

명령어

RFC

설명

ABOR

-

현재의 파일 전송 중단

ACCT

-

계정 정보

ADAT

RFC 2228

인증/보안 데이터

ALLO

-

파일을 받기 위해 충분한 디스크 공간 할당

APPE

-

이어서 추가

AUTH

RFC 2228

인증/보안 구조

CCC

RFC 2228

명령 채널 지우기

CDUP

-

부모 디렉터리로 변경

CONF

RFC 2228

기밀 보호 명령

CWD

-

작업 디렉터리 변경

DELE

-

파일 삭제

ENC

RFC 2228

개인 정보 보호 채널

EPRT

RFC 2428

서버 접속에 필요한 확장 주소 및 포트 지정

EPSV

RFC 2428

확장 수동 모드 들어가기

FEAT

RFC 2389

서버가 추가한 기능 목록 보기

LANG

RFC 2640

언어 탐색

LIST

-

지정한 경우 파일이나 디렉터리 정보를 반환. 지정하지 않은 경우 현재 작업 디렉터리 정보 반환

LPRT

RFC 1639

서버 접속에 필요한 긴 주소 및 목록 지정

LPSV

RFC 1639

긴 수동 모드 들어가기

MDTM

RFC 3659

지정한 파일의 마지막으로 수정한 시간 반환

MIC

RFC 2228

무결성 보호 명령

MKD

-

디렉터리 만들기

MLSD

RFC 3659

디렉터리의 이름이 지정되면 디렉터리의 내용을 보여줌

MLST

RFC 3659

명령 줄에 입력한 데이터만 제공

MODE

-

전송 모드 설정 (스트림, 블록, 압축)

NLST

-

지정한 디렉터리의 파일 이름 목록 반환

NOOP

-

동작 안 함 (더미 패킷: 대개 회선이 살아있는지를 살피기 위해 쓰임)

OPTS

RFC 2389

기능 옵션 선택

PASS

-

암호

PASV

-

수동 모드 들어가기

PBSZ

RFC 2228

보호 버퍼 크기

PORT

-

서버 접속에 필요한 주소 및 포트 지정

PROT

RFC 2228

데이터 채널 보호 수준

PWD

-

작업 디렉터리 인쇄. 호스트 컴퓨터의 현재 디렉터리 반환

QUIT

-

연결 끊기

REIN

-

연결 다시 초기화

REST

-

지정한 지점에서 전송 다시 시작

RETR

-

파일 복사본 전송

RMD

-

디렉터리 제거

RNFR

-

이름 변경 원본 이름

RNTO

-

이름 변경 대상 이름

SITE

-

지정한 명령어를 원격 서버로 송신

SIZE

RFC 3659

파일 크기 반환

SMNT

-

파일 구조 마운트

STAT

-

현재 상태 반환

STOR

-

데이터 입력 및 서버 쪽 파일로 저장

STOU

-

파일을 저만의 방식으로 저장

STRU

-

전송 구조 설정

SYST

-

시스템 유형 반환

TYPE

-

전송 모드 설정 (ASCII/바이너리)

USER

-

인증 사용자 이름

주요 FTP 응답코드

  • 200: 명령 OK.
  • 500: 구문 오류, 명령이 인식되지 않았음.
  • 501: 매개변수나 인자에서는 구문 오류.
  • 502: 명령이 구현되지 않았음.
  • 110: 재개시 표시기 응답.
  • 119: 단말기 사용 불가, 우편 박스 기능 시도.
  • 211: 시스템 상태, 또는 시스템 도움말 응답.
  • 212: 디렉토리 상태.
  • 213: 파일 상태.
  • 214: 도움말 메시지.
  • 120: 서비스가 nnn분 후에 준비됨.
  • 125: 데이타 연결이 이미 개방되어 있음; 전송 시작.
  • 225: 데이타 연결 개방; 진행중인 전송이 없음.
  • 425: 데이타 연결을 개방할 수 없음.
  • 226: 데이타 연결 폐쇄; 요청된 파일 동작이 성공적임.
  • 227: 수동 모드로 전환. h1, h2, h3, h4, p1, p2.
  • 230: 사용자가 로그인 되었음, 계속하시오.
  • 530: 로그인 되지 않았음.
  • 331: 사용자 명 ok, 비밀 번호가 필요함.
  • 332: 로그인을 위한 계정이 필요함.
  • 532: 파일 저장을 위한 계정이 필요함.
  • 150: 파일 상태 ok; 데이타 연결을 곧 개방할 것임.
  • 152: 알려지지 않은 사용자; 우편이 관리자에 의하여 회송될 것임.
  • 250: 요청된 파일 행위 ok, 완료되었음.
  • 350: 요청된 파일 행위가 더 이상의 정보를 보류하고 있음.
  • 450: 요청된 파일 행위가 이루어지지 않았음: 파일이 이용될 수 없음.
  • 550: 요청된 행위가 이루어지지 않았음: 파일 사용 불가.
  • 451: 요청된 행위가 강제 종료되었음: 국부 오류가 처리중임.
  • 551: 요청된 행위가 강제 종료되었음: 알려지지 않은 페이지 형식.
  • 452: 요청된 행위가 이루어지지 않았음: 시스템의 기억장치 공간이 불충분함.
  • 552: 요청된 파일 행위가 강제 종료 되었음: 기억장치 할당이 초과 되었음.
  • 553: 요청된 행위가 이루어지지 않았음: 파일명이 없음.

Projects

ftpclient-cpp
https://github.com/embeddedmz/ftpclient-cpp
C++ client for making FTP requests
FileZilla
FTP 클라이언트
fineftp-server
https://github.com/continental/fineftp-server
C++ FTP Server Library for Windows, Linux & more

Network-attached storage (NAS)

Favorite site

References


  1. List_of_ftp_server_return_codes.pdf