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)
- Network File System (NFS)
- Server Message Block (SMB)
- Common Internet File System (CIFS)
- Apple Filing Protocol (AFP)
- File Transfer Protocol (FTP)
Favorite site
- FTP의 원리 및 명령, 응답코드
- Wikipedia (en) File Transfer Protocol
- Wikipedia (en) List of FTP server return codes 1
- SFTP 접속 및 파일 전송
References
-
List_of_ftp_server_return_codes.pdf ↩