오늘도 삽질했습니다

#1. 동일 Port번호에 중복 LISTEN상태가 가능할까?

나스닥 엔지니어 2025. 4. 4. 16:05

🔌 동일 포트번호 중복 LISTEN, 가능한 걸까? 직접 해봤습니다

안녕하세요, 개발하며 생긴 궁금증을 기록하는 블로그입니다 :)
오늘은 네트워크 서버 개발을 하다가 생긴 동일 포트번호 중복 LISTEN 이슈에 대해 정리해보려고 해요.

사실 이건 제가 직접 겪은 상황인데요, 멀티 프로세스 서버를 구성하다가 두 개의 프로세스가 같은 포트번호로 LISTEN을 시도하는 경우가 있었어요. 이게 과연 가능할까? 하는 궁금증이 생겨 직접 테스트해보았습니다.

 

🤔 기본적으로는 불가능합니다

처음에 단순히 두 개의 서버 프로세스를 돌려서 같은 포트를 bind하고 listen하게 했더니… 예상대로 이런 에러가 발생했어요:

OSError: [Errno 98] Address already in use
  

리눅스에서는 기본적으로 하나의 포트는 하나의 프로세스만 사용할 수 있도록 제한되어 있더라고요.
즉, 중복 LISTEN은 기본적으로는 불가능하다는 사실을 체감했습니다.

⚙️ SO_REUSEADDR? 중복 LISTEN은 안 됨

혹시 SO_REUSEADDR 옵션을 주면 가능할까 싶어서 사용해봤는데,
이건 TIME_WAIT 상태의 포트를 재사용할 수 있게 해주는 옵션이지, 중복 LISTEN과는 관련이 없었어요.
즉, 이미 다른 프로세스가 LISTEN 중인 포트를 또 잡는 건 안 됨!

🚀 SO_REUSEPORT로 해결!

그러던 중 찾은 해결책이 바로 SO_REUSEPORT 옵션이었어요!
이 옵션은 리눅스 커널 3.9 이상에서 지원되는데요, 이걸 설정하면 여러 개의 프로세스가 동일한 포트에 대해 동시에 LISTEN할 수 있게 됩니다.

int sock = socket(AF_INET, SOCK_STREAM, 0);
int opt = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));
  

이렇게 설정하면 커널이 들어오는 연결 요청을 여러 프로세스에 부하 분산해서 나눠주는 구조가 됩니다.
고성능 서버들이 이 방식을 많이 쓴다고 하더니, 직접 해보니 그 이유를 알겠더라고요.

✅ 결론 요약

항목 가능 여부 설명
기본적으로 중복 LISTEN 불가능
SO_REUSEADDR 사용 시 포트 재사용만 가능
SO_REUSEPORT 사용 시 부하 분산 방식으로 가능

✍️ 마무리하며

서버 구조를 설계하면서 이런 저런 시도를 해보는 것도 참 재밌는 경험이었어요.
혹시 여러분도 비슷한 이슈를 겪고 있다면 SO_REUSEPORT를 한번 시도해보세요. 생각보다 강력한 옵션입니다!