네트워크 프로그래밍 CH3. IP주소와 PORT번호

Alpha, Orderly·2023년 3월 7일
0

인터넷 주소 ( Internet address )

  • 인터넷 상에서 컴퓨터(Host)를 구분하기 위한 주소
  • 4바이트 체계인 IPv4와 16바이트인 IPv6가 있다.
  • 네트워크 주소와 호스트 주소로 나뉘며, 네트워크 주소로 네트워크를 찾고
    호스트 주소를 이용해 호스트를 구분한다.
  • 클래스 A의 첫 한비트는 항상 0으로 시작
  • 클래스 B의 첫 두비트는 항상 10으로 시작
  • 클래스 C의 첫 세비트는 항상 110으로 시작

포트번호

  • 소켓을 구분하는 용도로 사용됨
  • 하나의 프로그램 내 둘 이상의 소켓이 존재할수 있다
    • 하나의 프로그램에서 둘 이상의 PORT가 할당될수 있다.
  • 16비트로 표현 0 ~ 65545의 범위를 가진다.
  • 0~1023 포트는 Well-known port라 하여 이미 용도가 정해져 있다.

IPv4 주소표현 구조체

  • sin_port와 sin_addr은 네트워크 바이트 순서로 저장함
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 인터넷 주소	
}

sockaddr 과 sockaddr_in의 차이점

struct sockaddr { 
	u_shortsa_family;/* address family */ 
  	charsa_data[14];/* 주소 */ 
}; 
  • sockaddr은 통신 객체에서 사용하는것이며, 직접 읽거나 작성하기엔 가독성이 떨어져 sockaddr_in 을 사용한다.
  • 실제로 사용시 타입캐스팅을 통해 sockaddr로 변환해야 한다.

네트워크 바이트 순서

  • 컴퓨터마다 Big-endian과 Little-endian 등으로 데이터 표현, 해석 방식이 다르다
    • Big-Endian : 상위 바이트 값을 작은 번지수에 저장
      • PowerPC
    • Little-Endian : 상위 바이트 값을 큰 번지수에 저장
      • X86
  • 이를 해결하기 위해 네트워크 바이트 순서를 사용한다.
    • 네트워크 바이트 순서 : 통일된 송수신 기준, 빅엔디안을 사용함

바이트 순서 변환

  • 모든 함수는 short를 받고 short를 반환하거나 (2Byte) long을 받고 long을 반환한다 (4Byte)
  • hton 혹은 ntoh로 시작하는데 이는 host에서 network로 바꾸거나 network에서 host로 바꾸는것을 의미한다.
  • 뒤에는 s나 l이 붙는데 이는 사용되는 자료형을 나타낸다 ( s - short, l - long )

인터넷 주소 할당

  • 문자열 정보를 네트워크 바이트 순서의 정수로
  • "1.1.1.1"과 과 같이 정수로 표현된 문자열 전달시 이를 32비트 정수형으로 반환
  • a : Ascii type
inet_addr : 문자열 IP주소를 받아와 빅-엔디안 정수로 변환
#include <arpa/inet.h>

in_addr_t inet_addr(const char* string);

성공시 빅엔디안 32비트 정수, 실패시 INADDR_NONE 반환
* INADDR_NONE = 0xffffffff
inet_aton : 문자열 IP주소를 받아와 구조체에 저장
#include <arpa/inet.h>

int inet_aton(const char* string, struct in_addr* addr);

성공시 1, 실패시 0 반환
inet_ntoa : in_addr 구조체를 문자열 형태로 변환
#include <arpa/inet.h>

char* inet_ntoa(struct in_addr addr);

성공시 변환한 문자열의 주소, 실패시 -1 반환

인터넷 주소 초기화

  • memset으로 구조체 미리 초기화 필요하다.
  1. sin_family : IPv4 인 AF_INET
  2. sin_addr.s_addr : 네트워크 바이트 순서 32비트 주소
  3. sin_port : 네트워크 바이트 순서 16비트 포트

INADDR_ANY

  • 내가 쓸수 있는 IP중 아무거나 가져오기.
  • htonl(INADDR_ANY) 로 사용 가능하다.
  • 서버 구현에 주로 사용한다.

+

setsocketopt

  • 소켓에 옵션을 지정한다.
profile
만능 컴덕후 겸 번지 팬

0개의 댓글