NETINTRO(4)

명칭
networking - 네트워크 기구의 소개

서식
#include <sys/types.h> #include <sys/time.h> #include <sys/socket.h> #include <net/if.h> #include <net/route.h>

설명
이 섹션에서는, 본시스템으로 이용 가능한 네트워크 기구에 대해 의 일반적인 소개를 실시하고 있습니다. 섹션 4 의 이 부분의 문서는 3 개의 area로 나누어집니다. 프로토콜 패밀리 (도메인), 프로토콜, 그리고 네트워크 인터페이스 입니다.

네트워크 프로토콜은, 모두 특정의 프로토콜 패밀리 (와)과 관련 지을 수 있고 있습니다. 프로토콜 패밀리는, 프로토콜이 특정의 네트워크 환경하에서 기능할 수 있도록(듯이) 하기 위한(해), 프로토콜의 실장에 대해서의 기본적인 서비스를 제공합니다. 이러한 서비스는 패킷의 분할 및 통합, 루팅, 애드레싱, 그리고 기본적인 전송 등도 포함되겠지요. 현재의 프로토콜의 실장에서는 서포트되고 있지 않습니다 하지만, 프로토콜 패밀리는, 복수의 애드레싱 방법을 제공 할지도 모릅니다. 프로토콜 패밀리에게는, 통상 각 socket(2) 타입에 1 개씩과 같이, 다수의 프로토콜이 포함되어 있습니다. 프로토콜 패밀리는, 모든 소켓 타입을 서포트할 필요는 없습니다. 프로토콜 패밀리에게는, 동일한 소켓트아브스트라크션을 서포트 하기 위해서, 복수의 프로토콜이 포함되는 일이 있습니다.

프로토콜은, socket(2) 그리고 자세하게 결정할 수 있던 소켓트아브스트라크션의 1 개를 서포트합니다. 특정의 프로토콜에는, 적절한 프로토콜 패밀리와 타입의 소켓을 작성하는지, 소켓을 작성할 때에 명시적으로 그 프로토콜을 요구 하는 것에 의해 액세스 할 수가 있습니다. 프로토콜은, 통상 1 종류의 주소 포맷만을 받습니다. 통상, 그 주소 포맷은, 프로토콜 패밀리와 네트워크 아키텍쳐의 디자인에 필요한 애드레싱 구조체를 이용해 정의되고 있습니다. 어느 기본적인 소켓트아브스트라크션의 시멘틱스는, 프로토콜에 특유의 것입니다. 프로토콜은 모두 각각 특유의 소켓 타입에 대한 기본 모델 (을)를 서포트하게 되어 있습니다. 그러나, 게다가 그 메카니즘에 대해서, 표준적이 아닌 기구나 확장 기능을 제공하는 일도 있습니다. 예를 들면, SOCK_STREAM (을)를 서포트하는 프로토콜이, 각 대역외 (out-of-band) 메세지에 대해 1 바이트 이상의 대역외 메세지를 송신할 수가 있습니다.

네트워크 인터페이스는, 디바이스 인터페이스와 닮아 있습니다. 네트워크 인터페이스는, 네트워크 하부조직의 최하정도층 (을)를 구성합니다. 이것은, 실제의 송신용 하드웨어와 서로 영향을 줍니다. 네트워크 인터페이스는, 1 개(살) 이상의 프로토콜 패밀리나 주소 포맷을 서포트 가능합니다. 각 네트워크 인터페이스의 엔트리의 서식 (SYNOPSIS)의 섹션 에는, config(8) 프로그램에 시스템의 상세를 제공할 때에 사용되는, 관련 드라이버의 사양의 예가 있습니다. 진단 (DIAGNOSTICS)의 섹션의 메세지 일람은, 디바이스를 조작중에 일어나는 에러에 기인해, 콘솔이나 시스템 우류 로그 /var/log/messages ( syslogd(8) (을)를 참조) 안에 출력되는 것입니다.

프로토콜
본시스템에서는, 현재, 인터넷 프로토콜, Xerox Network Systems(tm) 프로토콜, 그리고 ISO OSI 프로토콜의 몇개인가가 서포트되고 있습니다. 소켓의 raw 인터페이스가 인터넷의 IP 프로토콜층, Xerox NS 의 IDP 프로토콜에 대해서 제공되고 있습니다. 각 프로토콜 패밀리의 서포트에 관한 새로운 정보가 필요한 경우는, 꾸짖어야 할 메뉴얼 페이지를 조사해 보세요.

애드레싱
각 프로토콜 패밀리와 관련지을 수 있고 있는 것이, 주소 포맷입니다. 네트워크 주소는, 모두 이하에 나타내는 sockaddr 로 불리는 일반적인 구조체와 결합되고 있습니다. 그러나, 각 프로토콜은, 보다 세련된 특유의 구조체를 사용하도록(듯이) 강제하고 있습니다. 일반적으로는, 변수명을 바꾼다고 한 것 입니다. 이것에 대해서는, 위에서 말한 프로토콜 패밀리의 메뉴얼 페이지로 논의되고 있습니다.

        struct sockaddr {
            u_char  sa_len;
            u_char  sa_family;
            char    sa_data[14];
    };

sa_len 필드에는, 이 구조체 전체의 길이가 들어갑니다. 이 길이는 16 바이트를 넘을지도 모릅니다. 다음에 나타낸다 sa_family 용무의 주소치는, 시스템측에서 기존인 물건입니다 (장래 실장될지도 모르는 포맷도 더해, 여기서 정의하고 있습니다).

    #define    AF_UNIX      1    /* 로컬 호스트 (파이프, 포트) */
    #define    AF_INET      2    /* 인터넷: UDP, TCP 등 */
    #define    AF_NS        6    /* Xerox NS 프로토콜 */
    #define    AF_CCITT     10   /* CCITT 프로토콜, X. 25 등 */
    #define    AF_HYLINK    15   /* NSC 하이퍼 채널 */
    #define    AF_ISO       18   /* ISO 프로토콜 */

루팅
UNIX 그럼, 패킷의 루팅 기구가 몇개인가 제공되고 있습니다. 커널은, 루팅 정보 데이타베이스를 관리하고 있습니다. 이 데이타베이스는, 패킷을 전송 할 경우에 적절한 네트워크 인터페이스 (을)를 선택할 때에 사용됩니다.

유저 프로세스 (혹은, 복수의 서로 서로 협조한 프로세스)는, 특별한 종류의 소켓을 통해 메세지를 보내는 것으로, 이 데이타베이스를 관리하고 있습니다. 이 방법이, 이전의 릴리스로 사용되고 있던 고정장의 ioctl(2) 에 취해 대신했습니다.

이 기구에 대해서는, route(4) 에 설명이 있습니다.

인터페이스
시스템내의 각 네트워크 인터페이스는, 메세지의 송수신에 사용되는 패스에 대응하고 있습니다. 네트워크 인터페이스는, 통상, 관련이 있는 하드웨어 디바이스를 가지고 있습니다. 그러나, lo(4) (와)과 같은 루프백 인터페이스는 하드웨어 디바이스를 가지고 있지 않습니다.

다음의 ioctl(2) 콜은, 네트워크 인터페이스를 조작하는데 사용됩니다. ioctl() 함수는, 소망한 도메인의 소켓 (특히 SOCK_DGRAM 형) 위에서 실행합니다. 이전의 릴리스로 서포트되고 있던 리퀘스트의 상당수는, 파라미터에 ifreq 구조몸을 잡고 있었습니다. 이 구조체는, 다음의 형식입니다

    struct  ifreq {
    #define    IFNAMSIZ    16
        char    ifr_name[IFNAMSIZ];        /* if 명이며, 예를 들면 "en0" */
        union {
            struct    sockaddr ifru_addr;
            struct    sockaddr ifru_dstaddr;
            struct    sockaddr ifru_broadaddr;
            short     ifru_flags;
            int       ifru_metric;
            int       ifru_mtu;
            int       ifru_phys;
            caddr_t   ifru_data;
        } ifr_ifru;
    #define ifr_addr      ifr_ifru.ifru_addr    /* 주소 */
    #define ifr_dstaddr   ifr_ifru.ifru_dstaddr /* p-to-p 링크의 이제(벌써) 한편의 종단 */
    #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* 브로드캐스트 어드레스*/
    #define ifr_flags     ifr_ifru.ifru_flags   /* 플래그 */
    #define ifr_metric    ifr_ifru.ifru_metric  /* 시학 */
    #define ifr_mtu       ifr_ifru.ifru_mtu     /* mtu */
    #define ifr_phys      ifr_ifru.ifru_phys    /* 물리적인 선 */
    #define ifr_data      ifr_ifru.ifru_data    /* 인터페이스가 사용 */
    };

현재는비추천의 시스템 콜은 다음과 같습니다.

SIOCSIFADDR
    프로토콜 패밀리용의 인터페이스 주소를 설정합니다. 주소의 할당에 이어, 인터페이스용의 ``초기화''routine가 불립니다.

SIOCSIFDSTADDR
    프로토콜 패밀리 및 인터페이스용의, point to point 주소를 설정합니다.

SIOCSIFBRDADDR
    프로토콜 패밀리 및 인터페이스용의, 브로드캐스트 어드레스를 설정합니다.

주소를 취득하기 위한 ioctl() 리퀘스트와 주소 이외의 데이터를 설정하거나 검색하거나하기 위한 리퀘스트에 대해서는, 지금도 완전하게 서포트하고 있어, ifreq 구조체를 사용하고 있습니다.

SIOCGIFADDR
    프로토콜 패밀리용의, 인터페이스 주소를 취득합니다.

SIOCGIFDSTADDR
    프로토콜 패밀리 및 인터페이스용의, point to point 주소를 취득합니다.

SIOCGIFBRDADDR
    프로토콜 패밀리 및 인터페이스용의, 브로드캐스트 어드레스를 취득합니다.

SIOCSIFFLAGS
    인터페이스 플래그의 필드를 세트 합니다. 만약, 인터페이스가 동작 하고 있지 않다고 하는 표 (down)가 붙여지면(자), 현재 그 인터페이스를 통해 패킷을 루팅 하고 있는 모든 프로세스는 통지를 받습니다. 인터페이스에 따라서는, 새롭게 들어 오는 패킷을 이제 받지 않게 하기 위해서 리셋트 하는 것이 있습니다. 다시 동작하고 있다고 하는 표 (up) 하지만 붙여지면(자), 인터페이스는 재초기화됩니다.

SIOCGIFFLAGS
    인터페이스 플래그를 취득합니다.

SIOCSIFMETRIC
    인터페이스의 routing metric를 설정합니다. 이 시학은, 유저 레벨의 라우터만으로 사용됩니다.

SIOCGIFMETRIC
    인터페이스 시학을 취득합니다.

새로운 구조체를 사용하는 리퀘스트는 2 개 있습니다.

SIOCAIFADDR
    프로토콜에 따라서는, 단일의 인터페이스에 대해서 복수의 주소를 관련지을 수 있는 것이 있습니다. 이 리퀘스트는, 새로운 주소를 추가한다 수단을 제공합니다 (혹은, 주소 패밀리용의 디폴트 주소가 지정되어 있으면, 프라이머리 주소의 특징을 변경합니다). 종점 주소, 브로드캐스트 어드레스 혹은 네트워크 마스크를 설정하기 위해서 다른 시스템 콜을 만드는 것이 아니라 (현재는, 복수의 프로토콜로 필요 불가결한 특징입니다), 이러한 3 개의 것을 동시에 지정하기 위해서 다른 구조체를 이용합니다 (아래와 같이 참조). 각 패밀리 전용에, 이 구조체를 조금 수정한 버젼을 사용하는 일도 있겠지요 ( 각 sockaddr 구조체를 패밀리 특유의 것에 바꾸는 등). sockaddr 구조체 자신이 디폴트의 크기보다 큰 경우에는, ioctl() 로 말한 것처럼, ioctl() 식별자 자체를 전체가 들어가도록(듯이) 변경할 필요가 있습니다.

SIOCDIFADDR
    이 리퀘스트는, 인터페이스에 관련지을 수 있었던 리스트로부터, 지정한 주소를 삭제합니다. 이 리퀘스트는 if_aliasreq 구조체도 사용하는 것으로써, 복수의 네트워크 마스크나 종점 주소를 프로토콜이 허가하는 일도 가능하게 합니다. 또, 디폴트 주소를 지정하는 것은, 이 주소 패밀리에 속하는 것의 집에서, 이 소켓을 최초로 열었을 때의 최초의 인터페이스 주소를 삭제하는 것을 의미한다고 하는 약속한 일의 형태를, 이 리퀘스트는 채용하고 있습니다.

SIOCGIFCONF
    인터페이스의 설정 리스트를 취득합니다. 이 리퀘스트는 값과 결과의 양용의 파라미터 (value-result parameter)로서 ifconf 구조몸을 잡습니다 (아래와 같이 참조). ifc_len 필드에는, 최초로, ifc_buf 그리고 지시해진 버퍼의 크기를 세트 해 두지 않으면 안됩니다. 돌아올 때, 이 필드에는 설정 리스트의 바이트 단위의 크기가 들어갑니다.

    /*
    * SIOCAIFCONF 로 사용되는 구조체
    */
    struct ifaliasreq {
            char    ifra_name[IFNAMSIZ];   /* if 명이며, 예를 들면 "en0" */
            struct  sockaddr        ifra_addr;
            struct  sockaddr        ifra_broadaddr;
            struct  sockaddr        ifra_mask;
    };

    /*
    * SIOCGIFCONF 리퀘스트로 사용되는 구조체.
    * 머신의 인터페이스의 설정을 검색하는데 사용됩니다
    * (액세스 가능한 네트워크를 모두 알아 두지 않으면 안 된다
    * 프로그램에 유용합니다).
    */
    struct ifconf {
        int   ifc_len;              /* 관련 버퍼의 크기 */
        union {
            caddr_t    ifcu_buf;
            struct     ifreq *ifcu_req;
        } ifc_ifcu;
    #define ifc_buf ifc_ifcu.ifcu_buf /* 버퍼 주소 */
    #define ifc_req ifc_ifcu.ifcu_req /* 돌려주어지는 구조체의 배열 */
    };

관련 항목
ioctl(2), socket(2), intro(4), config(8), routed(8)

역사
netintro 메뉴얼은, 4.3BSD tahoe 그리고 출현했습니다.