관리 메뉴

너와 나의 스토리

[실습] 주소체계와 데이터 정렬 - IP주소/PORT번호/주소정보 표현/인터넷 주소(Internet Address) 본문

Computer Networks/실습

[실습] 주소체계와 데이터 정렬 - IP주소/PORT번호/주소정보 표현/인터넷 주소(Internet Address)

노는게제일좋아! 2019. 9. 25. 22:59
반응형

IP주소와 PORT 번호

인터넷 주소(Internet Address)

인터넷에 컴퓨터를 연결해서 데이터를 주고받기 위해서는 IP 주소를 부여 받아야 한다.

    • 인터넷 상에서 컴퓨터를 구분하는 목적으로 사용되는 주소
  • 이러한 IP 주소체계는 IP 주소의 표현에 사용되는 바이트 크기에 따라 다음과 같이 두 종류로 나뉜다. 
    • IPv4(Internet Protocol version 4)   - 4 바이트 주소 체계
    • IPv6(Internet Protocol version 6)   - 16 바이트 주소 체계
  • 소켓을 생성할 때 기본적인 프로토콜을 지정해야 한다.
  • 네트워크 주소와 호스트 주소로 나뉜다. 네트워크 주소를 이용해서 네트워크를 찾고, 호스트 주소를 이용해서 호스트를 구분한다.

[왼: IPv4 주소체계  오: IP주소 기반의 데이터 전송 과정]

  • WWW.SEMI.COM이라는 회사의 사람에게 데이터를 전송한다고 가정해보자. 처음에는 4바이트를 전부 참조하는 것이 아니라 네트워크 주소(1byte)만 참조해서 일단 SEMI.COM의 네트워크로 데이터가 전송된다. 그 후, 해당 네트워크(네트워크를 구성하는 라우터)는 전송된 데이터의 호스트 주소(호스트 ID)를 참조하여 그 사람의 컴퓨터에 데이터를 전송해준다.

 

 

클래스 별 네트워크 주소와 호스트 주소의 경계

때문에 첫 번째 바이트 정보만 참조해도 IP 주소와 클래스 구분이 가능하며, 이로 인해서 네트워크 주소와 호스트 주소의 경계 구분이 가능하다.

 

 

 

IP 주소
  • network address라고도 한다.
  • 데이터가 전송될 목적지 호스트를 알려주는 역할을 한다.
  • 사람은 주소를 숫자로 구분하는 것보다 이름으로 구분하는 것이 더 편하므로 시스템에는 IP 주소 외에 호스트명을 지정한다. 인터넷에서 사용하는 호스트명은 '호스트명+도메인명' 형태로 구성된다. 예를 들어 호스트명이 www.hanb.co.kr인 시스템이이 있을 때, www는 호스트명, hanb.co.kr은 도메인명이 된다. 
  • 호스트명과 도메인명을 관리하는 시스템을 DNS(Domain Name System)이라고 한다.

 

PORT 번호 - 소켓의 구분에 활용
  • IP는 컴퓨터를 구분하는 용도로 사용되며, PORT 번호는 소켓을 구분하는 용도로 사용된다.
  • 하나의 프로그램 내에서는 둘 이상의 소켓이 존재할 수 있으므로, 둘 이상의 PORT가 하나의 프로그램에 의해 할당될 수 있다.
  • PORT번호는 16비트로 표현, 따라서 그 값은 0~65535
  • 0~1023은 잘 알려진 PORT라 해서 이미 용도가 결정되어 있다.

 

 

주소정보의 표현

IPv4 기반의 주소표현을 위한 구조체
struct sockaddr_in
{
    sa_family_t sin_family;  // 주소체계(Address Family)
    uint16_t sin_port;  // 16비트 TCP/UDP PORT 번호
    struct in_addr;  // 32비트 IP 주소
    char sin_zero[8];  // 사용되지 않음
}

-> bind 함수에 주소정보를 전달하는 용도로 사용됨

struct in_addr
{
    in_addr_t s_addr;  // 32비트 IPv4 인터넷 주소
 }

 

 

구조체 sockaddr_in의 멤버에 대한 분석
  • sin_family
    • 주소체계 정보 저장
  • sin_port
    • 16비트 PORT번호 저장
    • 네트워크 바이트 순서로 저장
  • sin_addr
    • 32비트 IP주소정보 저장
    • 네트워크 바이트 순서로 저장
    • sin_addr의 구조체 자료형 in_addr은 사실상 32비트 정수 자료형
  • sin_zero
    • 특별한 의미를 지니지 않는 멤버
    • 반드시 0으로 채워야 한다. -> 이유 중요!

 

 

구조체 sockaddr_in 활용

sockaddr_in 구조체가 인자로 전달되는데 이 때, sockaddr 타입으로 형 변환을 해줘야 한다.

 

 

* sockaddr_in은 IPv4(프로토콜 체계 중 하나)의 주소정보를 담기 위해 정의된 구조체인데, 왜 sin_family에 주소체계를 하나 더 만들어서 정의해줄까? 

답: sockaddr에서 주소체계를 따로 요구하므로 쉽게 변환하기 위해서

 

 

 

 

네트워크 바이트 순서와 인터넷 주소 변환

4바이트로 정수 1을 저장하는 방법
  • [00000000 00000000 00000000 00000001] 이렇게 메모리에 저장하는 CPU도 있지만
  • [00000001 00000000 00000000 00000000] 이렇게 반대로 메모리에 저장하는 CPU도 있다.
  • 즉, CPU마다 데이터를 표현 및 해석하는 방식이 다르다.

 

 

바이트 순서(Order)와 네트워크 바이트 순서
  • 빅 엔디안(Big Endian)
    • 상위 바이트의 값을 작은 번지수에 저장 

  • 리틀 엔디안(Little Endian)
    • 상위 바이트의 값을 큰 번지수에 저장

  • 호스트 바이트 순서
    • CPU별 데이터 저장방식을 의미
  • 네트워크 바이트 순서
    • 통일된 데이터 송수신 기준을 의미함 -> 데이터 보내는 순서를 통일
    • 빅 엔디안이 기준이다

 

바이트 순서 변환하기

  • 리눅스에서 long형은 4바이트
  • htons: short형 데이터를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환하라

 

 

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

 

문자열 정보를 네트워크 바이트 순서의 정수로 변환

  • "211.214.107.99"와 같이 점이 찍힌 10진수로 표현된 문자열을 이 함수의 인자로 넣으면, 32비트 정수형으로 변환해준다.
  • sockaddr_in 안에서 주소정보를 저장하기 위해 선언된 멤버는 32비트 정수형으로 정의되어 있어서 위 함수를 통해 평소 우리가 쓰는 ip 주소 표현을 32비트 정수형으로 바꿔서 저장해야한다.

 

inet_aton

  • inet_addr 함수처럼 문자열 변환한 후, addr에 결과 저장

 

 

inet_ntoa

  • inet_aton함수의 반대기능 제공
  • 정수형 IP 주소 정보를 우리가 쉽게 볼 수 있는 문자열 형태로 변환한 뒤, 변환된 문자열의 주소 값을 반환한다.

 

 

인터넷 주소의 초기화

  • 서버에서 주소정보를 설정하는 이유?
    • IP 211.217.168.13, PORT 9190으로 들어오는 데이터는 내게로 다 보내라!
    • IP 211.217.168.13, PORT 9190으로 연결을 해라!

 

INADDR_ANY

  • 현재 실행중인 컴퓨터의 IP를 소켓에 부여할 때 사용되는 것이다.
  • 서버 프로그램의 구현에 주로 사용된다.

 

 

 

 

 

 

 

 

 

 

출처: [열혈 TCP/IP 소켓 프로그래밍] 

 

반응형
Comments