ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Network Programming : Part 1
    시스템 프로그래밍 2022. 4. 12. 13:58
    728x90

    A Client-Server Transaction

    위의 이러한 네트워크 client-sever 관계의 sequence를 client-sever transaction이라고 합니다.

     

    Hardware Organization of a Network Host

     

    Computer Networks

    network는 계층 시스템으로 이루어져 있습니다.

    SAN(System Area Network) : 방 하나정도

    LAN(Local Area Network) : 빌딩 전체나 캠퍼스 전체

    WAN(Wide Area Network) : 나라 와 나라 사이의 네트워크

    이러한 네트워크 시스템을 internet이라고 합니다.

    우리가 일반적으로 알고 있는 Internet은 internet의 유명한 예시입니다.

     

    Lowest Level : Ethernet Segment

    네트워크의 가장 낮은 단계입니다.

    hub를 통해 host와 연결됩니다. 

    각 Ethernet adapter는 고유의 48 bit 주소를 가지고 있습니다. (MAC address)

    host는 다른 host에게 bit 덩어리(frames)를 보냅니다.

    hub는 수동적으로 각 port들로 부터 bit들을 다른 port로 복사합니다.

    hub는 최근에 switch나 router들로 부터 대체되는 추세입니다.

     

    Next Level : Bridged Ethernet Segment

    Ethernet segment 보다 높은 단계 입니다.

    위의 그림을 보면 Ethernet segment가 bridge를 통해 여러개의 Ethernet segment와 연결되 있습니다.

    이를 통해 건물 전체나 캠퍼스 전체로 네트워크를 확장 할 수 있습니다.

    bridge는 어떤 hub로 부터 bit 덩어리(frame)을 받으면 어떤 port로 보낼것인지 선택적으로 frame을 복사해야합니다.

     

    Conceptually View of LANS

    위에서 본것은 우리가 논리적으로 hub, bridge 등등을 살펴본것입니다.

    간단히 보면 여러 host들은 그냥 하나의 LAN선이라는 single wire에 연결된것처럼 보입니다.

     

    Next Level : internet

    internet입니다.

    여러개의 LAN이 reouter를 통해 WAN으로 연결되어있습니다.

    이렇게 연결된 것을 internet이라고 불립니다.

    주의해야 할점이 LAN 1과 LAN 2는 다른 시스템을 사용할 수 있습니다.

    예를들어 LAN 1은 Ethernet을 사용하고, LAN 2는 Fiber Channe을 사용할 수 있습니다. 

    우리는 이렇게 incompatible한 상황으로 compatible로 바꿔줘야 합니다.

     

    Logical Structure of an internet

    internet에서는 위계가 존재하지 않습니다. 

    source로 부터 packet을 destination으로 보냅니다. 

    router는 bridge로 형성되어있고 한 네트워크에서 다른 네트워크로 통신합니다.

    위의 그림을 보면 왼쪽 host에서 오른쪽 host로 이동할 때 2가지 방법이있습니다. 

    이는 routing 알고리즘을 통해 무엇이 더빠른지는 컴퓨터 네트워크 시간에 배웁니다.

     

    The Notion of an internet Protocol

    아까 위에서 봤듯이 LAN 1과 LAN 2가 서로 통신하려면 서로 compatible한 시스템이어야 합니다.

    그럼 incompatible하면 어떻게 될까?

    이를 해결해주는게 바로 Protocol입니다.

     

    What Does an internet Protocol Do?

    protocol은 크게 2가지 역할을 합니다.

     

    1) naming scheme을 제공합니다.

    internet protocol은 획일화된 host 주소를 정의합니다.

    각 host들(그리고 router 포함)은 획일화된 host 주소를 할당받습니다.

     

    2) delivery machanism을 제공합니다.

    internet protocol은 packet을 정의합니다.

    packet은 header 와 payload로 구성되어 있습니다.

    payload는 내가 보내고자하는 데이터이고

    header는 packet의 크기, 누구에서 누구에게 보내는 주소들을 포함합니다.

     

    Transferring internet Data Via Encapsulation

    데이터가 전달되는 과정을 도식화 해놓은 것입니다.

    먼저 Host A에서 fork를 통해 process를 띄운뒤 data를 저장합니다.

    (4)에서 (5)로 이동할 때 protocol 을 통해 LAN 1과 LAN 2가 incompatible한것을 통일시켜 줍니다.

     

    Global IP Internet

    Internet은 internet의 한 예제입니다.

    IP(Internet Protocol) : basic naming scheme을 제공하고 host A에서 host B로 packet(datagram)을 전송을 하되 

    unreliable로 전송  (host -to -host)

    UDP(Unreliable Datagram Protocol) : IP를 확장한 개념입니다. (process -to - process) 주로 영화나 멀티미디어에

    사용합니다. unreliable

    TCP(Transmission Control Protocol) : IP를 확장한 개념입니다.  (process-to-process)  reliable

     

    host A와 host B가 통신을 하는데 interface가 존재해야하는데 이것이 sockets interface입니다.

    Unix file I/O를 통해 접근 가능

     

    Hardware and Software Organization of an Internet Application

    host-host 

    client와 TCP/IP는 socket interface를 통해 서로 통신이 가능합니다.

    TCP/IP는 Kernel 에서 관리합니다.

     

    A Programmer's View of the Internet

    1) host들은 32-bit의 IP 주소로 맵핑되있습니다.

    ex) 128.2.203.179 (각각 8 bit씩 차지)

     

    2) IP 주소의 집합들은 Internet domain의 집합에 맵핑됩니다.

    ex) 128.2.203.179는 www.cs.cmu.edu에  에 맵핑 되있습니다.

     

    3) Internet의 process는 다른 Internet precess와 connection을 통해 통신가능합니다.

     

    Aside : IPv4 and IPv6

    일반적인 Internet Protocol은 Internet Protocol Version 4 (IPv4)라고 불리는 32 bit 주소를 가집니다.

    1996년에 IPv6가 나왔습니다. 이것은 128 bit의 주소를 지닙니다.

    2015년까지도 여전히 IPv4를 사용하고 있습니다.

    우리는 계속 IPv4에 초점을 맞출것입니다. 

     

    (1) IP Addresses

    IP Address는 32 bit로 저장이 됩니다.

    IP 주소는 항상 메모리에 network byte order(big-endian)로 저장됩니다.

    하지만 host에서 저장될 때는 little endian 방식으로 저장될 수 있습니다.

    따라서 개발자는 이러한것을 다뤄줘야 합니다.

    즉, big-endian은 little endian으로 little endian은 big endian으로 바꿔줘야합니다.

    #include <arpa/inet.h>
    
    uint32_t htonl(uint32_t hostlong);
    uint16_t htons(uint16_t hostshort);
                                  Return : value in network byte order
                                  
    uint32_t ntohl(uint32_t netlong);
    uint16_t ntohs(uint16_t netshort);
                                  Return : value in host byte order​

    예를들어 128.2.194.242 의 IP주소가 있으면 

    이를 16진수로 표현하면 0x80 02 c2 f2 입니다. (big-endian)

    이를 host로 넘겨줄때는 0x f2 c2 02 80(little endian)으로 바꿔서 저장해야합니다.

     

    Dotted Decimal Notation

    32-bit의 IP address는 각각 10진수로 표현할 수 있습니다.

     

    (2) Internet Domain Names

    우리는 모든 IP주소를 외울 수 없습니다. 128.2.131.66 등등 이러한 것들은 외우기 어렵습니다.

    따라서 인간이 보기 쉽게 domain 이름을 설정하였습니다.

    예를 들어 www.pdl.cs.cmu.edu  는 128.2.131.66의 IP 주소를 가집니다.

     

    Domain Naming System (DNS)

    인터넷은 IP 주소와 domain 이름들의 mapping을  DNS라는 엄청큰 분산된 데이터베이스로 하여금 유지합니다.

    개발자 관점에서 DNS는 엄청난 개수의 host들의 집합으로 볼 수 있습니다.

    각 host는 domain이름과 IP 주소의 mapping 관계를 정의합니다.

     

    Properties of DNS Mapping

    DNS mapping 정보를 알 수 있습니다.

    nslookup 명령어 입니다.

    각 host들은 domain name인 localhost라는 이름을 가지고 있습니다.

    따라서 현재 IP 주소인 127.0.0.1을 출력합니다.

    hostname 이라는 명령어를 사용해 real domain name을 알 수 있습니다.

    one-to-one mapping 정보를 보여줍니다.

    다른 domain 이름을 가지지만 같은 IP 주소를 가질 수 있습니다.

    여러 IP주소를 가질 수 있습니다.

    아예 IP주소를 안가질 수 도 있습니다.

     

    (3) Internet Connections

    client와 server는 connection이라는 byte stream을 통해 서로 통신할 수 있습니다.

    각 connection은 3가지 특징을 지닙니다.

    1. Point-to-Point : 쌍 process 끼지 통신합니다.

    2. Full-duplex : 데이터는 양방향으로 흐를 수 있습니다.

    3. Reliable : 데이터들은 보낸 순서대로 받습니다.

     

    socket은 이러한 connection의 양 끝점입니다.

    socket address는 (IPaddress : port) pair 형식입니다.

     

    port 는 크게 2가지로 나뉩니다.

    1. Well-known port : 이미 유명한 포트입니다.

    즉, server에 의해 이미 정해진 port입니다. 예를들어 web 서버는 포트번호가 80입니다(fix).

     

    2. Ephemeral port : well known port이외에 나머지 port입니다. user의 요청에 의해 커널이 지정합니다. 

     

    Anatomy of a Connection

    connectionsocket pair를 통해 unique하게 식별됩니다.

    socket pair = (client ip 주소, client port, sever ip 주소, server port)

     

    web 서버와 통신

    echo 서버와 통신

     

    Sockets Interface

    network application의 build를 위한 Unix I/O를 통한 함수들의 집합입니다.

     

    Sockets

    kernel의 입장에서 보면 socket은 connection의 양 끝점입니다.

    application의 입장에서 보면 socket은 application을 네트워크로 read, write할 수 있는 file descriptor입니다.

    기억해야하는 것이 모든 Unix I/O, network는 file로 이루어져있습니다.

     

    cilent와 server는 socket descriptor를 통해 read, write할 수 있습니다.

     

    file I/O와 socket I/O의 가장 큰 차이점은 application이 descriptor을 어떻게 open하는지 입니다.

     

    Socket Address Structures

    socket 주소는 총 16 byte로 이루어져 있습니다.

    struct sockaddr {
        uint16_t  sa_family;  // 주소 체계
        char      sa_data[4]; // 해당 주소 체계에서 사용하는 주소 정보(IP정보 + 포트 정보)
    };

    struct sockaddr_in {                // IPv4 주소를 저장하는 구조체
        uint16_t        sin_family;     // 주소 체계를 저장하는 필드(AF_INET)
        uint16_t        sin_port;       // 포트 정보 저장
        struct in_addr  sin_addr;       // IPv4 주소 저장
        unsigned char   sin_zero[8];    // 사용하지 않는 필드. 0으로 채움
    };

     

    Socket Interface

    getaddrinfo 함수로 부터 시작합니다.

    socket 함수는 socket descriptor를 생성합니다.

    bind 함수는 socket과 server의 정보를 연결합니다. (외부 host에서 server 연결 요청시 socket descriptor 번호 필요하기 때문)

    listen 함수는 어떤 컴퓨터로 부터 요청이 와도 수락 할 수 있게 대기상태에 들어가는 함수입니다.

    accept 함수는 server socket과 client를 연결하는 함수입니다.

    connect 함수는 server에 연결 요청을 하는 함수입니다. server가 바쁘면 대기열에 넣었다가 때가 되면 accept 

     

    Host and Service Conversion : getaddrinfo

    getaddrinfo 함수는 domain 주소값을 IP 주소로 변환할 때 사용합니다. 

    host와 service가 주어지면 getaddrinfo는 addrinfo 구조체의 linked list를 가리키며 각 구조체는 

    해당 socket address 구조체를 가리키며, socket interface 함수에 대한 argument를 포함하는 result를 반환합니다.

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
        
    int getaddrinfo(const char *host,            // (ex) "www.example.com" or IP
                    const char *service,         // (ex) "http" or port number
                    const struct addrinfo *hints,   
                    struct addrinfo **result);   // DNS서버로부터 받은 네트워크 주소 정보(IP)를 돌려주는 output 매개변수
                //Returns: 0 if OK, nonzero error code on error
    
    // 사용 후 메모리 해제(메모리 누수 방지)
    void freeaddrinfo(struct addrinfo *result);

     

    host 인자에는 domain 이름이나 IP 주소를 넣을 수 있습니다. host 이름을 주소로 변환하고 싶지 않으면 이 자리에

    null을 넣으면 됩니다.

    service 인자에는 서비스 이름이나 포트 번호를 넣으면 됩니다. 

    hints 인자에는 geraddrinfo가 return하는 result에 해당하는 구조체의 정보들을 control 합니다. 

    result는 DNS server로 부터 받은 네트워크 주소 정보를 돌려주는 output 매개변수 입니다. 

    링크드 리스트 자료구조로 이루어진 addrinfo 구조체를 사용합니다.

     

    addrinfo Struct

    struct addrinfo {
        int		       ai_flags;      // 기본 동작을 더 수정하는 비트마스크
        int		       ai_family;     // AF_INET -> IPv4, AF_INET6 -> IPv6
        int		       ai_socktype;   // TCP 경우 SOCK_STREAM
        int		       ai_protocol;    
        char  	       *ai_canonname;   
        size_t             ai_addrlen;   // 소켓 주소 구조체의 크기
        struct sockaddr    *ai_addr;      // 소켓 주소 구조체 가리킴
        struct addrinfo    *ai_next;      // 다음 addrinfo구조체 가리킴
    };

    getaddrinfo에서 return되는 각 addrinfo 구조체에는 socket 함수로 직접 전달할 수 있는 argument가 포함되어 있습니다.

    또한 connect 함수와 bind 함수에 직접 전달할 수 있는 socket address 구조체를 가리킵니다.

     

    Linked List Returned by getaddrinfo

    client들은 socket과 connect 호출이 성공할 때까지 각 socket address 차례로 시도하면서 이 list을 돌아다닙니다.

    server는 socket 과 bind가 호출이 성공할 때까지 list을 돌아다닙니다.

     

    Host and Service Conversion : getnameinfo

    getnameinfo는 getaddrinfo에 반대입니다.

    socket address를 host와 service로 변환합니다.

     

    Conversion Example

     

Designed by Tistory.