280 likes | 677 Views
Chapter 11:. FTP (File Transfer Protocol). 2003. 3. 클라이언트. 사용자. 사용자 인터페이스. 서버. 제어 연결. 사용자 프로토콜 인터프리터. 서버 프로토콜 인터프리터. (FTP 명령/응답). 파일 시스템. 파일 시스템. 데이터 연결. 사용자 데이터 전송 기능. 서버 데이터 전송 기능. FTP. 기능 네트워크 상에서 파일을 다른 시스템으로 전달하는 프로토콜 제어 연결(포트 21번)과 데이터 연결(포트 20번)로 구성
E N D
Chapter 11: FTP(File Transfer Protocol) 2003. 3.
클라이언트 사용자 사용자 인터페이스 서버 제어 연결 사용자 프로토콜 인터프리터 서버 프로토콜 인터프리터 (FTP 명령/응답) 파일 시스템 파일 시스템 데이터 연결 사용자 데이터 전송 기능 서버 데이터 전송 기능 FTP • 기능 • 네트워크 상에서 파일을 다른 시스템으로 전달하는 프로토콜 • 제어 연결(포트 21번)과 데이터 연결(포트 20번)로 구성 • 파일 이름의 구조, 텍스트 표현 방식, 디렉토리 구조 고려
제어 연결과 데이터 연결 • 제어 연결 • 전송시의 제어 명령을 전달 • 포트 21번 이용 • 데이터 연결관련 제어 정보 : 데이터 전송 포트, 전송 모드, 데이터 표현 타입 등 • 파일 관련 명령 : 파일 저장, 첨부, 삭제 등 • 데이터 연결 • 포트 20번 이용 • 데이터(파일) 전송을 위한 연결
제어 프로세스 제어 프로세스 21 데이터 전송 프로세스 데이터 전송 프로세스 a. 서버의 수동 오픈 제어 프로세스 제어 프로세스 6000 21 생성 자식 제어 프로세스 데이터 전송 프로세스 7000 데이터 전송 프로세스 b. 클라이언트의 능동 오픈 제어 프로세스 제어 프로세스 6000 21 자식 제어 프로세스 데이터 전송 프로세스 7000 데이터 전송 프로세스 c. 서버의 원 제어 프로세스와 자식 제어 프로세스 상태 제어 연결 설정 클라이언트 서버
제어 프로세스 제어 프로세스 6000 21 수동 오픈 데이터 전송 프로세스 데이터 전송 프로세스 6100 a. 클라이언트의 수동 오픈 PORT 6100 제어 프로세스 제어 프로세스 6000 21 수동 오픈 데이터 전송 프로세스 데이터 전송 프로세스 6100 b. 클라이언트의 수동 오픈 포트 번호를 서버로 전달 제어 프로세스 제어 프로세스 6000 21 데이터 전송 프로세스 데이터 전송 프로세스 6100 20 자식 데이터 전송 프로세스 7100 c. 서버의 데이터 전송 프로세스가 자식 데이터 전송 프로세스 생성 제어 프로세스 제어 프로세스 6000 21 데이터 전송 프로세스 데이터 전송 프로세스 6100 20 자식 데이터 전송 프로세스 7100 d. 자식 데이터 전송 프로세스와의 통신 데이터 연결 설정 클라이언트 서버
데이터 연결 설정을 통한 통신 • 데이터 타입 • 다양한 데이터 타입 설정 • ASCII, EBCDIC, IMAGE, LOCAL 타입 • TYPE 명령을 통해 변경 • 데이터 구조 • 파일 구조, 레코드 구조, 페이지 구조 • STRU 명령을 통해 변경 • 전송 모드 • 전송 방식, MODE 명령을 통해 변경 • 스트림 모드, 블록 모드, 압축 모드
FTP 명령 • 접근 제어 명령 • 접근 권한 및 인증 절차를 위해 사용되는 명령 • USER, PASS, ACCT, CWD, CDUP, SMNT, REIN, QUIT • 전송 변수 명령 • 기본적으로 할당된 변수의 값을 변경할 때 • PORT, PASV, TYPE, STRU, MODE • 서비스 명령 • 파일 전송 관련 제어 정보를 전달 • RETR, STOR, STOU, APPE, ALLO, REST, RNFR, RNTO, ABOR, DELE, RMD, MKD, PWD, LIST, NLIST, SITE, SYST, STAT, HELP
FTP 응답 코드 • FTP 응답 메시지의 첫번째 십진수 의미 • FTP 응답 메시지의 두번째 십진수 의미
FTP 패킷 분석 • FTP 제어 연결을 통한 전송
FTP 패킷 분석 • 44 45 4C 45 20 74 65 73 74 2E 74 78 74 0D 0A • Test.txt 파일 제거 • DELE 명령 • 서비스 명령 • 디렉토리 명이나 파일명을 매개변수로 전달
데이터 연결을 통한 파일 확인 (test.txt) FTP 패킷 분석 • FTP 데이터 연결을 통한 전송
파일 데이터 (test.txt) 54 68 69 73 20 69 73 20 74 65 73 74 20 66 6F 72 20 46 54 50 T h i s i s t e s t f o r F T P 28 46 69 6C 65 20 54 72 61 6E 73 66 65 72 20 50 72 6F 74 6F 63 6F 6C 29 ( F i l e T r a n s f e r P r o t o c o l ) FTP 패킷 분석 • FTP 포트 20번을 이용한 데이터 전송 • 전달된 파일 크기 : 44 바이트 • 파일 내용
(a) 54 59 50 45 20 41 0D 0A (b) 32 30 30 20 54 79 70 65 20 73 65 74 20 74 6F 20 41 2E 0D 0A 연습 문제 • 헥사 값의 의미 • FTP 응답 코드의 의미 분석
프로젝트 생성 및 환경 설정 • 다이얼로그 기반의 프로젝트 생성 • Include 경로 및 라이브러리 경로 설정 • Include files : C:\AMAN2002\include • Library files : C:\AMAN2002\lib • Tools->Options 메뉴 이용 • Ncap 라이브러리(Ncapd.lib)를 프로젝트에 포함 • Project->Settings 메뉴 이용
7 8 List Control 1 Edit Box Edit Box 2 3 6 4 5 Edit Box Edit Box Button 대화상자 디자인 • FtpViewer 메인 대화상자 디자인
어댑터 열기 // 선택된 네트워크 어뎁터를 사용할 수 있도록 초기화. // FTP는 TCP를 기반으로 데이터를 획득하므로 TCP 필터 설정 if(pDlg->OpenAdaptor(2)) { ::AfxMessageBox("Adaptor open 실패"); pDlg->CloseAdaptor(); delete pDlg; return; }
패킷 캡처 //패킷을 획득하여 List Control에 표시. #define MaxBufferLen 2048 #define EtherHeaderLength 14 … int i = 0; unsigned char arrTemp[MaxBufferLen]; while(i < m_EDIT_iCountInput) { memset(arrTemp, 0, MaxBufferLen); //패킷을 하나 획득함. 음수가 return되면 에러가 발생한 것. int iLengthOfPacket = pDlg->Ncap(arrTemp, MaxBufferLen); if(iLengthOfPacket <0 ) continue; // 패킷 분석 (슬라이드 22) … }
패킷 분석 //MASK unsigned char MASK1 = 0x0F; //IP 헤더의 헤더길이 정보를 얻기 위해 사용 unsigned char MASK2 = 0xF0; //TCP 헤더의 헤더길이 정보를 얻기 위해 사용 // IP 헤더 길이 정보 획득 arrTemp[EtherHeaderLength] = arrTemp[EtherHeaderLength] & MASK1; int iIpHeaderLength = arrTemp[EtherHeaderLength]<<2; // TCP 헤더의 근원지 포트 번호 unsigned int iSourcePort = pDlg->Twobytes_to_number( arrTemp[EtherHeaderLength + iIpHeaderLength], arrTemp[EtherHeaderLength + iIpHeaderLength+1]); // TCP 헤더의 목적지 포트 정보 획득 unsigned int iDestinationPort = pDlg-> Twobytes_to_number( arrTemp[EtherHeaderLength + iIpHeaderLength +2], arrTemp[EtherHeaderLength + iIpHeaderLength+1+2]); // FTP 패킷 구별 (슬라이드 23) …
FTP 패킷 구별 if(iSourcePort == 20 || iDestinationPort == 20 || iSourcePort == 21 || iDestinationPort == 21) { … // 근원지 포트 및 목적지 포트를 리스트에 출력 // TCP 헤더 길이 정보 획득 arrTemp[EtherHeaderLength + iIpHeaderLength + 12] = arrTemp[EtherHeaderLength + iIpHeaderLength + 12] & MASK2; arrTemp[EtherHeaderLength + iIpHeaderLength + 12] = arrTemp[EtherHeaderLength + iIpHeaderLength + 12]>>4; int iTcpHeaderLength = arrTemp[EtherHeaderLength + iIpHeaderLength + 12] << 2; // FTP 메시지 전체 출력 (슬라이드 24) … }
FTP 메시지 전체 출력 // 메시지 CString strFtpMessage = _T(""); CString strTemp = _T(""); // FTP 데이터의 시작 지점 int iFtpDataStart = EtherHeaderLength + iIpHeaderLength + iTcpHeaderLength; for(int j=iFtpDataStart; j< iLengthOfPacket; j++) { strTemp.Format(_T("%c"), arrTemp[j]); // 아스키 형태로 출력 m_strDataBuffer[i] += strTemp; strTemp.Format(_T("%02X "), arrTemp[j]); // 헥사 형태로 출력 strFtpMessage += strTemp; } m_LIST_PacketInfo.SetItem(i, 3, LVIF_TEXT, strFtpMessage, 0, 0, 0, 0);
FtpViewer를 이용한 FTP 패킷 분석 • 포트 21번 제어 연결을 통해 제어 명령 전달 (요청) • TYPE I 명령 : 데이터 타입을 Image 형으로 변경
FtpViewer를 이용한 FTP 패킷 분석 • 포트 21번 제어 연결을 통한 FTP 응답 • 응답 코드 200번 : 명령을 완료함
참고 문헌 • 서승호 외, AMAN2002를 이용한 TCP/IP 프로토콜 분석 및 네트워크 프로그래밍, 정익사, 2002. • RFC 959, J. Postel, J.K. Reynolds. File Transfer Protocol, Oct 1985. • RFC 854, J. Postel, J. Reynolds, Telnet Protocol Specification, May 1983. • RFC 1635, P. Deutsch, A. Emtage(Bunyip), A. Marine(NASA NAIC), How to Use Anonymous FTP, May 1994. • RFC 697, Jim Lieb, SUMEX-AIM, CWD Command of FTP, July 1975. • RFC 412, G. Hicks, User FTP Documentation, Nov 1972. • RFC 463, A.K. Bhushan. FTP commants and response, Feb 1973. • 11.7 W. Richard Stevens, “TCP/IP Illustrated, Volume I”, Addison wesley, 1996. • Behrouz A. Forouzan, “TCP/IP Protocol Suite”, McGraw-Hill, 2000. • 김영탁, 김종근, 조유제, 한기준 공저, “데이타 통신 및 컴퓨터망”, 정익사, 1999.