소켓의 타입과 프로토콜 설정

2022. 5. 22. 17:52네트워크

728x90

프로토콜

  • 컴퓨터 상호간의 데이터 송수신에 필요한 통신규약
  • 소켓을 생성할 때 기본적인 프로토콜 지정

프로토콜 체계

  • IPv4 : PF_INET
  • IPv6 : PF_INET6

소켓 타입

  • 데이터 전송 방식을 의미
  • 소켓이 생성될 때 소켓의 타입도 결정
  • IPv4의 소켓 타입
    • 연결 지향형 소켓 타입
    • 비 연결 지향형 소켓 타입

연결지향형 소켓(SOCK_STREAM) : TCP

  • 중간에 데이터 소멸 X
  • 전송 순서대로 데이터 수신
  • 데이터 경계 X
  • 소켓 대 소켓 연결은 반드시 1대1 구조

비 연결지향형 소켓(SOCK_DGRAM) : UDP

  • 전송순서 상관없이 빠른 속도 전송 지향
  • 데이터 손실 및 파손 우려
  • 데이터 경계 존재
  • 한번에 전송 가능한 데이터 크기 제한

인터넷 주소(IP)

  • 인터넷 상에서 컴퓨터를 구분하는 목적으로 사용되는 주소
  • 4바이트 주소 체계인 IPv4와 16바이트 주소체계인 IPv4 존재
  • 소켓을 생성할 때 기본적인 프로토콜을 지정해야
  • 네트워크 주소와 호스트 주소로 나눔
  • 네트워크 주소를 이용하여 네트워크 탐색
  • 호스트 주소를 이용하여 호스트 구분

  • 클래스A의 바이트 범위 0~127
  • 클래스 B의 바이트 범위 128~191
  • 클래스 C의 바이트 범위 192~223
  • 첫 번째 바이트 정보만 참조해도 IP 주소의 클래스 구분 가능

PORT 번호

  • 소켓을 구분하는 용도로 사용
  • 0 ~ 65535
  • 하나의 포트를 둘 이상의 프로그램에 할당 불가
  • 하나의 프로그램 내에서는 둘 이상의 소켓이 존재 가능 -> 둘 이상의 PORT가 하나의 프로그램에 할당 가능
  • 0~1023은 이미 용도가 결정되어 있는 포트임(Well-known PORT) -> 임의 할당 X

IPv4 기반 주소표현 구조체

typedef struct sockaddr_in {
  short          sin_family;
  u_short        sin_port;
  struct in_addr sin_addr;
  char           sin_zero[8];
} SOCKADDR_IN, *PSOCKADDR_IN, *LPSOCKADDR_IN;
  • sin_family : 주소 체계
    • PF_INET (IPv4 기반)
    • PF_INET6 (IPv6 기반)
  • sin_port : 포트번호
    • 16비트
    • 네트워크 바이트 순서(빅 엔디안)로 저장
  • sin_addr : 32비트 IP 주소
    • 네트워크 바이트 순서(빅 엔디안)로 저장
  • sin_zero : 사용 ㄴㄴ
    • 그냥 0 넣기

네트워크 바이트 순서

  • CPU가 데이터를 메모리에 저장하는 방식은 두 가지임
    • 빅 엔디안(Big Endian) : 상위 바이트 값을 작은 번지수에 저장
    • 리틀 엔디안(Little Endian) : 상위 바이트 값을 큰 번지수에 저장

  • 호스트 바이트 순서
    • CPU별 데이터 저장 방식
      • 빅 엔디안일 수도 있고 리틀엔디안일 수도
  • 네트워크 바이트 순서
    • 빅 엔디안으로 통일
      unsigned short htons(unsigned short port);
      unsigned short ntohs(unsigned short port);
      unsigned long htonl(unsigned long ip);
      unsigned long ntohl(unsigned long ip);
  • htons : host to network short : 포트번호 데이터를 호스트 순서(리틀 엔디안)에서 네트워크 순서(빅엔디안)로 변경
  • ntohs : network to host short : 포트번호 데이터를 네트워크 순서(빅엔디안)에서 호스트 순서(리틀 엔디안)로 변경
  • htonl : host to network long : IP주소 데이터를 호스트 순서(리틀 엔디안)에서 네트워크 순서(빅엔디안)로 변경
    • htonl(INADDR_ANY) : 현재 실행중인 컴퓨터의 IP소켓을 부여, 그것을 네트워크 바이트 순서로 변경
  • ntohl : network to host long : IP주소 데이터를 네트워크 순서(빅엔디안)에서 호스트 순서(리틀 엔디안)로 변경
u_long inet_addr(const char *string address);
char* inet_ntoa(in_addr in);
  • inet_addr : 문자열을 32비트로 변환된 빅 엔디안 정수값으로 변환
  • inet_ntoa : 네트워크 주소를 문자열로 변환
728x90

'네트워크' 카테고리의 다른 글

네트워크 프로그래밍과 소켓의 이해  (0) 2022.05.22