IP (Internet Protocol) Chapter 5: IP (Internet Protocol) 2003. 4.
인터넷 프로토콜 기능 특징 TCP/IP 프로토콜에서 사용하는 전송 메커니즘 무결성 보장 않음. 순서 보장 않음. 비연결형 프로토콜 (가상회선 설정 않음)
IP 데이터그램 IP 데이터그램의 구조 서비스유형 전체길이 식별자 단편옵셋 수명 프로토콜 체크 섬 근원지 주소 목적지 주소 0 7 8 15 16 31 버전 (4비트) 헤더길이 서비스유형 전체길이 식별자 플래그 (3비트) 단편옵셋 수명 프로토콜 체크 섬 근원지 주소 목적지 주소 옵션 (0~40바이트) 20바이트
IP 데이터그램의 구조 (1) 버전 (version) 헤더길이 (Header length) ex) 20 byte 헤더는 5로 표현. 서비스 유형 (Type of Service) 데이터그램의 우선순위, 처리방법을 나타냄, <표 5.1> 참고 Precedence (우선순위): 0 보통 ~ 7 최우선 <RFC 1349 definition> D: Minimize Delay T: Maximize Throughput R: Maximize Reliability C: Minimize Cost 모든 비트 0 이면 Normal. 마지막 비트는 항상 0. D T R C Type of Service: 처리 방법
Precedence Precedence RFC 791 definition 0 (000) Routine (Normal) 1 (001) Priority 2 (010) Immediate 3 (011) Flash 4 (100) Flash Override 5 (101) Critical 6 (110) Internetwork Control 7 (111) Network Control
IP 데이터그램의 구조 (2) 전체길이 (Total Packet Length) 식별자 (Fragment Identifier) IP 헤더를 포함한 전체 IP 패킷의 Byte단위 길이 IP 패킷의 최소 길이는 21byte (20byte 헤더 + 1byte 데이터) IP 패킷의 최대 길이는 65,535 byte (216 -1) 식별자 (Fragment Identifier) IP가 단편화 될 때 단편들을 식별하기 위한 번호 단편화된 IP 패킷들을 재조립할 때 사용 플래그 (Fragmentation Flags) 단편화 여부, 조각이 단편의 첫번째 조각인지, 중간 혹은 마지막 조각인지를 구분, 단편 방지 등 단편화 제어. 단편 옵셋 (Fragmentation Offset) 조각난 단편들의 원래 IP 데이터그램에서의 위치정보를 나타내는 포인터. 재조립 시에 단편의 순서를 맞추기 위해 사용.
Flag and Offset DF MF 첫 비트는 항상 0. DF: Do not Fragment, 0: 단편화 가능, 1: 단편화 금지 MF: More Fragment, 0: 마지막 단편(혹은 단편화되지 않았음), 1: 뒤에 단편이 더 있음. Fragmentation Flag: 단편화 제어 DF MF Fragmentation Offset: 재조립 순서 정보
IP 데이터그램의 구조 (3) 수명 (Time-to-Live) 프로토콜 (Protocol Identifier) 데이터그램이 폐기되기 전 인터넷에서 얼마나 생존할 수 있는지를 지시하는 값 (최소 1, 최대 28-1= 255 값 지정). 라우터를 통과할 때 마다 1씩 감소, 0이되면 폐기. 프로토콜 (Protocol Identifier) IP 데이터그램이 싣고 가는 데이터의 종류 AMAN2002 온라인 도움말의 Protocol Type 부록 참조. 예) ICMP:1, TCP:6, UDP:17 체크 섬 (Header Checksum) 전송 도중 IP 헤더의 손상여부를 확인. 라우터에서 IP 헤더의 일부분이 변경될 때 마다 다시 계산된다.
IP 데이터그램의 구조 (4) 근원지 주소 (Source IP Address) 보내는 편의 IP 주소. (데이터 그램을 생성한 시스템의 IP 주소) 목적지 주소 (Destination IP Address) IP 데이터그램의 최종 목적지 주소 옵션 (Options) 경로설정, 타이밍, 관리, 정렬 등의 부수적인 기능처리 IP 헤더 길이가 20Byte를 초과하게되는 유일한 이유. Padding Option이 사용되어 헤더가 4Byte단위가 안되면 Padding을 붙여 4Byte 단위로 맞춤. (참고: Header Length 필드는 4Byte단위 크기)
이더넷 프레임에 포함된 IP 데이터그램 Preamble S F D Destination Address Source Type DATA FCS 7byte 1byte 6byte 2byte 46-1500byte 4byte Ethernet Header IP 헤더 데이터
IP 주소 IP 주소의 구성 네트워크 ID 호스트 ID 네트워크를 구분 네트워크 상에 존재하는 컴퓨터들을 구분 네트워크 ID
IP 주소 체계 A,B,C 클래스로 구분 class A 1.0.0.0 ~ 127.255.255.255 class B 128.0.0.0 ~ 191.255.255.255 class C 192.0.0.0 ~ 223.255.255.255 0 8 15 23 31 net ID (7) host ID (24) A class 1개 = 16,777,216개 IP 1 net ID (14) host ID (16) B class 1개 = 65,536개 IP 1 net ID (21) host ID (8) C class 1개 = 256개 IP
IP 데이터그램 분석
IP 데이터그램 분석 (1/5) 45 00 00 30 00 00 40 00 33 06 C7 F4 D3 E9 1C 70 D2 62 BD 17 0 7 8 15 16 31 버전 4 헤더길이 5 서비스유형 00 전체길이 00 30 식별자 00 00 플래그 / 단편옵셋 40 00 (0100 0000 0000 0000) 수명 33 프로토콜 06 체크 섬 C7 F4 근원지 주소 D3 E9 1C 70 목적지 주소 D2 62 BD 17 ※ 16진수로 표기함
Minimize monetary cost IP 데이터그램 분석 (2/5) 버전 0x4 IP 데이터그램 버전 4를 사용 헤더길이 0x5 5 x 4 = 20, 헤더길이는 20 바이트임 서비스 유형 0x0 최소지연, 최대 처리율, 최대 신뢰성, 최소비용 모두 요구하지 않음, 기본 서비스 유형임 0 1 2 3 4 5 6 7 서비스 유형 Minimize delay Maximize throughput Maximize reliability Minimize monetary cost 0x00 0x02 1 0x04 0x08 0x10
IP 데이터그램 분석 (3/5) 전체 길이 0x30 IP 데이터그램의 전체길이는 48 바이트임 동일한 식별자 값이 부여됨 플래그/단편옵셋 플래그 단편화 되지 않은 유일한 단편임 단편옵셋 0이므로 단편화 되지 않았거나 단편화 되었을 때 첫번째 단편임 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 More Fragment 0 → 마지막 단편이거나 유일한 단편임 1 → 마지막 단편 아님 Do Not Fragment 1 → 단편화 금지, 0 → 단편화 가능
IP 데이터그램 분석 (4/5) 수명 0x33 51개의 라우터를 거친 후 폐기됨 프로토콜 0x06 IP 데이터그램은 상위 TCP 프로토콜에 전달됨 교재, TCP/IP 프로토콜 분석 및 네트워크 프로그래밍, 부록 4 Protocol Numbers 참고 AMAN2002 Online Help의 “Protocol Type” 참조
IP 데이터그램 분석 (5/5) 체크 섬 0xC7F4 전송 중 데이터그램의 오류 검사 목적지에서 다시 체크 섬을 계산하여 전송시의 체크 섬과 다르면 폐기함 근원지 주소 0xD3 E9 1C 70 211.233.28.112 목적지 주소 0xD2 62 BD 17 210.98.189.23
연습문제 45 00 00 4E BF 17 00 00 80 11 F8 85 A5 E5 9B 37 A5 E5 9B FF 버전 헤더길이 서비스유형 전체길이 식별자 플래그 / 단편옵셋 수명 프로토콜 체크섬 근원지 주소 목적지 주소 입력
연습문제 버전 헤더길이 서비스 유형 전체 길이 식별자 플래그 단편옵셋 수명 프로토콜 ※ 각 필드의 의미를 분석하시오. 버전 헤더길이 서비스 유형 전체 길이 식별자 플래그 단편옵셋 수명 프로토콜 체크 섬 근원지 주소 목적지 주소
Guru를 이용한 데이터그램 분석 연습
데이터그램 캡처 프로그램 작성 ※ 프로젝트 생성 및 라이브러리 경로 설정은 ch04. 이더넷(Ethernet)의 이더넷 캡처 프로그램 작성과 동일
대화상자 디자인 List Control 1 Group Box 2 Static Text 3 ~ 14 Edit Box 15~29 30 Static Text 31, 33 Edit Box 32, 34 Button 35~37
Control 속성 # 종류 ID 속성 변수이름 1 List Control IDC_LIST_PacketInfo View: Report m_ListIPPacketInfo 15 Edit Box IDC_EDIT_IP_Ver Read-only m_strIpVer 16 IDC_EDIT_IP_HLen m_strIpHLen 17 IDC_EDIT_IP_Tos m_strIpTos 18 IDC_EDIT_IP_ToLen m_strIpToLen 19 IDC_EDIT_IP_Iden m_strIpIden 20 IDC_EDIT_IP_DF_flag m_strIpFlagDF 21 IDC_EDIT_IP_MF_flag m_strIpFlagMF 22 IDC_EDIT_IP_RF_flag m_strIpFlagRF 23 IDC_EDIT_IP_FragOff m_strIpFragOff 24 IDC_EDIT_IP_Ttl m_strIpTtl
Control 속성 # 종류 ID 속성 변수이름 25 Edit Box IDC_EDIT_IP_Proto Read-only m_strIpProto 26 IDC_EDIT_IP_Checksum m_strIpChecksum 27 IDC_EDIT_IP_SrcAddr m_strIpSrcAddr 28 IDC_EDIT_IP_DestAddr m_strIpDestAddr 29 IDC_EDIT_IP_Opt m_strIpOpt 32 IDC_EDIT_CountInput m_iCountInput 34 IDC_EDIT_CountOutput m_iCountOutput 35 Button IDC_BUTTON_StartCapture . 36 IDCANCEL Default Button 37 IDC_BUTTON_INFORM
이벤트 처리 # 종류 ID 메시지 함수명 1 List Control IDC_LIST_PacketInfo NM_CLICK OnClickLIST() 35 Button IDC_BUTTON_StartCapture BN_CLICKED OnBUTTONStartCapture() 36 IDCANCEL OnCancel() 37 IDC_BUTTON_INFORM OnButtonInform()
어뎁터 오픈 대화상자 표시 void CIPViewerDlg::OnBUTTONSelectAdaptor() { //Ncap lib.(Dialog based class lib.) 객체 생성. CSelectAdaptorDlg *pDlg = new CSelectAdaptorDlg; if(pDlg->DoModal() != IDOK) delete pDlg; return; } …
어뎁터 열기 //선택된 네트워크 어뎁터를 사용할 수 있도록 초기화. if(pDlg->OpenAdaptor(1)) { ::AfxMessageBox("Adaptor open 실패"); pDlg->CloseAdaptor(); delete pDlg; return; }
패킷 캡처 #define MaxBufferLen 2048 UpdateData(TRUE); int i = 0; unsigned char arrTemp[MaxBufferLen]; for(i < m_iCountInput) { memset(arrTemp, 0, MaxBufferLen); //패킷을 하나 획득함. 음수가 return되면 에러가 발생한 것. int iLengthOfPacket = pDlg->Ncap(arrTemp, MaxBufferLen); if(iLengthOfPacket <0 ) continue; //패킷 분석 … }
패킷 분석 (1/7) // 패킷 분석시에 사용하는 이더넷 헤더 “C:\AMAN2002\include\ProtocolHeader.h” // 패킷 분석시에 사용하는 이더넷 헤더 // Ethernet Header (14 바이트) - IEEE Standard for Information technology struct t_EtherHeader { u_char eth_dst[6]; // Destination Address Field, 48bits u_char eth_src[6]; // Source Address Field, 48bits u_short eth_type; // Type Field, 16bits char eth_data[1]; // MAC Client Data };
패킷 분석 (2/7) struct t_IPHeader // IP header (최소 20 바이트) - RFC 791 { “C:\AMAN2002\include\ProtocolHeader.h” struct t_IPHeader // IP header (최소 20 바이트) - RFC 791 { u_char ip_hl:4, // Internet Header Length, 4bits ip_v:4; // Version, 4bits u_char ip_tos; // Type of Service, 8bits u_short ip_len; // Total Length, 16bits u_short ip_id; // Identification, 16bits u_short ip_off; // fragment offset #define IP_RF 0x8000 #define IP_DF 0x4000 #define IP_MF 0x2000 #define IP_OFFMASK 0x1fff u_char ip_ttl; // Time to Live, 8bits u_char ip_proto; // Protocol, 8bits u_short ip_sum; // Header Checksum, 16bits struct in_addr ip_src; // Source Address, 32bits struct in_addr ip_dst; // Destination Address, 32bits char ip_data[1]; // IP data };
패킷 분석 (3/7) … // 획득한 패킷의 시작 주소를 t_EtherHeader 구조체 주소로 대입 List Control 에 패킷 헤더 정보 표시 // 획득한 패킷의 시작 주소를 t_EtherHeader 구조체 주소로 대입 t_EtherHeader *tEtherHeader = (t_EtherHeader *)arrTemp; // IP 패킷의 시작 지점 정보를 t_IPHeader 구조체로 전달 t_IPHeader *tIPHeader = (t_IPHeader *) tEtherHeader->eth_data; m_tIPHeader[i]= *tIPHeader; // 일련번호 CString strNum = _T(""); strNum.Format(_T("%d"), i); m_ListIPPacketInfo.InsertItem(LVIF_TEXT, i, strNum, 0, 0, 0, 0 ); // 근원지 IP 주소 획득 CString strIpSrcAddr = _T(""); strIpSrcAddr.Format("%s", inet_ntoa(m_tIPHeader[i].ip_src)); m_ListIPPacketInfo.SetItem(i, 1, LVIF_TEXT, strIpSrcAddr, 0, 0, 0, 0); …
패킷 분석 (4/7) Edit Box에 10진수로 패킷 헤더 필드 표시 (List Control의 항목 클릭) void CIPViewerDlg::OnClickLIST(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW * pNmList = (NM_LISTVIEW *) pNMHDR; int nItem = pNmList->iItem; if(nItem <= -1) return; //버전 m_strIpVer.Format("%d", m_tIPHeader[nItem].ip_v); //헤더길이 m_strIpHLen.Format("%d", m_tIPHeader[nItem].ip_hl); //서비스 유형 m_strIpTos.Format("%d", m_tIPHeader[nItem].ip_tos); //전체길이 m_strIpToLen.Format("%d ", htons(m_tIPHeader[nItem].ip_len)); . . .
패킷 분석 (5/7) Edit Box에 10진수로 패킷 헤더 필드 표시 (List Control의 항목 클릭) //식별자 m_strIpIden.Format("%d ", htons(m_tIPHeader[nItem].ip_id)); //플래그 - RF iTemp = htons(m_tIPHeader[nItem].ip_off) & IP_RF; iTemp >>= 15; m_strIpFlagRF.Format("%d", iTemp); //플래그 - DF iTemp = htons(m_tIPHeader[nItem].ip_off) & IP_DF; iTemp >>= 14; m_strIpFlagDF.Format("%d", iTemp); //플래그 - MF iTemp = htons(m_tIPHeader[nItem].ip_off) & IP_MF; iTemp >>= 13; m_strIpFlagMF.Format("%d", iTemp); . . .
패킷 분석 (6/7) Edit Box에 10진수로 패킷 헤더 필드 표시 (List Control의 항목 클릭) //단편옵셋 unsigned short iFrag = htons(m_tIPHeader[nItem].ip_off) & IP_OFFMASK; m_strIpFragOff.Format("%d", iFrag); //수명 m_strIpTtl.Format("%d", m_tIPHeader[nItem].ip_ttl); //프로토콜 m_strIpProto.Format("%d", m_tIPHeader[nItem].ip_proto); //헤더체크섬 m_strIpChecksum.Format("%d ", htons(m_tIPHeader[nItem].ip_sum)); //근원지 주소 m_strIpSrcAddr.Format("%s", inet_ntoa(m_tIPHeader[nItem].ip_src)); //목적지 주소 m_strIpDestAddr.Format("%s",inet_ntoa(m_tIPHeader[nItem].ip_dst)); . . .
패킷 분석 (7/7) Edit Box에 10진수로 패킷 헤더 필드 표시 (List Control의 항목 클릭) //옵션 int iOptionLength = m_tIPHeader[nItem].ip_hl * 4 - 20; // 옵션 데이터가 있을 경우 if( iOptionLength > 0 ) { pTemp = (unsigned char *) &m_tIPHeader[nItem].ip_data; for( int i = 0; i<iOptionLength; i++ ) strTemp.Format("%d ", pTemp[i]); m_strIpOpt += strTemp; } UpdateData(FALSE); *pResult = 0;
어뎁터 닫기 //사용한 자원 해제. pDlg->CloseAdaptor(); //Ncap lib. 삭제. delete pDlg;
IPViewer 실행 화면 (1)
IPViewer 실행 화면 (2) click
IPViewer를 이용한 이더넷 프레임 분석 헤더길이 헤더길이는 20바이트 이므로 옵션을 사용하지 않음 서비스 유형 0으로 기본 서비스 유형임 전체 길이 데이터그램의 전체길이는 56 바이트임 식별자 단편의 ID는 47172임
IPViewer를 이용한 이더넷 프레임 분석 플래그 do not fragment비트가 0 이므로 단편화되었고, more fragment 비트가 0이므로 마지막 단편이거나 유일한 단편임 단편옵셋 0 이므로 첫번째 단편임 수명 128개의 라우터를 거친 뒤에 폐기됨 프로토콜 데이터에서 UDP 프로토콜을 캡슐화 함 체크 섬 송신지에서 계산한 체크 섬은 0 임 근원지 주소 데이터그램의 송신지 주소는 210.98.189.23 목적지 주소 데이터그램의 수신지 주소는 211.115.205.131
참고 문헌 서승호 외, AMAN2002를 이용한 TCP/IP 프로토콜 분석 및 네트워크 프로그래밍, 정익사, 2002. RFC 760, Jon Postel, DOD STANDARD INTERNET PROTOCOL, January 1980. RFC 791, Jon Postel, INTERNET PROTOCOL DARPA INTERNET PROGRAM PROTOCOL SPECIFICATION, September 1981. RFC 894, Charles Hornig, A Standard for the Transmission of IP Datagrams over Ethernet networks, April 1984. RFC 950, J. Mogul(Stanford), Internet Standard Subnetting Procedure, August 1985. RFC 1122, R.Braden, Requirements for Internet Hosts – Communication Layers, October 1989. RFC 1132, L. McLaughlin III, A Standard for Transmission of 802.2 Packet over IPX Networks, November 1989 Eric A. Hall, Internet Core Protocols, O’Reilly, 1999.