port demultiplexing

포트 번호는 OS의 소켓 테이블을 조회하는 키다

IP가 호스트와 인터페이스까지 패킷을 데려오면, 전송 계층은 프로토콜, 로컬 IP, 로컬 포트, 그리고 TCP 연결의 원격 끝점까지 보고 어떤 소켓에 넘길지 결정합니다.

incoming packet dst 10.0.0.5:443 TCP SYN 또는 datagram이 IP 계층을 지나 전송 계층으로 들어온다.
protocol TCP와 UDP 테이블은 별도다.
local endpoint 로컬 IP와 포트가 첫 조회 키다.
remote endpoint TCP 연결은 원격 IP:port까지 합쳐 식별된다.
socket table
LISTEN 0.0.0.0:443
ESTABLISHED 10.0.0.5:443 ↔ 203.0.113.7:51544
UDP 10.0.0.5:53
1. 프로토콜 TCP, UDP, ICMP처럼 상위 처리 루틴을 먼저 나눈다.
2. 로컬 포트 서버 프로세스가 바인딩한 포트와 비교한다.
3. 연결 상태 TCP는 LISTEN과 ESTABLISHED 경로가 갈라진다.
4. 전달 매칭된 소켓의 receive buffer로 데이터가 들어간다.
커널 demux 흐름

목적지 포트 하나가 아니라 연결 상태까지 본다

1 packet

패킷 도착

IP 계층이 목적지 IP가 로컬 인터페이스와 맞는지 먼저 확인합니다.

2 protocol

TCP/UDP 분기

같은 포트 번호라도 TCP 53과 UDP 53은 다른 소켓 공간입니다.

3 endpoint

local IP:port 조회

0.0.0.0:443처럼 모든 로컬 주소에 bind된 소켓도 후보가 됩니다.

4 state

LISTEN 또는 ESTABLISHED

새 SYN은 listen 소켓으로, 기존 데이터는 4-tuple이 맞는 연결 소켓으로 갑니다.

socket table

소켓 테이블에서 실제 수신 대상을 찾는다

상태 로컬 끝점 원격 끝점 매칭되는 패킷 전달 대상
TCP LISTEN 0.0.0.0:443 * 새 연결 SYN to 10.0.0.1:443 server socket
TCP ESTABLISHED 10.0.0.1:443 203.0.113.9:50234 기존 연결의 데이터 세그먼트 accepted socket
UDP BOUND 0.0.0.0:53 packet마다 다름 DNS datagram to UDP 53 datagram socket
0-1023

System / Well-known

HTTP 80, HTTPS 443, SSH 22, DNS 53처럼 표준 서비스가 주로 쓰는 낮은 포트입니다. Unix 계열에서는 바인드 권한 정책이 붙을 수 있습니다.

1024-49151

User / Registered

PostgreSQL 5432, Redis 6379처럼 애플리케이션이 등록하거나 관례적으로 쓰는 범위입니다.

49152-65535

Dynamic / Private

IANA 분류상 임시 포트 범위입니다. 실제 OS의 ephemeral range는 설정에 따라 이 범위와 다를 수 있습니다.