newind2000
2015. 5. 22. 17:36
================================ Outline ====================================
프로토콜 계층구조
----------------------------------------------------------------------------
** 못 알아듣더라도 일단 필기하자. 후에 흰 종이 위에 검은 글자가 보은하리라.
<프로토콜 계층구조>
계층구조의 2층인 ip를 살펴보자!
//리눅스 명령어 "grep"은 지정한 파일에서 특정 단어를 찾아준다.
ex) grep "hi" * //모든 파일에서 hi라는 문자열을 찾아줘!

ip 구조체가 있는 헤더 파일로 들어가 안의 내용을 살펴보자.

//비트 필드 구조체(:#) 최소단위를 비트로 쪼개어 메모리를 할당한다.
/*** Little Endian & Big Endian ***/
little endian은 시작 주소가 하위 바이트부터 기록되는 것
IPv4에서 IPv6으로 넘어가는 추세이다. 과거 인구에 대한 1개를 ip를 할당을 생각하여 4byte ip를 생각하였지만 인구의 증가와 1인이 1개 이상의 ip를 쓰기 때문에 iPv4 체제에서는 부족현상이 일어나고 있기 때문이다. IPv4의 곱절에 곱절인 IPv6를 사용하면 IP부족 문제를 해결할 수 있다.


Total Length: IP header는 일반적으로는 5줄이지만 option이 추가되면 6줄이 된다.
Identification: 패킷의 고유 아이디. 동일 컴퓨터로도 인터넷을 하나 이상 사용할 수 있는 것을 이 고유 ID가 서로 다르기 때문이다.
Fragment Offset: 나누어진 패킷의 위치
Time To Live: 라우터를 통과할 때마다 감소하는 숫자. 이것을 활용하여 경로추적기를 만들 수 있다. //일반적으로 64가 입력되어 있다.
Protocol: 3층에 있는 protocol의 type을 알 수 있다. //TCP or UDP
Header Checksum: 가장 처음부터 8bit까지의 데이터를 확인하여 변경 유무를 판단한다. 데이터가 다르면 폐기한다.
Source Address: 데이터를 보낸 곳의 IP
Destination Address: 데이터를 받는 곳의 IP
금일까지 짠 코드의 출력 내용

/*** 소스 ***/
#include <stdio.h> #include <pcap/pcap.h> #include <net/ethernet.h> #include <arpa/inet.h> #include <netinet/ip.h>
void printIP(const void *vp); void printEther(const void *vp); void hexaview(const void *vp, unsigned int uilen);
int main(void) { char *cpNICNAME; char caErrmsg[PCAP_ERRBUF_SIZE]; pcap_t *stpDS; const unsigned char *ucpData; struct pcap_pkthdr stInfo;
cpNICNAME = pcap_lookupdev(caErrmsg); if( 0 == cpNICNAME ) { printf("caErrmsg : [%s] \n", caErrmsg); return 100; } printf("cpNICNAME : [%s] \n", cpNICNAME);
stpDS = pcap_open_live( cpNICNAME , 1500 , 1 , 0 , caErrmsg ); ucpData = pcap_next(stpDS, &stInfo); printf("Packet Length: %d\n",stInfo.len);
printEther(ucpData);
if( ETH_P_IP == ntohs( *((short *)(ucpData + 12) ) ) ) { printIP(ucpData + sizeof(struct ether_header)); }
hexaview(ucpData, 400);
pcap_close(stpDS); return 0; }
void printIP(const void *vp) { const struct ip *v = vp; printf("IP version : %d \n", v->ip_v); printf("Header Length : %d byte \n", v->ip_hl * 4); printf("Type of Service : 0x%02X \n", v->ip_tos); printf("Total Length : %d byte \n", ntohs(v->ip_len));
printf("Src IP : %s \n", inet_ntoa(v->ip_src)); printf("Dst IP : %s \n", inet_ntoa(v->ip_dst)); }
void printEther(const void *vp) { int iCnt;
printf("Dest MAC : "); for(iCnt = 0; iCnt < ETH_ALEN; iCnt++) { printf("%02X", ((struct ether_header *)vp)->ether_dhost[iCnt]); printf(":"); } printf("\b \n");
printf("Src MAC : "); for(iCnt = 0; iCnt < ETH_ALEN; iCnt++) { printf("%02X", ((struct ether_header *)vp)->ether_shost[iCnt]); printf(":"); } printf("\b \n");
printf("Next Layer : ");
switch( ntohs( ((struct ether_header *)vp)->ether_type )) { case ETH_P_LOOP : printf("Ethernet Loopback packet"); break; case ETH_P_PUP : printf("Xerox PUP packet"); break; case ETH_P_PUPAT : printf("Xerox PUP Addr Trans packet"); break; case ETH_P_IP : printf("Internet Protocol packet"); break; case ETH_P_X25 : printf("CCITT X.25"); break; case ETH_P_ARP : printf("Address Resolution packet"); break; case ETH_P_BPQ : printf("G8BPQ AX.25 Ethernet Packet [ NOT AN OFFICIALLY REGISTERED ID ]"); break; case ETH_P_IEEEPUP : printf("Xerox IEEE802.3 PUP packet"); break; case ETH_P_IEEEPUPAT : printf("Xerox IEEE802.3 PUP Addr Trans packet"); break; case ETH_P_DEC : printf("DEC Assigned proto"); break; case ETH_P_DNA_DL : printf("DEC DNA Dum"); break; case ETH_P_DNA_RC : printf("DEC DNA Remote Console"); break; case ETH_P_DNA_RT : printf("DEC DNA Routing"); break; case ETH_P_LAT : printf("DEC LAT"); break; case ETH_P_DIAG : printf("DEC Diagnostics"); break; case ETH_P_CUST : printf("DEC Customer use"); break; case ETH_P_SCA : printf("DEC Systems Comms Arch"); break; case ETH_P_TEB : printf("Trans Ether Bridging"); break; case ETH_P_RARP : printf("Reverse Addr Res packet"); break; case ETH_P_ATALK : printf("Appletalk DDP"); break; case ETH_P_AARP : printf("Appletalk AARP"); break; case ETH_P_8021Q : printf("802.1Q VLAN Extended Header"); break; case ETH_P_IPX : printf("IPX over DIX"); break; case ETH_P_IPV6 : printf("IPv6 over bluebook"); break; case ETH_P_PAUSE : printf("IEEE Pause frames. See 802.3 31B"); break; case ETH_P_SLOW : printf("Slow Protocol. See 802.3ad 43B"); break; case ETH_P_WCCP : printf("Web-cache coordination protocol defined in draft-wilson-wrec-wccp-v2-00.txt"); break; case ETH_P_PPP_DISC : printf("PPPoE discovery messages"); break; case ETH_P_PPP_SES : printf("PPPoE session messages"); break; case ETH_P_MPLS_UC : printf("MPLS Unicast traffic"); break; case ETH_P_MPLS_MC : printf("MPLS Multicast traffic"); break; case ETH_P_ATMMPOA : printf("MultiProtocol Over ATM"); break; case ETH_P_LINK_CTL : printf("HPNA, wlan link local tunnel"); break; case ETH_P_ATMFATE : printf("Frame-based ATM Transport over Ethernet"); break; case ETH_P_PAE : printf("Port Access Entity (IEEE 802.1X)"); break; case ETH_P_AOE : printf("ATA over Ethernet"); break; case ETH_P_8021AD : printf("802.1ad Service VLAN"); break; case ETH_P_TIPC : printf("TIPC"); break; case ETH_P_8021AH : printf("802.1ah Backbone Service Tag"); break; case ETH_P_1588 : printf("IEEE 1588 Timesync"); break; case ETH_P_FCOE : printf("Fibre Channel over Ethernet"); break; case ETH_P_TDLS : printf("TDLS"); break; case ETH_P_FIP : printf("FCoE Initialization Protocol"); break; case ETH_P_QINQ1 : printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]"); break; case ETH_P_QINQ2 : printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]"); break; case ETH_P_QINQ3 : printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]"); break; case ETH_P_EDSA : printf("Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ]"); break; case ETH_P_AF_IUCV : printf("IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ]"); break; case ETH_P_802_3 : printf("Dummy type for 802.3 frames"); break; case ETH_P_AX25 : printf("Dummy protocol id for AX.25"); break; case ETH_P_ALL : printf("Every packet (be careful!!!)"); break; case ETH_P_802_2 : printf("802.2 frames"); break; case ETH_P_SNAP : printf("Internal only"); break; case ETH_P_DDCMP : printf("DEC DDCMP: Internal only"); break; case ETH_P_WAN_PPP : printf("Dummy type for WAN PPP frames"); break; case ETH_P_PPP_MP : printf("Dummy type for PPP MP frames"); break; case ETH_P_LOCALTALK : printf("Localtalk pseudo type"); break; case ETH_P_CAN : printf("Controller Area Network"); break; case ETH_P_PPPTALK : printf("Dummy type for Atalk over PPP"); break; case ETH_P_TR_802_2 : printf("802.2 frames"); break; case ETH_P_MOBITEX : printf("Mobitex (kaz@cafe.net)"); break; case ETH_P_CONTROL : printf("Card specific control frames"); break; case ETH_P_IRDA : printf("Linux-IrDA"); break; case ETH_P_ECONET : printf("Acorn Econet"); break; case ETH_P_HDLC : printf("HDLC frames"); break; case ETH_P_ARCNET : printf("1A for ArcNet :-)"); break; case ETH_P_DSA : printf("Distributed Switch Arch."); break; case ETH_P_TRAILER : printf("Trailer switch tagging"); break; case ETH_P_PHONET : printf("Nokia Phonet frames"); break; case ETH_P_IEEE802154 : printf("IEEE802.15.4 frame"); break; case ETH_P_CAIF : printf("ST-Ericsson CAIF protocol"); break; } putchar('\n');
}
void hexaview(const void *vp, unsigned int uilen) { unsigned int uiCnt; unsigned int uiLine;
printf("==============================================================================\n"); printf(" Address Hexa ASCII\n"); printf("------------------------------------------------------------------------------\n");
for (uiLine = 0; uiLine < uilen; uiLine = uiLine + 16) {
printf(" %08X ", uiLine);//vp);
for (uiCnt = 0; uiCnt < 16; ++uiCnt) { printf("%02X ", *((unsigned char *)vp)); vp = (char *)vp + 1; if (uiCnt == 7) putchar(' '); } vp = (char *)vp - 16;
putchar(' '); for (uiCnt = 0; uiCnt < 16; ++uiCnt) { if (32 > *((unsigned char *)vp)) { putchar('.'); } else if (127 < *((unsigned char *)vp)) { putchar('.'); } else { printf("%c", *((unsigned char *)vp)); }
vp = (char *)vp + 1; }
putchar('\n'); }
return; }
|