하나의 호스트에서 다른 호스트로 파일을 복사하기 위해 TCP/IP에 의해 제공되는 표준 기능이다.
간단히 파일 전송 프로토콜
호스트간 두 개의 연결 설정이 필요하다
- 데이터 전송 연결(포트 20)
- 명령과 응답 등의 제어 연결(포트 21)
종류
- 공개 FTP - 누구나 접속해서 다운로드 가능
- 비공개 FTP - 계정과 비밀번호가 필요
FTP는 보안 프로토콜로 계획되지 않아서 수많은 보안 취약점이 존재한다.
연결 과정
제어 연결
- 서버는 잘 알려진 포트 21로 수동 설정 시도 후 클라이언트의 응답 대기
- 클라이언트는 임시 포트 사용하여 능동적 연결 시도
![]() |
TCP_IP Protocol Suite 4th ed. - B. Forouzan (McGraw-Hill, 2010) |
데이터 연결
- 서버가 아닌 클라이언트가 임시 포트를 사용하여 수동적 연결 시도
- 클라이언트는 이 포트 번호를 서버에 전송
- 서버는 잘 알려진 포트 20과 임시 포트 번호 사용하여 능동적 연결 설정 시도
![]() |
TCP_IP Protocol Suite 4th ed. - B. Forouzan (McGraw-Hill, 2010) |
우선 위에서 설명한 기본적인 방식을 Active Mode 라고 하고, 좀 더 간단히 그림으로 보면 아래와 같다.
- 클라이언트에서 서버측 21번 포트로 접속 시도하고 데이터 포트는 서버에서 클라이언트로 접속하여 데이터 전송
- 클라이언트가 방화벽 뒤에 있는 경우 외부에서 이 클라이언트에게 접근이 어려움(passive mode 사용)
위의 20, 21번 포트는 너무나 잘 알려져 있다. 방화벽과 관련된 문제 혹은 악용 문제가 발생하기도 한다.
그래서 포트를 다르게 설정하는 방식이 있다. 이를 Passive Mode라고 하며, 아래와 같다.
- 클라이언트에서 서버측 21번 포트로 접속 시도하고 데이터 포트는 클라이언트에서 서버의 임의의 포트로 접속하여 데이터 전송
TFTP(Trivial FTP)
이름에서 느껴지듯 FTP의 복잡성 없는 간단한 파일 전송 프로토콜이다.
보다 단순하고 빠르게 전송해야 할 데이터가 존재할 경우 사용할 수 있다.
그러다보니 자연스럽게 TCP가 아닌 UDP 서비스를 사용한다.
간단히 정리하면 다음과 같다.
UDP 서비스 사용
연속적인 데이터 블록으로 파일 전송하기 위해 흐름 제어, 오류 제어 수행
흐름 제어
- 데이터 블록에 번호 부여하여 송신하고 이에 대한 ACK 기다리는 방식으로 흐름 제어
오류 제어
- 송신자 수신자 모두 타임아웃 사용하여 재전송
위의 흐름제어와 오류제어로 인해서 발생하는 문제가 있다.
마법사의 초보 버그(Sorcerer's apprentice bug)
![]() |
TCP_IP Protocol Suite 4th ed. - B. Forouzan (McGraw-Hill, 2010) |
ack 메시지가 유실되지 않고 지연되는 경우에 발생한다.
그림에서와 같이 모든 데이터 블록과 응답이 두번씩 송수신되는 문제가 발생할 수 있다.