사랑한다1234 2013. 6. 25. 12:19

____리눅스 & 네트워크_________________________________________________________

 네트워크 이론

멀티캐스트[ multicast ]

인터넷에서 같은 내용의 데이터를 여러 명의 특정한 그룹의 수신자들에게 동시에 전송하는 방식을 말한다.

데이터 중복전송으로 인한 정보체증을 완화하며, 그룹 멤버십 정보를 관리할 수 있다.

(네트워크에서 멀티캐스트 어드레스 : FF FF FF FF  )

 

 

핑 [ping]

다른 호스트에 IP데이터그램 도달 여부를 조사하기 위한 프로그램.Ping은 TCP/IP 프로토콜을 사용하는 응용 프로그램으로

다른 호스트에 IP 데이터그램이 도착할 수 있는지를 검사하는 것을 의미한다. Ping을 수행하는 프로그램은

ICMP echo request라는 메시지를 원격 호스트로 보내 응답하는가를 기다린다. 즉 송신한 ICMP echo request를 받은 호스트가

동작 중이면 응답할 것이고 호스트가 동작하지 않으면 않을 것이기 때문이다. 이와 같이 ICMP echo reply가 돌아오는 지의 여부에

따라 원격 호스트가 동작 중인지 아닌 지를 검사할 수 있다.(응답하는 시간으로속도를 알수 있음)

※ Ping test   =>   ping 192.168.10.63 (ip주소)

 

 

☞ dummy hub 와 switch hub

 1) 더미허브와 스위칭허브의 차이점

 

더미 허브

스위칭 허브

기 능

- 컴퓨터간의 네트웍 연결
- 허브와 라우터 등 다른 네트웍 장비와 연결
- 단순한 신호분배 기능

- 들어오는 패킷을 연결된 각 PC에 다 보냄

- 관리기능 및 신호처리, 증폭기능 추가

- CSMA방식의 충돌을 없앤다.

- 들어오는 패킷을 해당 IP의 PC로만보내줌

장단점

- 가격이 싼 장점이 있으나 불안정하다.
- 문제해결이 어렵다.

- 안정적이고 속도가 빠르다.
- 문제해결이 쉽다.
- 고가이다

 


 

2) 스위칭 허브의 이해
 - LAN 전송속도를 향상시키기 위해 고유한 의미의 허브에 스위칭 개념을 도입한 네트웍 장비
 - 데이터 전송방식에 따른 분류

 

Cut Through

Store & forward

Adaptive

내용

입력이 들어오면 바로 출력하는 구조

입력 데이터를 버퍼에 저장후 전송하는 방식

두가지 방식혼용

장단점

속도는 빠르나 안정성 결여

속도는 느리나 안정적

속도와 안정성 양호

 

 

 

 

 pcap() 함수들...

 ☞ pcap_compile()     => 조건적으로 패킷을 건져 올림 (특정 IP의 패킷만 건져올릴수 있음)

 ☞ pcap_next()          => 패킷을 건져올리는 함수

  pcap_datalink        => LAN 변화를 알려줌

 ☞ pcap_dispatch       => 패킷 건져 올릴때 마다 call back(핸들러 호출)함 

 ☞ pcap_dump()        => 패킷 건져 올린것을 파일로 만듬

 

 

 

 

 Ethernet Header

 

 

 ☞ 패킷에서 Ethernet Header는 14바이트이며 Destination Address(6바이트) + Source Address(6바이트) + packet type(2바이트)로

     구성되어 있다.

 

 

 

 ※ Routing 알고리즘

 

☞ 상황에 따라(L2 최종목적지를 찾아가기 위해) L1 주소를 계속 바꿔가면서 이동한다. 

 

 

 

 

 pcap_next() 함수를 이용한 패킷 캡쳐

 

 

         ※ Ethernet network 표준 MAC 어드레스는 6바이트 임.

 

 

 

 

 

 

 

 pcap.c

#include <stdio.h>
#include "hexaview.h"
#include <net/ethernet.h>
#include <pcap/pcap.h> // /usr/include/pcap 안에 있음.
                                    // wow linux는 pcap 라이브러리 깔려있음.
                                    // pcap : packet capture library 


int main()
{

 

 char errbuf[PCAP_ERRBUF_SIZE]; // 에러메시지를 담는 버퍼, 크기  256바이트 
 char *cpNIC_Name; //NIC : Network Interface Card 


 unsigned char ucData[1500];// 건져 올린 패킷이 저장되는 배열


 pcap_t *stDes; //Des : description


 struct ether_header *stEth; // 이더넷헤더 저장용, ether_header 크기 14바이트 

   

  /*
    struct ether_header
 {
    u_int8_t  ether_dhost[ETH_ALEN];  // destination eth addr
    u_int8_t  ether_shost[ETH_ALEN];  // source ether addr  
    u_int16_t ether_type;                      // packet type ID field
 } __attribute__ ((__packed__));
   */


 
 struct pcap_pkthdr stInfo; // 패킷을 건져 올릴때 실제 정보가 저장되는 구조체 변수    
 

 cpNIC_Name = pcap_lookupdev(errbuf); // 현재 사용중인 랜카드(네트워크 장치)를 찾아줌
              // 에러시 Null 반환함

 

 
 if(0 == cpNIC_Name)//에러나면 에러메시지 출력하고 종료
 {
        printf("lookupdev Error : %s\n", errbuf);
        return 0;
 } 
 
 printf("NIC_Name : %s\n", cpNIC_Name); // 네트워크장치이름 출력   


 stDes = pcap_open_live(cpNIC_Name, 1500, 1, 0, errbuf);
   // pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)
   // 첫번째 인자는 장치이름, 두번째 인자  MTU(최대전송단위) : 1500 바이트로 설정
   // 세번째 인자는 0 : 나에게 전송되는 패킷만 받음, 1 : 모든 패킷을 건져올림
   // 네번째 인자는 open_live는 블로킹 함수 이므로 패킷을 건져올릴때 까지 대기하는 시간, 0:무한대기 
   // 에러시 Null 반환함 
 
 if(0 == stDes) //에러나면 에러메시지 출력하고 종료
 {
       printf("open_live Error : %s\n", errbuf);
       return 0;
 } 
 

  memcpy(ucData, pcap_next(stDes, &stInfo), sizeof(ucData)); // 메모리영역 복사 
 // void *memcpy(void *dest, const void *src, size_t n); //pcap_next()는 패킷을 건져올리는 함수 
 // 건져 올린 패킷을  ucData에 메모리 복사함 ucData의 크기 만큼(1500바이트) 
 
 
  stEth = (struct ether_header *) ucData; // ucData주소를 캐스팅하여 주소 넣어줌 
 
 
 printf("MAC Address : [%02X:%02X:%02X:%02X:%02X:%02X] -> ", stEth->ether_shost[0],
   stEth->ether_shost[1], stEth->ether_shost[2], stEth->ether_shost[3],
   stEth->ether_shost[4], stEth->ether_shost[5]);
 // 건져올린 패킷에서  Destination address 다음의 6바이트 출력, Source address(자신의 MAC address)


 printf("[%02X:%02X:%02X:%02X:%02X:%02X]\n", stEth->ether_dhost[0],
   stEth->ether_dhost[1], stEth->ether_dhost[2], stEth->ether_dhost[3],
   stEth->ether_dhost[4], stEth->ether_dhost[5]);
 // 건져올린 패킷에서 처음 6바이트만 출력, Destination address

 
  

 /* // Ethernet protocol ID's
 #define ETHERTYPE_PUP        0x0200     // Xerox PUP
 #define ETHERTYPE_IP           0x0800     // IP 
 #define ETHERTYPE_ARP        0x0806     // Address resolution
 #define ETHERTYPE_REVARP  0x8035     // Reverse ARP
 */

 

 
 printf("Packet Type : ");
 
 switch( ntohs(stEth->ether_type))
 {

  case ETH_P_LOOP:

   printf("Ethernet Loopback packet\n");     
   break;
  
  case ETH_P_PUP:

   printf("Xerox PUP packet\n");     
   break;

  case ETH_P_PUPAT:
    
   printf("Xerox PUP Addr Trans packet\n");     
   break;

  case ETH_P_IP:
   
   printf("Internet Protocol packet\n");     
   break;

  case ETH_P_X25:

   printf("CCITT X.25\n");     
   break;
  
  case ETH_P_ARP:

   printf("Address Resolution packet\n");     
   break;

  case ETH_P_BPQ:
    
   printf("G8BPQ AX.25 Ethernet Packet\n");     
   break;

  case ETH_P_IEEEPUP:
   
   printf("Xerox IEEE802.3 PUP packet\n");     
   break;
   
  case ETH_P_IEEEPUPAT:

   printf("Xerox IEEE802.3 PUP Addr Trans packet \n");     
   break;
  
  case ETH_P_DEC:

   printf("DEC Assigned proto\n");     
   break;

  case ETH_P_DNA_DL:
    
   printf("DEC DNA Dump/Load\n");     
   break;

  case ETH_P_DNA_RC:
   
   printf("DEC DNA Remote Console\n");     
   break; 

  case ETH_P_DNA_RT:

   printf("DEC DNA Routing\n");     
   break;
  
  case ETH_P_LAT:

   printf("DEC LAT \n");     
   break;

  case ETH_P_DIAG:
    
   printf("DEC Diagnostics\n");     
   break;

  case ETH_P_CUST:
   
   printf("DEC Customer use\n");     
   break;
  
  case ETH_P_SCA:
   
   printf(" DEC Systems Comms Arch\n");     
   break;

  case ETH_P_RARP:
   
   printf("Reverse Addr Res packet\n");     
   break;

  case ETH_P_ATALK:
   
   printf("Appletalk DDP\n");     
   break;

  case ETH_P_AARP:
   
   printf("Appletalk AARP\n");     
   break;

  case ETH_P_IPX:
   
   printf("IPX over DIX\n");     
   break;


  case ETH_P_IPV6:
   
   printf("IPX over DIX\n");     
   break;

  case ETH_P_PPP_DISC:
   
   printf("PPPoE discovery messages\n");     
   break;

  case ETH_P_PPP_SES:
   
   printf("PPPoE session messages\n");     
   break;

  case ETH_P_ATMMPOA:
   
   printf("MultiProtocol Over ATM\n");     
   break;
   
  case ETH_P_ATMFATE:
   
   printf("Frame-based ATM Transport\n");     
   break;


  default :
   printf("Unknown : %04X\n", ntohs(stEth->ether_type));


 }  

 
 
 hexaview(ucData, 64); // ucData의 값들을 헥사뷰로 출력 
 
 pcap_close(stDes); //pcap 닫음 
  
 return 0;


}

 

void hexaview(unsigned char *ucP, unsigned int iSize)

{

 int iCnt;
 int iLoop;
 
 
 printf("------------------------------------"
    "-------------------------------------\n");
 printf("Address                       Hexa"
    "                            ASCII \n");
 printf("         ");

 for(iCnt = 0; iCnt < 16; ++iCnt )
 {
        printf("%02X ", iCnt);
 }
 putchar('\n');
 
 printf("------------------------------------"
    "-------------------------------------\n");
  
 if( 0 == iSize%16 )
 {
        iSize = iSize/16;
 }
 else
 {
        iSize = (iSize/16)+1;
 }
 
 for( iLoop = 0 ;iLoop < iSize; ++iLoop)
 {

  printf("%08X ", ucP);
    
  for(iCnt = 0; iCnt < 16; ++iCnt )
  {
        printf("%02X ", *(ucP+iCnt));
  }

  for(iCnt = 0; iCnt < 16; ++iCnt )
  {
        if(0 == *(ucP+iCnt))
       {
           printf(".");
       }
       else if(32 > *(ucP+iCnt))
       {
            printf(".");
       }
       else if(127 < *(ucP+iCnt))
       {
            printf(".");
       }
       else
       { 
           printf("%c", *(ucP+iCnt));
       }
 }

       putchar('\n');
       ucP = (ucP + 16);

 }

}

 

 

 

VI Tip 

 ☞ 매크로 만들기 : q + 매크로이름  -> 원하는 동작 -> q

 ☞ 매크로 수행 : @매크로이름

 

 

.vimrc 파일에

 

nmap <하고싶은key> gg=G''     을 추가해 놓으면 해당 key를 누를때 마다

 

자동으로 들여쓰기 정렬 된다.

 

 

__________________________________________________________________________________________________

 

 

 

______실습파일 & 수업자료___________

 

pcap

 

pcap.c

_________________________________