290 likes | 873 Views
Chapter 6:. 인터넷 제어 메시지 프로토콜( ICMP). 2003. 5. ICMP 메시지. IP 헤더. IP 데이터. Ethernet 헤더. Ethernet 데이터. 트레일러. 인터넷 제어 메시지 프로토콜. IP 네트워크에서 네트워크 문제에 관한 정보를 전달하기 위해 사용하는 프로토콜 (지속적 문제의 회피 가능) 예) 라우터에서 발생한 에러를 송신측으로 전달 IP 데이터그램에 캡슐화 되어 전송. <ICMP 메시지 캡슐화>. 0. 16. 31. 타입( Type).
E N D
Chapter 6: 인터넷 제어 메시지 프로토콜(ICMP) 2003. 5.
ICMP 메시지 IP 헤더 IP 데이터 Ethernet 헤더 Ethernet 데이터 트레일러 인터넷 제어 메시지 프로토콜 • IP네트워크에서 네트워크 문제에 관한 정보를 전달하기 위해 사용하는 프로토콜 (지속적 문제의 회피 가능) • 예) 라우터에서 발생한 에러를 송신측으로 전달 • IP 데이터그램에 캡슐화 되어 전송 <ICMP 메시지 캡슐화>
0 16 31 타입(Type) 코드(Code) 체크 섬 (Checksum) 8 바이트 나머지 헤더 (Rest of the header) 정보(Data) ICMP 메시지 포맷 • 타입(Type) –메시지의 종류를 15개로 구분 (대 분류) • 코드(Code) –메시지의 종류를 보다 세분화 (소 분류) • 체크 섬(Checksum) –메시지의 오류 검사 • 나머지 헤더–타입과 코드 값에 따라 변경됨
ICMP 메시지의 종류 • ICMP 메시지의 분류 기준 • 타입(Type): 대 분류 • 코드(Code): 소 분류 • 교재 229쪽, <표 6.1> ICMP 메시지 유형을 참고
ICMP 메시지의 종류 • 에러(error) 보고용 메시지 • IP 패킷 처리 도중 발생한 문제를 보고할 때 사용 • Destination unreachable, source quench… • 질의(query)용 메시지 • 다른 호스트로부터 특정 정보를 획득하기 위해 사용 • 네트워크 문제 진단 및 타임스탬프 요청과 같은 질의에 사용
에러 보고용 메시지 • 에러 보고용 메시지의 종류 • 라우터가 데이터그램을 라우팅 할 수 없을 때 • 호스트가 데이터그램을 전달할 수 없을 때 Destination Unreachable Source Quench • 혼잡으로 인해 데이터그램의 폐기를 알림 Error Reporting • 라우터가 최적 경로를 사용하지 않는 호스트 • 발견 시 최적 경로를 알리기 위해 사용 Redirection Time Exceeded • IP 헤더의 TTL 필드 값 만료를 나타냄 Parameter Problems • 데이터그램의 헤더 에러 문제 발생시 사용
에러 보고용 메시지 • 특징: Traffic 최소화 노력 • ICMP 에러 메시지를 전달하는 데이터그램에 대해서는 ICMP 에러 메시지를 생성하지 않음 • 목적지 IP주소에 브로드 캐스트나 멀티 캐스트 주소를 가진 데이터그램에 대해서는 에러 메시지가 생성되지 않음 • 출발지 IP주소에 ‘127.0.0.1’ 이나 ‘0.0.0.0’과 같은 불특정한 주소를 가진 데이터그램에 대해서는 에러 메시지가 생성되지 않음 • 단편화 된 데이터그램에서는 첫번째 단편에만 에러 메시지 생성
질의용 메시지 • 질의용 메시지의 종류 Echo request and reply • IP 호스트의 진단에 사용 • 두 시스템간에 IP 데이터그램이 오고 가는데 • 필요한 왕복시간(Round Trip Time)을 결정 Timestamp request and reply Query Address mask request and reply • 호스트가 라우터에게 서브넷 마스크 요청 • 다른 네트워크의 호스트에게 데이터 전송 시 • 자신의 네트워크에 연결된 라우터 주소 요청 Router solicitation and advertisement
ping 프로그램 실행 • ping? • 특정 호스트(IP)가 정상 작동 중인지 확인 • ICMP Echo request/reply 메시지를 이용 • AMAN2002 WinPing 실행 Packet Observer로 캡처 ICMP 메시지 분석
ICMP 메시지 분석 • Ping 수행 시 ICMP 메시지 캡처
31 0 16 • 타입 • 8 – Request • 0 – Reply 타입 (8 or 0) 코드 (0) 체크 섬(Checksum) 8 바이트 식별자(Identifier) 순서 번호(Sequence number) 정보(Data) ICMP 메시지 분석 • Type / Code • Type - 8, Code - 0 Echo Request(Ping Request) 메시지(교재, 표 6.1 참고) • ICMP Echo Request/Reply 메시지 포맷
ICMP 메시지 분석 • 체크 섬 • 0xD9F3(55795) • 식별자: 고유 세션 식별 번호 • 0x2C07(11271) • 순서번호: 동일 식별자를 가진 메시지들 구분 • 0x0100(256) ※ ping을 수행하는 근원지/목적지 주소, 프로토콜 정보는 IP 데이터그램헤더에 나타남
연습 문제 • ICMP Destination Unreachable Message헤더 16진수 값으로 완성하라. 03 03 FB C4 00 00 00 00 45 00 00 3A 36 62 00 00 7F 11 7D A7 D2 62 BD 17 D3 AA 24 71 00 89 00 89 00 3A 00 00
연습 문제 ※ 패킷의 값은 10진수로 표현하시오. • ICMP 헤더 • 타입/코드 • 체크 섬 • 인터넷헤더 • 송신지 IP . . . 에서 수신지 . . . 로 전송 • 상위의 프로토콜로 전달됨 • 데이터그램 헤더 • 송신지 포트 번에서 수신지 포트 번으로 전달
ICMP 캡처 프로그램 작성《IcmpViewer》 ※ 프로젝트 생성 및 라이브러리 경로 설정은 『ch04. 이더넷(Ethernet)』의 “이더넷 캡처 프로그램 작성”과 동일
6 7 Button List Control 1 Edit Box 2 3 5 4 대화상자 디자인
이벤트 처리 ※ 어댑터 오픈 대화상자 표시, 어댑터 열기, 패킷 캡처, 어댑터 닫기 함수의 설명은 『ch04. 이더넷(Ethernet)』 과 동일하므로 생략함
패킷 분석 • ICMP 헤더의 시작지점 arrTemp[0] arrTemp[14] arrTemp[14 + IpHLen] arrTemp ICMP 메시지(헤더+데이터) 이더넷 헤더 IP 헤더 arrTemp[14+9] 프로토콜 필드 1→ ICMP arrTemp[14]의 하위 4비트 헤더길이 :IpHLen arrpTemp[16], arrTemp[17] IP 데이터그램의 전체크기 필드 ICMP 메시지크기= IP데이터그램의 전체길이 – IpHLen
패킷 분석 • List Control 에 패킷 헤더 정보 표시 . . . // 하나의 패킷을 획득하여 arrTemp에 입력. 에러 시 음수 리턴 int iLengthOfPacket = pDlg->Ncap(arrTemp, MaxBufferLen); if(iLengthOfPacket < 0) continue; #define EtherHeaderLength 14 // IP 헤더의 프로토콜 필드 값이 1인 경우 ICMP 메시지 // IP 헤더의 프로토콜 필드 값이 0x01인 것만 골라냄 if( arrTemp[EtherHeaderLength + 9] == 0x01) { // IP 헤더 길이 unsigned char MASK = 0x0F; arrTemp[EtherHeaderLength] = arrTemp[EtherHeaderLength] & MASK; int iIpHeaderLength = arrTemp[EtherHeaderLength]<<2; . . .
패킷 분석 • List Control 에 패킷 헤더 정보 표시 // ICMP 타입 CString strIcmpType = _T(""); int iIcmpType = arrTemp[EtherHeaderLength + iIpHeaderLength]; strIcmpType.Format(_T("TYPE : %d"), iIcmpType); m_ListIcmpPacketInfo.SetItem(i, 1, LVIF_TEXT, strIcmpType, 0, 0, 0, 0); // ICMP 코드 CString strIcmpCode = _T(""); int iIcmpCode = arrTemp[EtherHeaderLength + iIpHeaderLength+1]; strIcmpCode.Format(_T("CODE : %d"), iIcmpCode); m_ListIcmpPacketInfo.SetItem(i, 2, LVIF_TEXT, strIcmpCode, 0, 0, 0, 0); // ICMP 체크섬 CString strIcmpChkSum = _T(""); strIcmpChkSum.Format(_T("%02X %02X"), arrTemp[EtherHeaderLength + iIpHeaderLength + 2], arrTemp[EtherHeaderLength + iIpHeaderLength + 3]); m_ListIcmpPacketInfo.SetItem(i, 3, LVIF_TEXT, strIcmpChkSum, 0, 0, 0, 0);
패킷 분석 • List Control 에 패킷 헤더 정보 표시 // ICMP의 나머지 헤더 부분 출력 CString strIcmpRestOfHeader; strIcmpRestOfHeader.Format(_T("%02X %02X %02X %02X "), arrTemp[EtherHeaderLength + iIpHeaderLength + 4], arrTemp[EtherHeaderLength + iIpHeaderLength + 5], arrTemp[EtherHeaderLength + iIpHeaderLength + 6], arrTemp[EtherHeaderLength + iIpHeaderLength + 7]); m_ListIcmpPacketInfo.SetItem(i, 4, LVIF_TEXT, strIcmpRestOfHeader, 0, 0, 0, 0); // IP 데이터그램 크기 출력 CString strIpPLen = _T(""); int iIpTotalLength = pDlg->Twobytes_to_number (arrTemp[EtherHeaderLength + 2], arrTemp[EtherHeaderLength + 3]); // IP 데이터그램의 데이터구간(ICMP 메시지) 길이 출력 strIpPLen.Format(_T("IP DLen : %d"), iIpTotalLength- iIpHeaderLength); m_ListIcmpPacketInfo.SetItem(i, 5, LVIF_TEXT, strIpPLen, 0, 0, 0, 0);
EtherHeaderLength + iIpTotalLength EtherHeaderLength + iIpHeaderLength EtherHeaderLength + iIpHeaderLength + 8 ICMP 헤더 (8바이트) ICMP 데이터 패킷 분석 • List Control 에 패킷 헤더 정보 표시 // ICMP 메시지의 데이터 구간 정보 출력 CString strIcmpDataSection = _T(""); CString strIcmpTmp = _T(""); int iIntVal = 0; m_strDataBuffer[i] = _T("Data Section : "); for(int j = EtherHeaderLength + iIpHeaderLength + 8; j < EtherHeaderLength + iIpTotalLength;j++) { strIcmpTmp.Format(_T("%02X "), arrTemp[j]); m_strDataBuffer[i] +=strIcmpTmp; } • ICMP 데이터 구간의 위치정보
IcmpViewer 실행화면 ICMP 메시지(헤더+데이터)의 길이 ICMP 헤더(기본 포맷) 8 바이트
IcmpViewer 실행화면 • 리스트 컨트롤의 항목 클릭 ICMP 메시지의 데이터영역의 값
IcmpViewer를 이용한 ICMP 메시지 분석 • 4번 항목 분석 • Type 3 (목적지 도달 불능,Destination Unreachable) • Code 3 (Port Unreachable) ※Type과 Code값에 따른 ICMP 메시지 유형 교재 혹은 AMAN2002 온라인 도움말(RFC ICMP RFC 792)
IP 헤더 데이터그램(UDP) 의 첫 64비트 IcmpViewer를 이용한 ICMP 메시지 분석 • Checksum 0x1CC0 • 나머지 헤더 사용하지 않으므로 0임 • 데이터(IP헤더 + 데이터그램 첫 64비트) • 라우터나 호스트가 목적지 도달 불능 메시지를 송신한 쪽으로 전달할 때 수신측에서 받은 IP 데이터그램을동봉하여 송신측으로 전송함 • UDP 목적지 포트번호 0x0089번을 사용하여 목적지 호스트에 접속할 수 없음을 의미함
참고 문헌 • 서승호 외, AMAN2002를 이용한 TCP/IP 프로토콜 분석 및 네트워크 프로그래밍, 정익사, 2002. • IETF, RFC 792, “Internet Control Message Protocol”, 1981. • James F. Kurose, Keith W. Ross, “Computer Networking: A top-down approach featuring the Internet”, Addison Wesley, 2001. • Douglas E. comer, David L. Stevens, “Internetworking with TCP/IP”, Prentice Hall, 1995. • W.Richard Stevens, “TCP/IP Illustrated Vol. 1:The Protocols”, Addison Wesley, 1994.