소켓이란 ?

소켓(Socket)은 네트워크 통신의 기본 단위를 말한다. 클라이언트와 서버 컴퓨터의 각 프로세스가 통신으로 데이터를 주고 받기 위해서 소켓이 필요하다. 소켓을 열어서 소켓에 데이터를 써서 서버에 보내거나, 소켓으로부터 받은 데이터를 읽어 사용한다.

프로세스마다 고유한 포트번호를 가지고 있어 여러개의 소켓을 가질 수 있고 ip 주소, 프로토콜 정보, 포트 번호를 통해 소켓은 생성될 소켓의 종류를 결정하고 프로세스에 맞게 생성되었다가 통신이 종료되면 소켓을 삭제한다.

socket

1. int socket()으로 소켓 생성
전화기를 사서 집에 설치하는 것과 같다. 전화기가 통신할 준비를 하는 것과 마찬가지로, 네트워크 통신을 위한 소켓을 생성한다.

2. int bind()로 소켓에 내용 할당
전화기에 전화번호를 할당하는 것과 비슷하다. 네트워크에서는 이 전화번호가 IP 주소와 포트 번호로 구성하고 이 과정을 통해 다른 네트워크 장치들이 해당 소켓(전화기)에 접근할 수 있도록 한다.

3. int listen()으로 연결 요청 가능한 상태로 변경 전화기를 켜고 벨이 울릴 준비를 하는 단계다. 서버 소켓이 클라이언트의 연결 요청을 기다리고, 소켓이 들어오는 연결 시도를 청취하며 연결 대기 큐를 설정한다.

4. int accept()로 연결 요청이 왔을 시 수락
전화가 오면 수화기를 드는 것에 해당한다. 서버가 클라이언트의 연결 요청을 받아들이고, 실제 데이터 통신을 위한 새로운 소켓을 생성한다.

포트란?

포트(Port)는 응용 프로그램 간에 통신할 때 각 응용 프로그램을 구분하기 위해 사용되는 식별번호를 포트 번호라고한다. 이 포트 번호를 통해 운영 체제는 네트워크를 통해 들어오는 데이터가 어떤 응용 프로그램으로 전달되어야 하는지 판단할 수 있다.

예를 들어, 웹 서버 소프트웨어는 주로 포트 80이나 443을 사용하여 웹 브라우저의 요청을 받는다. 각각의 네트워크 서비스는 일반적으로 특정 포트 번호를 사용하게 되는데, 이는 네트워크를 통해 데이터를 주고 받는 프로세스 또는 응용 프로그램을 식별하는데 역활을 한다.

포트 번호는 0부터 65535까지의 범위를 가지고 포트 번호는 크게 3가지 범주로 나눌 수 있다.

  • 잘 알려진 포트: 0부터 1023까지의 포트 번호로 주로 중요한 표준 서비스나 애플리케이션에 할당된다. 예로 HTTP서비스는 일반적으로 80, HTTPS는 포트 443을 사용하는 하는 것으로 알 수 있다.

  • 등록된 포트 : 1024부터 49151까지의 포트 번호는 특정 서비스에 할당되어 있지 않지만, 일부 애플리케이션에서 특정 목적으로 사용하기 위해 IANA(Internet Assigned Numbers Authority)에 등록할 수 있다. 예를 들어 데이터베이스와 같은 범위에 포트번호를 할당할 수 있다.

  • 동적 또는 개인 포트 : 49152부터 65535까지의 포트 번호로 일시적인 통신에 사용되며 일반적으로 클라이언트 측에서 서버로의 연결을 시작할때 사용된다.

서브넷 마스크란?

서브넷마스크는 IP주소를 네트워크 부분과 호스트 부분으로 구분하는데 사용되는 32비트 숫자이다. IP주소가 전화번호라면, 서브넷마스크는 전화번호 중에서 지역번호와 개인번호를 구분해주는 역활을 한다. 서브넷마스크를 통해 하나의 물리적 네트워크 안에서 둘 이상의 작은 네트워크, 즉 서브넷으로 나눌 수 있다.


서브넷마스크는 일반적으로 점으로 구분된 십진법 표기법을 사용하여 나타내며, 255.255.255.0 같은 형태로 표현한다. 이때 255는 이진수로 11111111을 의미하며, 네트워크 주소를 나타내는 부분을 말한다. 0은 이진수로 00000000을 의미하고, 호스트 주소를 나타내는 부분을 말한다.

그래서 이진수 표현에서 연속된 1로 시작하여 0이 나타날 때까지 네트워크 부분을 정의하고, 나머지 부분은 호스트 주소로 사용하여 네트워크 부분에서 1이 세팅된 비트는 해당 IP주소 범위가 같은 네트워크에 속함을 나타내고, 호스트 부분에서 0이 세팅된 비트는 해당 네트워크 내에서 개별 장치나 인터페이스를 구분하는데 사용된다.

서브넷마스크를 사용하는 이유는 서브넷마스크를 통해 IP주소 공간을 효율적으로 나누고, 네트워크 관리를 간소화하여, 보안을 강화하는데 도움이 되기 때문이다.