iBetter Books
수정

한 컴퓨터의 여러 대화 — 포트

지금 이 순간 여러분의 컴퓨터는 여러 대화를 동시에 나누고 있습니다. 브라우저는 웹 서버와 통신하고, 카카오톡은 메신저 서버와 이야기를 나누며, 백그라운드에서 클라우드 동기화가 조용히 진행됩니다. 이 모든 대화가 같은 IP 주소 하나를 공유합니다. 그런데 목적지에 도착한 패킷은 어떻게 "이건 브라우저용, 저건 카카오톡용"이라고 구분할까요. 이 문제를 해결하려고 만든 것이 포트 번호입니다.

포트가 없다면

IP 주소가 집의 주소라면 포트는 방 번호라는 비유를 많이 씁니다. 집 주소만 있고 방 번호가 없다면 우편물이 어느 방으로 가야 할지 알 수 없습니다. 여러 사람이 함께 사는 집에서 이름 없이 집 주소만 써서 편지를 보내는 것과 같습니다.

운영체제도 마찬가지입니다. 패킷이 들어오면 "이 패킷을 기다리는 프로세스가 누구냐"를 판단해야 합니다. IP 주소만으로는 어떤 프로세스에게 넘겨야 할지 알 수 없습니다. 그래서 패킷 헤더에 포트 번호를 추가합니다. 목적지 포트를 보면 운영체제는 그 번호를 기다리고 있는 프로세스를 즉시 찾아 패킷을 건넵니다.

포트 번호의 종류

포트 번호는 0부터 65535까지입니다. 16비트 숫자이므로 2의 16승, 즉 65536개를 표현할 수 있습니다. 이 범위는 세 구역으로 나뉩니다.

0번부터 1023번은 잘 알려진 포트(Well-Known Ports)입니다. 국제 기관이 특정 서비스에 공식 배정했습니다. HTTP는 80번, HTTPS는 443번, SSH는 22번, DNS는 53번이 여기에 속합니다. 운영체제는 1024번 미만 포트를 열려면 관리자 권한을 요구하는데, 이 번호들이 워낙 중요한 서비스들을 위해 예약되어 있기 때문입니다.

1024번부터 49151번은 등록된 포트입니다. 공식 예약은 아니지만 많이 쓰이는 서비스들이 자리를 잡았습니다. MySQL은 3306번, PostgreSQL은 5432번, Redis는 6379번을 씁니다.

49152번부터 65535번은 동적 포트 또는 임시 포트(Ephemeral Ports)입니다. 클라이언트가 서버에 연결할 때 운영체제가 이 범위에서 임시 번호를 자동으로 골라 씁니다. 브라우저가 웹 서버 80번 포트로 접속할 때 클라이언트 쪽 포트는 49234번 같은 임시 번호가 됩니다.

통신을 특정하는 다섯 가지 값

네트워크에서 연결 하나는 다음 다섯 가지 값으로 완전히 특정됩니다.

프로토콜 + 출발지 IP + 출발지 포트 + 목적지 IP + 목적지 포트

이 조합을 5-tuple이라 부릅니다. 같은 서버 IP의 80번 포트로 여러 브라우저 탭이 동시에 연결하더라도, 클라이언트 쪽 포트 번호가 제각각이므로 운영체제는 각 연결을 구분합니다. 면접에서 "웹 서버는 포트가 하나인데 어떻게 여러 클라이언트를 동시에 처리하나요"라는 질문이 나오면 이 5-tuple이 답입니다.

다음 절에서는 이 포트 위에서 실제 프로세스가 데이터를 주고받을 수 있게 해주는 추상, 소켓을 살펴봅니다.