tech/리눅스

[리눅스] 리눅스에서 소켓을 다루는 방식

daniel_lab 2025. 2. 4. 23:22

현재 회사에서 운영하고 있는 모든 API 서버를 linux 에서 운영하여 트래픽을 받고 있다. 오늘은 Linux 에서 클라이언트 연결 소켓을 처리하는 방식에 대해서 정리해보려 한다. 그동안 Linux에서 소켓 입출력 데이터를 파일 입출력으로 관리한다는 사실은 알고 있었지만, 관련된 용어나 개념을 어느정도 정리해보고 싶었다ㅎㅎ

 

파일 디스크립터(File Descriptor, FD)란?

파일 디스크립터(File Descriptor, FD)는 리눅스에서 파일을 식별하는 정수형 값이다. 리눅스에서는 모든 것을 파일로 취급하므로, 파일, 소켓, 파이프, 터미널 등 모든 입출력 자원을 파일 디스크립터(FD) 를 통해 관리한다.

파일 디스크립터 예시

FD 값설명

0 표준 입력 (stdin)
1 표준 출력 (stdout)
2 표준 에러 (stderr)
3 이상 사용자가 연 파일, 소켓 등

 

파일 디스크립터와 소켓의 관계

1. 파일과 소켓은 같은 방식으로 다뤄진다

리눅스에서는 소켓(Socket)도 파일의 일종이다. 즉, 파일을 열 때와 마찬가지로 소켓을 생성하면 파일 디스크립터를 반환한다.

 
int sockfd = socket(AF_INET, SOCK_STREAM, 0);

 

이렇게 socket() 함수를 호출하면 파일 디스크립터(sock_fd)가 생성된다. 이후에는 read(), write() 같은 파일 입출력 함수도 소켓에 사용할 수 있다.

char buffer[1024];
read(sockfd, buffer, sizeof(buffer));  // 파일을 읽듯이 소켓에서 데이터 읽기
write(sockfd, "Hello", 5);             // 파일에 쓰듯이 소켓에 데이터 쓰기

 

파일 디스크립터의 특징

  1. 각 프로세스는 자체 FD 테이블을 가짐
    • 프로세스마다 열린 파일 목록이 따로 관리됨.
    • 하나의 프로세스에서 open()을 호출하면 FD가 증가.
  2. 시스템 자원은 FD를 통해 관리됨
    • 네트워크 소켓, 파일, 파이프, 터미널 등 모든 I/O는 FD를 통해 이루어짐.
  3. 한정된 개수
    • 리눅스에서는 하나의 프로세스가 가질 수 있는 FD 개수에 제한이 있음 (ulimit -n으로 확인 가능).
    • 서버에서 많은 클라이언트를 동시에 처리하려면 FD 개수 조정이 필요.