My Own Style

반응형
  1. Ethernet switch

    1. 이더넷 네트워크(근거리 네트워크 (LAN)) 에서 여러 대의 컴퓨터, 네트워크 장비를 연결하는 장치

    2. 전이중 통식 방식이 가능하기 때문에 네트워크 속도가 향상됨 (src mac addr / dst mac addr 을 이용)
      Ethernet hub 의 경우, broad casting 을 통해 데이터를 전송하므로 병목이 자주 발생하는데 이를 방지

    3. 따라서 스위치는 각 장비들의 고유한 mac address 를 기억해야하며, 이 주소를 통해 어떤 데이터가 어디로 전송되어야 하는지 판단이 가능해야함

    4. 규모가 클 경우, 스위치의 데이터 흐름 처리 용량에 따라 문제가 발생할 수 있으므로 VLAN 스위치나 라우터 등을 이용하여 네트워크 분리는 필요함

    5. 사무실에서 보편적으로 찾아볼 수있는 D-link / Netgear 스위치 등이 해당 기능을 포함함.

  2. Ethernet frame

    1. OSI 7 계층 중, 2 계층(데이터 링크 계층) 에 속하는 데이터 컨테이너

    2. 해당 계층의 대표적인 서비스인 ethernet 에서 사용하는 데이터 컨테이너 방식

    3. 고전적인 CSMA/CD 방식을 사용한 통신방식의 데이터 컨테이너

    4. 구조 

      1. 이더넷 프레임 스펙

    5. 내용

      1. UDP 의 frame 과 비슷하지만 차이가 있음 

        1. UDP header에 src port 와 dest port 를 넣어주는 부분이 있다면 Ethernet frame header에는 mac 주소를 사용하는 것이 차이가 있음 
        2. 자신의 device mac 을 직접 src.MAC 에, dest.MAC 에는 target 장비의 mac을 입력해줘야함, broad casting 을 할 경우에는 dest.MAC 에 ff:ff:ff:ff:ff:ff 를 넣어줌

      2. 예제 코드 확인
      1. //Example Code 
        //Example 1.4. Create a RAW ethernet socket
        #include <sys/socket.h>
        #include <linux/if_packet.h>
        #include <linux/if_ether.h>
        #include <linux/if_arp.h>
         
        ...
         
        int s; /*socketdescriptor*/
         
        s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
        if (s == -1) { errorhandling ... }
         
        /*Example 1.5. Send a RAW ethernet frame*/
        #define ETH_FRAME_LEN 1518
         
        ...
         
        /*target address*/
        struct sockaddr_ll socket_address;
         
        /*buffer for ethernet frame*/
        void* buffer = (void*)malloc(ETH_FRAME_LEN);
          
        /*pointer to ethenet header*/
        unsigned char* etherhead = buffer;
             
        /*userdata in ethernet frame*/
        unsigned char* data = buffer + 14;
             
        /*another pointer to ethernet header*/
        struct ethhdr *eh = (struct ethhdr *)etherhead;
          
        int send_result = 0;
         
        /*our MAC address*/
        unsigned char src_mac[6] = {0x00, 0x01, 0x02, 0xFA, 0x70, 0xAA};
         
        /*other host MAC address*/
        unsigned char dest_mac[6] = {0x00, 0x04, 0x75, 0xC8, 0x28, 0xE5};
         
        /*prepare sockaddr_ll*/
         
        /*RAW communication*/
        socket_address.sll_family   = PF_PACKET;   
        /*we don't use a protocoll above ethernet layer
          ->just use anything here*/
        socket_address.sll_protocol = htons(ETH_P_IP); 
         
        /*index of the network device
        see full code later how to retrieve it*/
        socket_address.sll_ifindex  = 2;
         
        /*ARP hardware identifier is ethernet*/
        socket_address.sll_hatype   = ARPHRD_ETHER;
             
        /*target is another host*/
        socket_address.sll_pkttype  = PACKET_OTHERHOST;
         
        /*address length*/
        socket_address.sll_halen    = ETH_ALEN;    
        /*MAC - begin*/
        socket_address.sll_addr[0]  = 0x00;    
        socket_address.sll_addr[1]  = 0x04;    
        socket_address.sll_addr[2]  = 0x75;
        socket_address.sll_addr[3]  = 0xC8;
        socket_address.sll_addr[4]  = 0x28;
        socket_address.sll_addr[5]  = 0xE5;
        /*MAC - end*/
        socket_address.sll_addr[6]  = 0x00;/*not used*/
        socket_address.sll_addr[7]  = 0x00;/*not used*/
         
         
        /*set the frame header*/
        memcpy((void*)buffer, (void*)dest_mac, ETH_ALEN);
        memcpy((void*)(buffer+ETH_ALEN), (void*)src_mac, ETH_ALEN);
        eh->h_proto = 0x00;
        /*fill the frame with some data*/
        for (j = 0; j < 1500; j++) {
            data[j] = (unsigned char)((int) (255.0*rand()/(RAND_MAX+1.0)));
        }
         
        /*send the packet*/
        send_result = sendto(s, buffer, ETH_FRAME_LEN, 0,
                  (struct sockaddr*)&socket_address, sizeof(socket_address));
        if (send_result == -1) { errorhandling... }
         
        /*Example 1.6. Receive a RAW ethernet frame*/
        void* buffer = (void*)malloc(ETH_FRAME_LEN); /*Buffer for ethernet frame*/
        int length = 0; /*length of the received frame*/
        ...
        length = recvfrom(s, buffer, ETH_FRAME_LEN, 0, NULL, NULL);
        if (length == -1) { errorhandling .... }
        
        C-like



반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band