본문 바로가기

[+] Information/[-] Network

[2009/05/27] 주소 체계와 데이터 정렬

1. Internet Address(IPv4)

 - 인터넷상에 존재하는 호스트를 구분하기 위한 32비트 주소 체계

 * Network ID : 네트워크를 구분짓기 위한 주소.

 * Host ID : 호스트들을 구분지어주기 위한 주소.

 - 클래스

 Class A : Network ID(1Byte) + Host ID(3Byte)
 1) 00000000(0) ~ 01111111(127)
 ex) 126.1.2.3 = Network ID(126) + Host ID(1.2.3)

 Class B : Network ID(2Byte) + Host ID(2Byte)
 1) 10000000(128) ~ 10111111(191)
 ex) 184.1.1.2 = Network ID(184.1) + Host(1.2)

 Class C : Network ID(3Byte) + Host ID(1Byte)
 1) 11000000(192) + 11011111(223)
 ex) 211.1.1.2 = Network ID(211.1.1) + Host ID(2)

 -  루프백 주소(loop back address)
 1) 첫번째 바이트가 127인 IP 주소를 의미한다.



 2. Port란 무엇인가?

 
- 호스트 내에서 실행되고 있는 프로세스(Process)를 구분 짓기 위한 16 비트의 논리적 할당(소켓에 할당된다.)
 1) 16비트 이므로 값의 범위가 0 ~ 65536 이다.

 -  Well-known ports : 0 ~ 1023




3. IPv4의 주소체계를 나타내는 구조체

struct sockaddr_in {
 sa_family_t sin_family; //주소 체계(AF_INET)
 uint16_t sin_port; // port 정보
 struct in_addr  sin_addr; // 32 비트 IP주소정보
 char  sin_zero[8]; // 사용되지 않음
};

struct in_addr {
 uint32_t s_addr; // 32비트 IP 주소정보
};

 * 주의 : 모든 데이터는 네트워크 바이트 순서로 저장 해야 한다.




4. 네트워크 바이트 순서

 
- 네트워크 바이트 순서는 Big-Endian 방식을 적용하기로 약속



5. 바이트 순서 변환 함수

unsigned short htons(unsigned short);
unsigned short ntohs(unsigned short);
unsigned long htonl(unsigned long);
unsigned long ntohl(unsigned long);

'h' : host byte order
'n' : network byte order
's' : short (16 bit)
'l' : long (32 bit)




6. 인터넷 주소 조작 함수

- FROM Dotted-Decimal Notation To Big-Endian 32 비트 정수형 데이터 (Network)

unsigned long inet_addr(const char * string)


- FROM Big-Endian 32비트 정수형 데이터 (Network) TO Dotted-Decimal Notation

char & inet_ntoa(struct in_addr addr)



7. 인터넷 주소 초기화 Template

 
1) struct sockaddr_in addr;

 2) char *serv_ip="211.217.168.13";

 3) char *serv_port="9190";

 4) memset(&addr, 0, sizeof(addr_len)); // 첫번째 인자로 전달된 포인터가 가리키는 대상을 sizeof(addr_len)크기만큼 0으로 초기화.

 5) addr.sin_family = AF_INET; // IPv4 기반의 데이터를 저장.

 6) addr.sin_addr.s_addr = inet_addr(serv_ip); // 초기화 해놓은 10진수의 아이피를 정수형 데이터로 변환하여 저장.

 7) addr.sin_port = htons(atoi(serv_port)); // serv_port에 저장된 문자열을 atoi함수에 의해서 정수로 변환 한뒤 네트워크 바이트 순서로 저장.



8. 주소 정보 할당하기

#include <sys/type.h>
#include <sys/socket.h>

int bind(int sockfd, struct sockaddr * myaddr, int addrlen);
(리눅스)


#include <winsock2.h>

int bind(SOCKET s, const struct sockaddr FAR *name, int namelen);
(윈도우)