[FTP] (1) FTP(File Transmission Protocol) 프로토콜 이해

네트워크로그 2011. 3. 9. 01:44



응용계층 프로토콜에 한 종류인 FTP에 대해 알아보고,  C언어를 사용하여 간단한 FTP 프로그램을 만들어보자.  

 


1. FTP 란? 

FTP 는 2대의 컴퓨터 간에 파일 전송을 위한 애플리케이션 프로토콜로 RFC 959에 정의되어 있다. 

Transport  계층 프로토콜로 TCP를 사용하며,  클라이언트/서버 모델 구성을 가지고 있으며,  FTP 서버는

21번 포트에서 FTP 클라이언트의 접속을 기다린다. FTP는 텔넷과는 달리,  클라이언트와 서버간에 2개의 

커넥션을 맺어 통신을 한다. 제어 명령을 송수신하는 PI(Protocol Interpreter) 프로세스와, 데이터를 송수신하는

DTP(Data Transmission Process) 로 구성된다. 





2. Active 모드 vs Passive 모드 

데이터를 전송하는 방식에 따라 Active 모드와 Passive 모드가 존재한다. 서버를 기준으로 했을 때,  서버가 

클라이언트에 접속하여 데이터를 송수신하는 것을  Active 모드라 하며,  클라이언트가 서버에 접속하여 

데이터를 송수신하는 것이 Passive 모드이다. 

 




3.  FTP  애플리케이션의 구조 

FTP 애플리케이션의 구조는 다음과 같다. 



 

 알툴즈의  알 FTP 와 같이 그래픽 유저 인터페이스를 제공하는 FTP 클라이언트도 있는가 하면, 유닉스/리눅스에서와 같이   

터미널에서 동작하는  텍스트 인터페이스의 FTP 클라이트도 존재한다. 하지만 어떤 클라이언트 형태는 RFC959에 정의된 

FTP 프로토콜에 따라 내부적으로 FTP 서버와 통신하게 된다. 

 

FTP 클라이언트 인테페이스를 통해, FTP 명령을 치면 클라이언 PI와 서버 PI간에 통신이 이루어진다. 작업디렉토리에 파일목록

출력과 데이터 업로드, 다운로드와 같은 작업들은 PI 를 통해 초기화가 이루어지면, 실제 데이터 전송은 서버와 클라이언트의 DTP 

간에 별도의 커넥션을 통해 이루어진다.

 PI와 DTP는 구조상에  개념이며, 반드시 FTP 클라이어트가 2개의 프로세스로 구성되어야  하는 것은 아니다. 

한 개의 프로세스여도, 프로토콜 전송 주소와 포트, 절차만을 준수하면 이상없이 서버와 통신할 수 있다. 

 




4.  FTP 명령 / 명령을 완료하기 위해 전송되는 프로토콜


FTP 클라이언트에서 사용할 수 있는 명령들은 다음과 같다. 더 많지만 자주 사용되는 명령들만을 간추려 보았다. 
 

커맨드 기능 프로토콜 
 open
<아이피 주소 또는 호스트명>
 해당 주소의 FTP 서버로 접속한다. 접속이 성공하면 Name과 Password를
입력하여  로그인할 수 있다.

 커넥트

 USER

 PASS

 SYST

 pwd  현재 원격(서버) 작업 디렉토리를 얻어온다.  PWD
 cd <디렉토리>  원격 작업 디렉토리를 변경한다   CWD
 ls  현재 원격 작업디렉토리의 파일목록을 얻어온다.

 PASV

 LIST

 hash  파일 업로드/다운로드시 1024바이트 단위로 해시문자 출력 옵셥을 on/off  한다.    
 get <파일명>   서버에 파일을 로컬로 다운로드한다. 

 PASV

 GET

 put <파일명>  로컬 파일으로 서버로 업로드한다. 

 PASV

 PUT

 quit/bye  FTP를 종료한다.   QUIT
 !<쉘명령>  셀 이스케이프. 쉘 명령을 수행하고, FTP 로 되돌아온다.   
ascii / binary  파일을 아스키 또는 바이너리로 전송한다.   TYPE I./A
 ?  FTP 명령 사용법을 출력한다.   

 

  커맨드는 텍스트 기반 FTP 클라이언트에서 사용자게 터미널을 통해 입력받는 명령이며, 이러한 명령의 기능을 수행하기 위해

 클라이언트는 서버에게  한개 이상의 프로토콜을  전송하게 된다. 클라이언트가 서버에게 전송하는 프로토콜은 텍스트이며, 

프토토콜의 종결문자로 \r\n을 사용한다.  다음은 몇가지 FTP 프로토콜이다. 

 


4.1 FTP 프로토콜

커맨드 내용 비고
 USER 사용자명  FTP 계정에 사용자 명을 전송한다   
 PASS 비밀번호  FTP 계정에 사용자 비밀번호를 전송한다  
 SYST  FTP 서버에 운영체제 종류를 문의한다.   
 PWD  현재 작업디렉토리 경로를 얻어온다.   
 CWD 디렉토리  인자로 주어진 디렉토리로 현재 작업디렉토리를 변경한다    
 PASV  passive 모드로 전환한다. 서버는 클라이언트의 접속을 기다릴 주소와 포트를 쉼표를 구분자로 하여 (127,0,0,1,234,13) 의 포맷으로 응답해준다.   
 LIST  현재 작업 디렉토리의 파일목록을 얻어온다.   
 GET 파일명  원격 작업디렉토리 상에 파일을 로컬로 다운로드 한다.   
 PUT 파일명   로컬의 파일을 원격 작업디렉토리로 업로드 한다.   
 RETR  로컬로 파일 다운로드시 클라이언트가 서버에게 데이터 전송시작을 요청한다.   
 STOR  파일 업로드시 클라이언트가 서버에게 데이터 전송시작을 요청한다.   
 PORT h0,h1,h2,h3,p0,p1   Active 모드로 데이터 전송시  서버에게 클라이언트가 대기할 주소와 포트를 쉼표를 구분자로 전송한다. p0, p1은 2바이트 포트의 각 바이트의 십진수값이다  
 QUIT  연결을 종료한다.   


 


4.2  데이터 전송모드

데이터 전송은 passive 모드와  active 모드로 전송할 수 있으며, 그 개념상에 차이는 이전에 설명했다. active 모드로 데이터 

전송시  클라이언트는   PORT 명령을 통해 서버가 접속할 수 있도록 클라이언트가 대기할 주소와 포트번호를 전송한다. 


 

PORT 202,13,180,230,4,103 


 앞에 2개의 수는 IP 를 구성하고 있는 수들이며, 4, 103은 2바이트 포트번호의 각 바이트를 십진수로 표현한 값(4x256 + 103)이다.

 즉 위 프로토콜을 해석하면  202.13.180.230 주소, 1127 포트에서 대기할 테니 여기로 서버는 접속하시오 ~~ 라는 의미가 

되겠다.  이렇게  서버가 클라이언트에게 접속하면, 클라이언트는 바로 데이터를 전송하면 된다. 

 passive 모드에서는 클라이언트는 PASV 프르토콜을 전송하여 passive 모드로 데이터를 전송받겠다는 것을 서버에게 알리면, 

서버는 위와 통일한 포맷으로 서버가 대기할 주소와 포트번호를 알려준다. 클라이언트는 이 값을 읽어들여 해당 주소로 접속한다. 

이후 LIST, RETR, STOR 을 전송하여 실제 데이터 전송을 시작해달라고 요청하게 된다. 

 

다음은 이를 나타내고 있는 그림이다.