네트워크

[네트워크 - 윤성우의 열혈 TCP/IP] 주소체계와 데이터 정렬

우디혜 2020. 12. 31. 23:09

IPv4와 IPv6

IPv4는 4바이트 주소체계이다. 그리고 ip주소가 고갈될 상황을 대비해서 만든 16바이트 주소체계가 IPv6이다. 아직은 IPv4가 주류다. IPv4 기준의 ip 주소는 네트워크 주소 + 호스트 주소 로 구성되어 있다. 그리고 네트워크 주소와 호스트 주소의 길이에 따라 클래스가 분류된다.

⁕ 네트워크 주소(ID) : 호스트 주소(ID) 비율로 따졌을 때 A클래스는 1byte : 3bytes, B클래스는 2bytes : 4bytes... 이런 식이다.

 

데이터 전송 과정

보통 회사나 학교 단위로 하나의 네트워크(라우터) 아래에 여러 대의 로컬 컴퓨터가 존재한다. 만약 A학교 소속의 a 컴퓨터에 데이터를 전송하게 된다면, 먼저 ip 주소 중 네트워크 주소를 먼저 참조하여 해당 라우터로 데이터가 전송이 된다. 그리고 데이터를 받은 라우터는 호스트 주소를 참조하여 a 컴퓨터에 최종적으로 데이터를 전송한다.

 

 

소켓 주소

소켓의 주소는 크게 ip와 port 번호 두 가지로 나뉜다. 방금 전의 설명처럼 ip 주소는 데이터를 전송하기 위해서 사용된다. 그렇게 컴퓨터 내부에 전송된 데이터는 소켓에 적절하게 분배해야하는데 그 작업을 운영체제가 담당한다. 운영체제는 이 port 번호를 참조해서 소켓에 데이터를 적절히 분배 · 전달한다. 

  • TCP 소켓과 UDP 소켓은 port 번호를 공유하지 않기 때문에 중복되어도 상관없다.
  • port는 하나의 운영체제 내의 소켓들을 구분해주는 역할을 하기 때문에 운영체제에 의존적이다.
  • 때문에 운영체제 혹은 하나의 프로그램에서 중복된 port 번호를 사용할 수 없다.
    • 헷갈리지말자, 하나의 프로그램 내에서 둘 이상의 소켓은 존재할 수 있다. 그 소켓들을 구분해주는 것이 port번호다.

 

주소정보 표현

소켓 생성 후 bind()로 소켓에 주소를 할당해주는 과정이 필요하다. 이때 필요한 구조체가 sockaddr이다.

sockaddr는 주소체계(sin_family)와 14바이트 크기의 주소정보, 두 가지 필드를 가진다.

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

그리고 주소 정보에는 PORT정보와 IP 주소가 포함되어있는데 해당 정보들을 채워넣기 쉽게 하기 위해서 sockaddr_in 구조체가 만들어졌다. 최종적으로 담기는 내용은 같지만 차이는 sockaddr의 주소 정보를 조금 더 세분화시켜 필드 변수로 만들어놓은 형태가 sockaddr_in이라는 것이다.

 

struct sockaddr_in
{
   sa_family_t	  sin_family; // 주소 체계
   uint16_t	  sin_port; // 16비트 TCP/UDP PORT 번호
   struct in_addr sin_addr; // 32비트 IP 주소
   char 	  sin_zero[8]; // 사용되지 않음
};

PORT 번호에 해당하는 sin_port 2바이트 + IP 주소에 해당하는 sin_addr 4바이트 + 그리고 '주소 정보' 포멧을 맞춰주기 위해 0으로 초기화되어있는 sin_zero 8바이트 => 총 14바이트의 주소 정보 필드와 동일하다

 

* 1byte = 8bits