TCP/IP 알아가기 - 주소체계와 데이터 정렬

Coosla·2021년 9월 7일
0

TCPIP 알아가기

목록 보기
3/3

1. IP주소와 PORT번호

1-1. 인터넷 주소(Internet Address)

  • IP(Internet Protocol)이란?
    인터넷상에서 데이터를 송수신할 목적으로 컴퓨터에게 부여하는 값을 의미한다.
    컴퓨터를 구분하기 위한 목적으로 존재한다.

1-2. IP 주소체계의 종류

  • IPv4(Internet Protocol version 4) : 4바이트 주소체계
  • IPv6(Internet Protocol version 6) : 16바이트 주소체계

1-3. IPv4의 종류

  • 클래스 A
    • 형태 : 네트워크ID - 호스트ID - 호스트ID - 호스트ID
    • 1byte가 네트워크 ID, 나머지는 호스트ID
    • 비트가 0으로 시작, 네트워크 할당은 0 ~ 127, 최대 호스트 수는 16,777,214개
  • 클래스 B
    • 형태 : 네트워크ID - 네트워크ID - 호스트ID - 호스트ID
    • 2byte가 네트워트 ID, 나머지는 호스트ID
    • 비트가 10으로 시작, 네트워크 할당은 128 ~ 191, 최대 호스트 수는 65,534개
  • 클래스 C
    • 형태 : 네트워크ID - 네트워크ID - 네트워크ID - 호스트ID
    • 3byte가 네트워크 ID, 나머지는 호스트ID
    • 비트가 110으로 시작, 네트워크 할당은 192 ~ 223, 최대 호스트 수는 254개
  • 클래스 D
    • 멀티캐스트를 위한 클래스
  • 클래스 E
    • 미래에 사용하기 위해 남겨둔 클래스

1-4. IP주소 기반의 데이터 전송과정

  • 네트워크 주소를 참조해서 해당 네트워크(라우터나 스위치)로 데이터를 전송한다.
  • 해당 네트워크에서 데이터에 적혀있는 호스트 주소를 이용하여 호스트에 데이터를 전달한다.

1-5. PORT 번호

  • 하나의 운영체제 내에서 소켓을 구분하는 목적으로 사용한다.
  • 하나의 운영체제 내에서 동일한 Port번호를 둘 이상의 소켓에 할당할 수 없다.

2. 주소정보 표현

2-1. 구조체 sockaddr_in 멤버 분석

  • sin_family
    • 적용할 주소체계 정보를 저장한다.
    • AF_INET : IPv4 인터넷 프로토콜에 적용하는 주소체계
    • AF_INET6 : IPv6 인터넷 프로토콜에 적용하는 주소체계
    • AF_LOCAL : 로컬 통신을 위한 유닉스 프로토콜의 주소체계, 여러 주소체계가 있음을 알림.

  • sin_port
    • 16비트 PORT번호를 저장한다. (네트워크 바이트 순서로 저장)

  • sin_addr
    • 32비트 IP주소정보를 저장한다. (네트워크 바이트 순서로 저장)

  • sin_zero
    • 특별한 의미를 지니지 않는 멤버이다.
    • sockaddr_in 크기를 sockaddr와 일치시키기 위해 삽입된 멤버

2-2. 구조체 sockaddr_in와 구조체 sockaddr

  • sockaddr_in와 sockaddr의 형태
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    struct sockaddr_in{
        sa_family_t sin_family;   // 주소체계
        uint16_t sin_port;        // 16비트 PORT번호
        struct in_addr sin_addr;  // 32비트 IP주소
        char sin_zero[8]          // 사용하지 않음
    }
     
    struct sockaddr{
        sa_family_t sin_family;   // 주소체계
        char sa_data[14]          // 주소정보
    }
     
    // 여기서 알수있는 부분은 sockaddr_in에서 sin_port, sin_addr의 정보를
    // sockaddr에서 sa_data 배열로 받고 있다는 것이다.
    cs

  • bind함수에서 사용
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct sockaddr_in serv_addr;
     
    ...
     
    if(bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
        error_handling("bind() error");
     
    ...
     
    // sockaddr_in구조체로 선언, serv_addr을 bind함수 두번째 매개변수로 사용할 때
    // sockaddr 구조체로 형변환을 하는 것을 알 수 있다. 이 부분은 위에 있는 구조체들의
    // 형태를 보면 알수있다. sockaddr의 sa_data배열에 IP주소와 PORT번호를 저장하기 불편하여
    // IP주소와 PORT번호를 따로 저장할 수 있는 sockaddr_in를 사용한 것이다.
    cs

3. 네트워크 바이트 순서와 바이트 순서 변환

3-1. 빅 엔디안(Big Endian)와 리틀 엔디안(Little Endian)

  • 빅 엔디안
    • 상위 바이트의 값을 작은 번지수에 저장하는 방식
  • 리틀 엔디안
    • 상위 바이트의 값을 큰 번지수에 저장하는 방식

3-2. 바이트 순서의 변환

  • 바이트 순서 변환 함수들
    1
    2
    3
    4
    5
    6
    // PORT번호 변환에 사용
    unsigned short htons(unsigned short);
    unsigned short ntohs(unsigned short);
    // IP주소 변환에 사용
    unsigned long htonl(unsigned long);
    unsigned long ntohl(unsigned long);
    cs

4. 인터넷 주소의 초기화와 할당

4-1. inet_addr 함수

  • 문자열 정보를 네트워크 바이트 순서의 정수로 변환한다.
  • 변환된 값을 sockaddr_in 구조체에 넣는 추가 과정이 있다.

    1
    2
    3
    4
    5
    #include<arpa/inet.h>
     
    in_addr_t inet_addr(const char* string); 
    // 성공 시 빅 엔디안으로 변환된 32비트 정수 값, 실패시 INADDR_NONE 반환
    // 유효하지 못한 IP주소에 대한 오류검출 
    cs

4-2. inet_aton 함수

  • 변환된 IP주소 정보를 sockaddr_in 구조체에 별도 대입과정을 거칠 필요없이 sockaddr_in 구조체에 저장가능하다.
  • 기능은 inet_addr과 동일하다.
    1
    2
    3
    4
    5
    6
    #include<arpa/inet.h>
     
    in_addr_t inet_aton(const char* stringstruct in_addr* addr); 
    // 성공 시 1(True), 실패 시 0(False)반환
    // string : 변환할 IP주소 정보를 담고 있는 문자열의 주소 값 전달.
    // addr : 변환된 정보를 저장할 in_addr 구조체 변수의 주소 값 전달.
    cs

4-3. inet_ntoa 함수

  • inet_aton함수의 반대기능을 제공하는 함수이다.
  • 반환형이 char형 포인터이다.
    1
    2
    3
    4
    5
    6
    #include<arpa/inet.h>
     
    in_addr_t inet_ntoa(struct in_addr* addr); 
    // 성공 시 문자열의 주소 값, 실패 시 -1 반환
    // 반환형이 char형 포인터인 이유는 해당 함수가 
    // 호출되면 정에 저장된 문자열 정보가 지워질수 있기 때문
    cs

4-4. INADDR_ANY

  • 소켓이 동작하는 컴퓨터의 IP주소가 자동으로 할당되어 직접 입력하는 수고를 덜 수 있다.
  • 할당 받은 IP중 어떤주소를 통해서 데이터가 들어오더라도 PORT번호만 일치하면 수신할 수 있게 된다.

5. 소켓에 인터넷 주소 할당하기

5-1. bind 함수

  • sockaddr_in 구조체를 통해 초기화한 주소정보를 소켓에 할당한다.
    1
    2
    3
    4
    5
    6
    7
    8
    #include<sys/socket.h>
     
    int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
    // 성공 시 0, 실패 시 -1 반환
     
    // sockfd  : 주소정보를(IP, PORT정보) 할당할 소켓의 파일 디스크립터.
    // myaddr  : 할당하고자 하는 주소정보를 지니는 구조체 변수의 주소 값.
    // addrlen : 두 번째 인자로 전달된 구조체 변수의 길이정보.
    cs
profile
프로그래밍 언어 공부 정리

0개의 댓글