sliver__

[3장] 주소체계와 데이터 정렬 본문

CS/TCP_IP

[3장] 주소체계와 데이터 정렬

sliver__ 2023. 6. 23. 18:27
728x90
  • 인터넷 주소란?
    • 인터넷상에서 컴퓨터를 구분하기 위한 주소
    • 4바이트 주소 체계인 IPv4, 16바이트 주소체계인 IPv6
    • 소켓을 생성할 때 기본적으로 프로토콜을 지정해야 한다.
    • 네트워크 주소와 호스트주소로 나뉜다. 네트워크 주소를 사용하여 네트워크 주소를 찾고, 호스트 주소를 사용해서 호스트를 구분한다. 
  • IPv4 주소 체계

클래스 네트워크 주소 범위 시작 비트 
A 0~127 0
B 128~191 10
C 192~223 110
D N/A N/A
  • 첫 번째 바이트를 보고 네트워크 주소 클래스를 구분하고 호스트 주소를 구한다.

 

  • PORT 번호
    • IP는 컴퓨터를 구분하는 용도, PORT는 소켓을 구분하는 용도
    • 하나의 프로그램에 둘 이상의 소켓 존재 가능
    • PORT는 16비트, 0 ~ 65535 가능
    • 0~1023은 Well-known 포트로 사용 불가능

 

  • IPv4 사용을 위한 구조체
struct sockaddr_in 
{
    sa_family_t		sin_family;	//주소체계
    uint16_t		sin_port;  	//포트번호
    struct in_addr	sin_addr;	//32비트 IP주소
    char			sin_zero[8];//사용되지 않음
};

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

#define in_addr_t uint32_t
#define in_port_t uint16_t
  • sin_family
    • 주소체계 정보 저장
NUM 주소 체계 설명
1 AF_INET IPv4
2 AF_INET6 IPv6
3 AF_LOCAL LOCAL UNIX
  • sin_port
    • 16비트 PORT 저장
    • 네트워크 바이트 순서로 저장
  • sin_addr
    • 32비트 IP 주소 저장
    • 네트워크 바이트 순서로 저장
  • sin_zero
    • 의미 없음
    • 0으로 채워져야만 한다.

 

 

  • 구조체 변수 sockaddr_in 은 bind함수 인자로 전달되는데, 매개변수 형이 sockaddr이므로 형 변환을 해야만 한다.
struct sock_addr
{
    sa_family_t		sin_family; // 주소체계
    char			sa_data[14];// 주소정보
};
  • sock_addr은 다양한 주소체계를 저장하기 위해 정의되었다.
  • sockaddr_in을 사용하여 편리하게 IPv4 주소정보를 담을 수 있다.

 

  • CPU에 따라 상위바이트를 하위 메모리 주소에 저장할 수 있고, 상위 메모리 주소에 저장할 수 있다.
  • 빅 엔디안
    • 상위 바이트 값을 작은 번지수에 저장
  • 리틀 엔디안
    • 상위 바이트 값을 큰 번지수에 저장
  • 호스트 바이트 순서
    • CPU 별 데이터 저장 방식 의미
  • 네트워크 바이트 순서
    • 통일된 데이터 송수신 기준을 의미
    • 빅 엔디안이 기준

  • 바이트 순서 변환
    • unsigned short htons(unsigned short)
    • unsigned short ntohs(unsigned short)
    • unsigned long htonl(unsigned long)
    • unsigned long ntonl(unsigned long)

 

 

  • 문자열 정보 -> 네트워크 바이트 순서의 정수로 변환
NUM 함수 Return value
(SUCCESS / FAIL)
설명
1 in_addr_t inet_addr(const char* string) 빅 엔디안으로 변환된 32비트 정수 / INADDR_NONE 파라미터 string을 32비트 정수로 변환
2 int inet_aton(const char* string, struct in_addr *addr) 1 / 0  string을 빅엔디안 32비트로 정수로 변환하여 addr에 저장
3 char* inet_ntoa(struct in_addr adr) 변환된 문자열의 주소 값 / -1 adr에 저장된 빅엔디안 32비트 정수를 문자열로 변환
  • INADDR_ANY
    • 현재 실행중인 컴퓨터 IP를 소켓에 부여

 

  • 소켓에 인터넷 주소 할당
NUM 함수 Return value
(SUCCESS / FAIL)
설명
1 int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen) 0 / -1  sockfd에 주소정보를 할당
728x90

'CS > TCP_IP' 카테고리의 다른 글

[1장] 소켓 프로그래밍 이해  (0) 2023.06.23
Comments