본문 바로가기

CS/컴퓨터 네트워크

실습 3-2. 주소정보 표현, 인터넷 주소 변환

 

* IPv4 기반의 주소표현을 위한 구조체

struct sockaddr_in {
	sa_family_t sin family; // 주소체계
    	uint16_t sin_port; //port 번호
    	struct in_addr sin_addr; //32비트 ip주소
    	char sin_zero[8]; //사용되지 않음
  };

ip 주소와 port 번호는 구조체 sockaddr_in의 변수에 담아서 표현함

- sockaddr_in은 bind 함수의 구조체 주소를 전달하는 구조체

   이 구조체에 각 정보를 저장하고 소켓주소를 할당하는 bind함수의 인자로 들어가게 됨

   이때 ip 주소 저장 변수는 또 다른 구조체로 되어 있음 : struct  in_addr

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

- unit16_t : 이 자료형은 POSIX라는 유닉스 계열 표준에 있는 자료형

   이런 자료형은 이름을 보고 의미를 파악할 수 있는 장점이 있음 - unsigned 16비트 int형/ int32_t는 항상 4바이트라는 걸 알 수 있음

   확장성에 도움을 주며 오류를 줄일 수 있음

 

 

* 구조체 sockaddr_int멤버

- 멤버 sin_family : 주소체계 정보 저장

AF_INET IPv4 인터넷 프로토콜에 적용하는 주소체계
AF_INET6 IPv6 인터넷 프로토콜에 적용하는 주소체계
AF_LOCAL 로컬 통신을 위한 유닉스 프로토콜의 주소체계

- 멤버 sin_port : 16비트 port번호 저장, 네트워크 바이트 순서로 저장

                                코드에서 직접 할당 가능, 터미널에서 직접 입력해서 넘겨도 됨, 방법에 따라 운영체제가 임의로 할당할 때도 있음

- 멤버 sin_addr : 32비트 ip주소 정보 저장, 네트워크 바이트 순서로 저장, 멤버 sin_addr의 구조체 자료형 in_addr

- 멤버 sin_zero : 특별한 의미를 지니지 않는 멤버, IPv4 주소체계에서 사용되지 않지만 반드시 0으로 채워야 함

 

*구조체 sockaddr_in의 활용

struct sockaddr_in serv_addr;

if(bind(serv_sock, (struct sockaddr*)& serv_addr, sizeof(serv_addr))==-1)
	error_handling("bind() error");

구조체 변수 sockaddr_in은 bind함수의 인자로 전달되는데, 매개변수 타입이 sockaddr이므로 형변환을 해야함

struct sockaddr{
	sa_family_t sin_family; // 주소체계
    	char sa_data[14]; // 주소 정보
};

구조체 sockaddr은 다양한 주소체계의 주소정보를 담을 수 있도록 정의되어있음. 그래서 IPv4의 주소정보를 담기가 불편함

이에 동일한 바이트 열을 구성하는 구조체 sockaddr_in이 정의되어 있으며 이를 이용해서 쉽게 IPv4 주소정보를 담을 수 있음

-> 이 구조체로 ipv4의 정보를 저장하고, bind함수에 넣을 때는 형 변환을 해서 쉽게 정보를 담음

-> sockaddr_in의 마지막 멤버 sin_zero는 다른 주소체계에서는 필요한 부분이라서 그 바이트가 존재함

     ipv4에서는 필요없지만 오류를 방지하기 위해서 0으로 초기화하여 필수 할당

 

 

 

* CPU에 따라 달라지는 정수 표현

4바이트 정수 1을 2진수로 표현하여 그대로 저장하는 CPU도 있지만 반대로 저장하는 CPU가 있음

둘이 통신을 하면 저장 방식과 해석 방식이 달라서 오류가 생길 수 있음

-> 네트워크 바이트  순서로 통신하기로 약속

 

* 바이트 순서와 네트워크 바이트 순서

- 빅 엔디안 Big Endian : 상위 바이트의 값을 작은 번지수에 저장

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

- 호스트 바이트 순서 : cpu별 데이터 저장방식을 의미

- 네트워크 바이트 순서 : 통일된 데이터 송수신 기준을 의미 , 빅 엔디안이 기준임

 

* 바이트 순서의 변환

unsigned short htons(unsigned short);

unsigned short ntohs(unsigned short);

unsigned long htonl(unsigned long);

unsigned long ntohl(unsigned long);

 

htons에서 h는 호스트 바이트 순서, n은 네트워크 바이트 순서를 의미

s는 자료형 short(16비트, port 번호), l은 자료형 long(4바이트, ip주소) 의미

htons : 호스트바이트 순서에서 네트워크 바이트 순서로 short 자료형을 변환

ntohl : ip주소가 네트워크바이트 순서로 되어있으니 호스트 바이트 순서로 변환하라는 의미