프로그래밍/소켓 프로그래밍 입문

IP 주소와 포트 번호, 소켓의 관계+ 바인딩이란?

데일리 백수 2025. 1. 8. 22:55

1. IP 주소와 호스트

  • IP 주소는 네트워크 상에서 특정 **호스트(컴퓨터)**를 식별하기 위한 유일한 값입니다.
  • 호스트는 인터넷에 연결된 컴퓨터를 의미하며, 일반적으로 라우터나 공유기를 통해 IP 주소를 자동으로 할당받습니다.
  • 한 컴퓨터가 여러 네트워크 인터페이스(예: Wi-Fi, 이더넷)를 가질 수 있으므로, 하나의 컴퓨터에 여러 IP 주소가 존재할 수 있습니다.

IP 주소의 역할

  • MAC 주소: 하드웨어(네트워크 인터페이스)에 종속된 고유 식별자.
  • IP 주소: 소프트웨어(운영체제 커널)에 종속되어, 네트워크 상에서 논리적으로 호스트를 구분.

2. 포트 번호

  • 포트 번호는 호스트 내에서 실행 중인 프로세스를 식별합니다.
  • TCP/UDP 통신에서 특정 애플리케이션을 구분하기 위해 사용되며, 동일한 포트 번호는 동시에 여러 프로세스가 사용할 수 없습니다.

포트 번호의 역할

  • 특정 서버 애플리케이션에 연결하기 위해 클라이언트는 IP 주소 + 포트 번호를 사용합니다.
    • 예: IP 주소 192.168.1.10, 포트 번호 25000은 TCP 포트 25000번에서 실행 중인 애플리케이션을 가리킴.
  • 서버 개발 관점에서 포트 번호는 프로세스를 식별하는 식별자 역할을 합니다.

포트 충돌

  • 여러 프로세스가 동일한 포트를 사용하려고 할 경우 점유권 에러가 발생합니다.
  • 이를 해결하기 위해:
    • netstat 명령으로 현재 사용 중인 포트를 확인.
    • netstat -ano 옵션을 사용하면 특정 포트를 사용하는 프로세스를 식별할 수 있음.

3. 소켓의 역할과 동작 원리

소켓은 네트워크 통신을 위해 TCP/IP 프로토콜 스택을 유저 모드 애플리케이션에서 사용할 수 있도록 추상화한 인터페이스입니다.
즉, 소켓은 프로세스와 커널의 TCP 스택 간의 다리 역할을 하며, IP 주소와 포트 번호를 기반으로 작동합니다.

소켓의 주요 작업

  1. IP 주소와 포트 번호의 연결 (바인딩)
    • bind() 함수는 소켓에 특정 IP 주소와 포트 번호를 연결합니다.
    • 이 과정을 통해 소켓이 네트워크 상에서 고유하게 식별될 수 있습니다.
  2. INADDR_ANY
    • 서버 소켓에서 IP 주소를 특정하지 않고 모든 인터페이스에서 접근을 허용할 때 사용합니다.
    • 예를 들어, 하나의 컴퓨터에 여러 IP 주소가 있을 때, INADDR_ANY를 사용하면 어떤 IP 주소를 통해 접근하더라도 연결을 허용합니다.
  3. 소켓과 파일의 유사성
    • 소켓은 파일처럼 데이터를 읽고 쓰는 구조를 따르지만, 네트워크 통신에 최적화된 기능을 제공합니다.
    • 소켓은 결국 커널의 TCP 스택을 통해 통신을 수행하며, 주소(IP)와 포트 번호가 설정되어야 완전한 동작이 가능합니다.

 

4. 바인딩(Binding)의 개념

  • 바인딩은 소켓에 IP 주소와 포트 번호를 묶는 작업입니다.
  • 바인딩이 성공해야만 소켓이 네트워크에서 사용 가능해지며, 연결 대기(listen) 상태로 전환될 수 있습니다.

바인딩 실패의 원인

  1. 잘못된 IP 주소
    • 예: IP 주소가 현재 호스트에 존재하지 않는 경우.
  2. 이미 점유된 포트 번호
    • 다른 프로세스가 동일한 포트를 사용 중인 경우.

바인딩 결과

  • 바인딩이 성공하면 소켓이 네트워크 상에서 **엔드포인트(endpoint)**로 작동하게 됩니다.
  • 클라이언트는 서버의 IP 주소와 포트 번호를 통해 연결을 요청합니다.

 

TCP 통신에서 IP 주소와 포트 번호는 네트워크와 애플리케이션을 식별하기 위한 필수 요소입니다. 소켓은 이러한 정보를 기반으로 프로세스 간 통신을 가능하게 합니다.
특히, INADDR_ANY와 같은 설정은 유연한 서버 소켓 설정을 가능하게 하며, 포트 충돌 문제를 해결하기 위한 포트 관리 도구(netstat)는 서버 개발에서 중요한 역할을 합니다.