포트 번호의 구조

포트 번호의 구조

포트 번호의 구조

1. 포트 번호란?

포트 번호 개념

┌─────────────────────────────────────────────────────────────┐
│                  포트 번호 (Port Number)                     │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  정의:                                                      │
│  • 0 ~ 65535 범위의 16비트 숫자                             │
│  • 같은 컴퓨터에서 실행되는 애플리케이션을 구분             │
│  • TCP/UDP 헤더에 포함                                      │
│                                                             │
│  역할:                                                      │
│  ─────────────────────────────────────────                  │
│  • IP 주소: "어떤 컴퓨터인가?"                              │
│  • 포트 번호: "컴퓨터 안의 어떤 프로그램인가?"              │
│                                                             │
│  비유:                                                      │
│  ─────────────────────────────────────────                  │
│  • IP 주소 = 아파트 주소 (예: 123-456번지)                 │
│  • 포트 번호 = 호수 (예: 101호, 202호)                      │
│                                                             │
│  예시:                                                      │
│  192.168.1.10:80                                            │
│  └──────┬─────┘ └┬┘                                        │
│     IP 주소     포트 번호                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

포트 번호의 필요성

┌─────────────────────────────────────────────────────────────┐
│              포트 번호가 없다면?                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  컴퓨터 (IP: 192.168.1.10)                                  │
│  ┌──────────────────────────────────────────────────────┐  │
│  │                                                      │  │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐          │  │
│  │  │웹브라우저│  │  이메일  │  │메신저앱 │          │  │
│  │  └──────────┘  └──────────┘  └──────────┘          │  │
│  │       │              │              │               │  │
│  │       └──────────────┴──────────────┘               │  │
│  │                      ↓                              │  │
│  │              데이터가 도착했는데...                  │  │
│  │              어디로 보내야 하지? ✗                  │  │
│  │                                                      │  │
│  └──────────────────────────────────────────────────────┘  │
│                                                             │
│  → IP 주소만으로는 애플리케이션 구분 불가!                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│              포트 번호가 있다면!                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  컴퓨터 (IP: 192.168.1.10)                                  │
│  ┌──────────────────────────────────────────────────────┐  │
│  │                                                      │  │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐          │  │
│  │  │웹브라우저│  │  이메일  │  │메신저앱 │          │  │
│  │  │포트 52341│  │포트 52342│  │포트 52343│          │  │
│  │  └────┬─────┘  └────┬─────┘  └────┬─────┘          │  │
│  │       │              │              │               │  │
│  │       └──────────────┴──────────────┘               │  │
│  │                      ↓                              │  │
│  │         [전송 계층 - 포트 번호로 구분]               │  │
│  │                      ↓                              │  │
│  │    52341로 온 데이터 → 웹브라우저 ✓                │  │
│  │    52342로 온 데이터 → 이메일 ✓                    │  │
│  │    52343로 온 데이터 → 메신저앱 ✓                  │  │
│  │                                                      │  │
│  └──────────────────────────────────────────────────────┘  │
│                                                             │
│  → 포트 번호로 정확한 애플리케이션에 전달!                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

2. 포트 번호의 구조

16비트 구조

┌─────────────────────────────────────────────────────────────┐
│                  포트 번호 16비트 구조                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   비트: 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0    │
│        ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐                  │
│        │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │                  │
│        └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘                  │
│                                                             │
│   범위: 0 ~ 65535 (2^16 - 1)                                │
│                                                             │
│   예시:                                                     │
│   • 포트 80 (HTTP):                                         │
│     0000 0000 0101 0000 (2진수)                             │
│                                                             │
│   • 포트 443 (HTTPS):                                       │
│     0000 0001 1011 1011 (2진수)                             │
│                                                             │
│   • 포트 3306 (MySQL):                                      │
│     0000 1100 1110 1010 (2진수)                             │
│                                                             │
└─────────────────────────────────────────────────────────────┘

포트 번호 분류

┌─────────────────────────────────────────────────────────────┐
│                  포트 번호 범위와 분류                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  전체 범위: 0 ~ 65535                                       │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 0        1024                  49152          65535 │   │
│  ├──────────┼──────────────────────┼─────────────────┤   │
│  │Well-Known│    Registered        │    Dynamic      │   │
│  │  Ports   │      Ports           │  (Private) Ports│   │
│  └──────────┴──────────────────────┴─────────────────┘   │
│                                                             │
│                                                             │
│  1. Well-Known Ports (0 ~ 1023)                             │
│  ─────────────────────────────────────────                  │
│     • IANA (Internet Assigned Numbers Authority)가 관리     │
│     • 잘 알려진 서비스/프로토콜에 할당                      │
│     • 시스템 포트 (System Ports)라고도 함                   │
│     • 보통 관리자 권한 필요 (Unix/Linux)                    │
│                                                             │
│     예시:                                                   │
│     - 20, 21 : FTP                                          │
│     - 22     : SSH                                          │
│     - 25     : SMTP                                         │
│     - 53     : DNS                                          │
│     - 80     : HTTP                                         │
│     - 443    : HTTPS                                        │
│                                                             │
│                                                             │
│  2. Registered Ports (1024 ~ 49151)                         │
│  ─────────────────────────────────────────                  │
│     • IANA에 등록된 포트                                    │
│     • 특정 서비스나 애플리케이션이 사용                     │
│     • User Ports라고도 함                                   │
│     • 일반 사용자도 사용 가능                               │
│                                                             │
│     예시:                                                   │
│     - 3306  : MySQL                                         │
│     - 3389  : RDP (Remote Desktop)                          │
│     - 5432  : PostgreSQL                                    │
│     - 8080  : HTTP 대체 포트                                │
│     - 27017 : MongoDB                                       │
│                                                             │
│                                                             │
│  3. Dynamic/Private Ports (49152 ~ 65535)                   │
│  ─────────────────────────────────────────                  │
│     • 동적 포트, 임시 포트 (Ephemeral Ports)                │
│     • 클라이언트가 서버 연결 시 자동으로 할당               │
│     • IANA에 등록되지 않음                                  │
│     • 운영체제가 자동으로 관리                              │
│                                                             │
│     사용 예:                                                │
│     - 웹 브라우저가 웹 서버 접속 시                         │
│     - 임시로 52341번 같은 포트 할당                         │
│                                                             │
│                                                             │
│  참고: 실제 동적 포트 범위는 OS마다 다름                    │
│  ─────────────────────────────────────────                  │
│  • Linux: 32768 ~ 60999                                     │
│  • Windows: 49152 ~ 65535                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

3. 주요 포트 번호

Well-Known Ports 상세

┌─────────────────────────────────────────────────────────────┐
│              주요 Well-Known Ports (0-1023)                  │
├──────────┬──────────────────┬───────────────────────────────┤
│포트 번호 │   프로토콜/서비스 │        설명                   │
├──────────┼──────────────────┼───────────────────────────────┤
│    20    │ FTP-DATA         │ FTP 데이터 전송               │
│    21    │ FTP              │ FTP 제어 (명령)               │
├──────────┼──────────────────┼───────────────────────────────┤
│    22    │ SSH              │ 보안 셸 (원격 접속)           │
├──────────┼──────────────────┼───────────────────────────────┤
│    23    │ Telnet           │ 원격 터미널 (비보안)          │
├──────────┼──────────────────┼───────────────────────────────┤
│    25    │ SMTP             │ 이메일 전송                   │
├──────────┼──────────────────┼───────────────────────────────┤
│    53    │ DNS              │ 도메인 이름 시스템            │
├──────────┼──────────────────┼───────────────────────────────┤
│    67    │ DHCP (Server)    │ DHCP 서버                     │
│    68    │ DHCP (Client)    │ DHCP 클라이언트               │
├──────────┼──────────────────┼───────────────────────────────┤
│    80    │ HTTP             │ 웹 (Hyper Text Transfer)      │
├──────────┼──────────────────┼───────────────────────────────┤
│   110    │ POP3             │ 이메일 수신                   │
├──────────┼──────────────────┼───────────────────────────────┤
│   143    │ IMAP             │ 이메일 수신 (고급)            │
├──────────┼──────────────────┼───────────────────────────────┤
│   443    │ HTTPS            │ 보안 웹 (SSL/TLS)             │
├──────────┼──────────────────┼───────────────────────────────┤
│   465    │ SMTPS            │ 보안 이메일 전송              │
├──────────┼──────────────────┼───────────────────────────────┤
│   993    │ IMAPS            │ 보안 IMAP                     │
├──────────┼──────────────────┼───────────────────────────────┤
│   995    │ POP3S            │ 보안 POP3                     │
└──────────┴──────────────────┴───────────────────────────────┘

Registered Ports 주요 예시

┌─────────────────────────────────────────────────────────────┐
│            주요 Registered Ports (1024-49151)                │
├──────────┬──────────────────┬───────────────────────────────┤
│포트 번호 │   프로토콜/서비스 │        설명                   │
├──────────┼──────────────────┼───────────────────────────────┤
│   1433   │ MS SQL Server    │ Microsoft SQL Server          │
├──────────┼──────────────────┼───────────────────────────────┤
│   1521   │ Oracle           │ Oracle Database               │
├──────────┼──────────────────┼───────────────────────────────┤
│   3306   │ MySQL            │ MySQL Database                │
├──────────┼──────────────────┼───────────────────────────────┤
│   3389   │ RDP              │ 원격 데스크톱 (Windows)       │
├──────────┼──────────────────┼───────────────────────────────┤
│   5432   │ PostgreSQL       │ PostgreSQL Database           │
├──────────┼──────────────────┼───────────────────────────────┤
│   5900   │ VNC              │ Virtual Network Computing     │
├──────────┼──────────────────┼───────────────────────────────┤
│   6379   │ Redis            │ Redis 인메모리 DB             │
├──────────┼──────────────────┼───────────────────────────────┤
│   8080   │ HTTP-Alt         │ HTTP 대체 포트                │
├──────────┼──────────────────┼───────────────────────────────┤
│   8443   │ HTTPS-Alt        │ HTTPS 대체 포트               │
├──────────┼──────────────────┼───────────────────────────────┤
│   9200   │ Elasticsearch    │ Elasticsearch REST API        │
├──────────┼──────────────────┼───────────────────────────────┤
│  27017   │ MongoDB          │ MongoDB Database              │
└──────────┴──────────────────┴───────────────────────────────┘

4. 소켓 (Socket) 개념

IP 주소 + 포트 번호 = 소켓

┌─────────────────────────────────────────────────────────────┐
│                    소켓 (Socket)                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  정의:                                                      │
│  • IP 주소 + 포트 번호의 조합                               │
│  • 네트워크 통신의 종단점 (Endpoint)                        │
│  • 통신하는 두 프로그램을 연결하는 가상의 연결점            │
│                                                             │
│  표기법:                                                    │
│  IP주소:포트번호                                            │
│                                                             │
│  예시:                                                      │
│  192.168.1.10:80                                            │
│  └───────┬────┘ └┬┘                                        │
│       IP 주소   포트                                        │
│                                                             │
│  172.16.0.5:8080                                            │
│  142.250.185.78:443                                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│                     통신 예시                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  웹 브라우저 → 웹 서버 접속                                 │
│                                                             │
│  [클라이언트]                          [서버]               │
│  192.168.1.10:52341      →       142.250.185.78:80          │
│  └────────┬─────────┘            └────────┬──────┘          │
│        소켓 1                            소켓 2              │
│                                                             │
│  • 소켓 1: 출발지 (Source Socket)                           │
│  • 소켓 2: 목적지 (Destination Socket)                      │
│                                                             │
│  → 두 소켓이 연결되어 통신 수행                             │
│                                                             │
└─────────────────────────────────────────────────────────────┘


통신 쌍 (Connection Pair):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

(출발지 IP:포트, 목적지 IP:포트)의 4개 값으로 연결 식별

예시:
(192.168.1.10:52341, 142.250.185.78:80)
(192.168.1.10:52342, 142.250.185.78:80)
(192.168.1.10:52343, 172.217.175.46:443)

→ 같은 서버(IP)에 접속해도 클라이언트 포트가 다르면
  별개의 연결로 구분!

5. 동적 포트 할당

클라이언트 포트 자동 할당

┌─────────────────────────────────────────────────────────────┐
│                   동적 포트 할당 과정                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  웹 브라우저로 google.com 접속 예시:                        │
│                                                             │
│  Step 1: 사용자가 브라우저에 URL 입력                       │
│  ─────────────────────────────────────────                  │
│  https://www.google.com                                     │
│                                                             │
│                                                             │
│  Step 2: OS가 자동으로 임시 포트 할당                       │
│  ─────────────────────────────────────────                  │
│  ┌──────────────────┐                                       │
│  │  웹 브라우저     │                                       │
│  ├──────────────────┤                                       │
│  │ "구글 접속할래!" │                                       │
│  └────────┬─────────┘                                       │
│           ↓                                                 │
│  ┌────────────────────────────────────────┐                 │
│  │       운영체제 (네트워크 스택)         │                 │
│  │                                        │                 │
│  │  사용 가능한 포트 검색...              │                 │
│  │  • 52341번 확인 → 사용 중             │                 │
│  │  • 52342번 확인 → 사용 안 함 ✓       │                 │
│  │                                        │                 │
│  │  → 52342번 할당!                      │                 │
│  └────────┬───────────────────────────────┘                 │
│           ↓                                                 │
│  ┌──────────────────┐                                       │
│  │  웹 브라우저     │                                       │
│  │  192.168.1.10    │                                       │
│  │  포트: 52342     │ ← 자동 할당됨!                       │
│  └──────────────────┘                                       │
│                                                             │
│                                                             │
│  Step 3: 서버로 연결 요청                                   │
│  ─────────────────────────────────────────                  │
│  [클라이언트]                    [서버]                     │
│  192.168.1.10:52342        142.250.185.78:443               │
│         │                         │                         │
│         │── SYN (연결 요청) ─────→│                         │
│         │                         │                         │
│         │←─── SYN+ACK ────────────│                         │
│         │                         │                         │
│         │─── ACK ────────────────→│                         │
│         │                         │                         │
│         │  연결 성공!              │                         │
│                                                             │
│                                                             │
│  Step 4: 연결 종료 후 포트 반환                             │
│  ─────────────────────────────────────────                  │
│  • 웹 페이지 로딩 완료                                      │
│  • 연결 종료 (4-Way Handshake)                              │
│  • 포트 52342번 반환                                        │
│  • 다른 애플리케이션이 재사용 가능                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

포트 할당 과정 상세

┌─────────────────────────────────────────────────────────────┐
│              클라이언트의 동적 포트 할당                     │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  OS의 포트 관리:                                            │
│                                                             │
│  사용 가능 포트 풀 (Pool):                                  │
│  ┌──────────────────────────────────────────────────────┐  │
│  │  49152  49153  49154  ...  52341  52342  ...  65535 │  │
│  │   ✓      ✓      ✗           ✗      ✓          ✓    │  │
│  │  사용   사용   사용중       사용중  사용      사용   │  │
│  │  가능   가능                        가능     가능    │  │
│  └──────────────────────────────────────────────────────┘  │
│                                                             │
│                                                             │
│  할당 알고리즘:                                             │
│  ─────────────────────────────────────────                  │
│                                                             │
│  1. 순차 할당 (일부 OS)                                     │
│     • 49152 → 49153 → 49154 → ...                          │
│     • 예측 가능 (보안상 약점)                               │
│                                                             │
│  2. 랜덤 할당 (대부분 최신 OS)                              │
│     • 무작위로 선택                                         │
│     • 보안 강화                                             │
│     • 포트 스캔 공격 방어                                   │
│                                                             │
│                                                             │
│  여러 연결 시:                                              │
│  ─────────────────────────────────────────                  │
│                                                             │
│  같은 서버에 동시 접속:                                     │
│  • 브라우저 탭 1: 192.168.1.10:52341 → google.com:443       │
│  • 브라우저 탭 2: 192.168.1.10:52342 → google.com:443       │
│  • 브라우저 탭 3: 192.168.1.10:52343 → google.com:443       │
│                                                             │
│  → 클라이언트 포트가 다르므로 별개의 연결!                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

6. TCP/UDP 헤더의 포트 번호

TCP 헤더에서의 포트

┌─────────────────────────────────────────────────────────────┐
│                     TCP 헤더 구조                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   비트: 0                   16                  31          │
│        ├────────────────────┼────────────────────┤          │
│     0  │  ┌──────────────────────────────────┐  │          │
│        │  │  출발지 포트 (Source Port)       │  │          │
│        │  │        16비트                    │  │ ← 여기! │
│        │  └──────────────────────────────────┘  │          │
│        ├────────────────────┼────────────────────┤          │
│        │  ┌──────────────────────────────────┐  │          │
│        │  │  목적지 포트 (Destination Port)  │  │          │
│        │  │        16비트                    │  │ ← 여기! │
│        │  └──────────────────────────────────┘  │          │
│        ├─────────────────────────────────────────┤          │
│    32  │      순서 번호 (Sequence Number)        │          │
│        │             (32비트)                    │          │
│        ├─────────────────────────────────────────┤          │
│    64  │    확인 응답 번호 (ACK Number)          │          │
│        │             (32비트)                    │          │
│        ├────┬──────┬────┬────────────────────────┤          │
│    96  │헤더│예약  │플래그│   윈도우 크기         │          │
│        │길이│(6bit)│(6bit)│   (16비트)           │          │
│        └────┴──────┴────┴────────────────────────┘          │
│                                                             │
│  출발지 포트 (16비트):                                      │
│  • 송신측 애플리케이션의 포트 번호                          │
│  • 0 ~ 65535 범위                                           │
│                                                             │
│  목적지 포트 (16비트):                                      │
│  • 수신측 애플리케이션의 포트 번호                          │
│  • 0 ~ 65535 범위                                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘

UDP 헤더에서의 포트

┌─────────────────────────────────────────────────────────────┐
│                     UDP 헤더 구조                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   비트: 0                   16                  31          │
│        ├────────────────────┼────────────────────┤          │
│     0  │  출발지 포트        │  목적지 포트        │          │
│        │   (16비트)         │   (16비트)         │          │
│        ├────────────────────┼────────────────────┤          │
│    32  │  길이 (16비트)     │ 체크섬 (16비트)    │          │
│        ├────────────────────┴────────────────────┤          │
│    64  │              데이터                     │          │
│        │               ...                       │          │
│        └─────────────────────────────────────────┘          │
│                                                             │
│  • TCP보다 헤더가 간단 (8바이트 고정)                       │
│  • 포트 번호 필드는 동일 (각 16비트)                        │
│  • 출발지 포트는 선택사항 (0으로 설정 가능)                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

7. 실무 활용

포트 확인 명령어

Windows에서 포트 확인:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. 모든 포트 연결 상태 확인
> netstat -an

활성 연결

  프로토콜  로컬 주소              외부 주소              상태
  TCP       0.0.0.0:80             0.0.0.0:0              LISTENING
  TCP       0.0.0.0:443            0.0.0.0:0              LISTENING
  TCP       192.168.1.10:52341     142.250.185.78:443     ESTABLISHED
  TCP       192.168.1.10:52342     20.189.173.1:443       TIME_WAIT


2. 프로세스 정보 포함
> netstat -ano

  프로토콜  로컬 주소              외부 주소              상태       PID
  TCP       0.0.0.0:80             0.0.0.0:0              LISTENING  4
  TCP       192.168.1.10:52341     142.250.185.78:443     ESTABLISHED 5678


3. 특정 포트 확인
> netstat -an | findstr ":80"
> netstat -an | findstr "LISTEN"


4. 특정 포트 사용 프로세스 확인
> netstat -ano | findstr ":80"
> tasklist /FI "PID eq 1234"


Linux에서 포트 확인:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. 모든 포트 연결 상태 (ss 명령어 - 권장)
$ ss -tuln

Netid  State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port
tcp    LISTEN  0       128     0.0.0.0:80          0.0.0.0:*
tcp    LISTEN  0       128     0.0.0.0:443         0.0.0.0:*
tcp    ESTAB   0       0       192.168.1.10:52341  142.250.185.78:443


2. 프로세스 정보 포함
$ ss -tulnp

tcp   LISTEN  0  128  0.0.0.0:80   0.0.0.0:*   users:(("nginx",pid=1234,fd=6))


3. netstat 명령어 (전통적)
$ netstat -tuln
$ netstat -tulnp    # 프로세스 정보 포함


4. 특정 포트 확인
$ ss -tuln | grep :80
$ lsof -i :80       # 포트 80 사용 프로세스


5. LISTEN 중인 포트만
$ ss -tln
$ netstat -tln

포트 사용 예시

┌─────────────────────────────────────────────────────────────┐
│                   실제 통신 예시                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  웹 브라우저로 3개 사이트 동시 접속:                        │
│                                                             │
│  [내 컴퓨터: 192.168.1.10]                                  │
│  ┌──────────────────────────────────────────────────────┐  │
│  │                                                      │  │
│  │  ┌────────────┐  ┌────────────┐  ┌────────────┐    │  │
│  │  │구글 탭     │  │유튜브 탭   │  │깃허브 탭   │    │  │
│  │  │포트: 52341 │  │포트: 52342 │  │포트: 52343 │    │  │
│  │  └─────┬──────┘  └─────┬──────┘  └─────┬──────┘    │  │
│  │        │               │               │           │  │
│  └────────┼───────────────┼───────────────┼───────────┘  │
│           │               │               │              │
│           ↓               ↓               ↓              │
│                                                             │
│  연결 1: 192.168.1.10:52341 → 142.250.185.78:443 (Google)  │
│  연결 2: 192.168.1.10:52342 → 142.250.142.91:443 (YouTube) │
│  연결 3: 192.168.1.10:52343 → 140.82.114.4:443 (GitHub)    │
│                                                             │
│  → 클라이언트 포트가 다르므로 각각 독립된 연결!             │
│                                                             │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│              서버 입장에서 본 포트                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  [웹 서버: 203.0.113.50]                                    │
│  ┌──────────────────────────────────────────────────────┐  │
│  │                                                      │  │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐          │  │
│  │  │ 웹 서버  │  │메일 서버 │  │ FTP 서버 │          │  │
│  │  │포트: 80  │  │포트: 25  │  │포트: 21  │          │  │
│  │  └────┬─────┘  └────┬─────┘  └────┬─────┘          │  │
│  │       │             │             │                │  │
│  │       └─────────────┴─────────────┘                │  │
│  │                     ↑                              │  │
│  │          [전송 계층이 포트로 구분]                 │  │
│  │                                                      │  │
│  └──────────────────────────────────────────────────────┘  │
│           ↑             ↑             ↑                    │
│     포트 80 요청   포트 25 요청   포트 21 요청             │
│                                                             │
│  • 포트 80: 웹 서버로 전달                                  │
│  • 포트 25: 메일 서버로 전달                                │
│  • 포트 21: FTP 서버로 전달                                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

8. 포트 관련 문제와 해결

포트 충돌 (Port Conflict)

┌─────────────────────────────────────────────────────────────┐
│                    포트 충돌 문제                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  문제 상황:                                                 │
│  • 같은 포트를 두 프로그램이 동시에 사용하려 할 때          │
│  • "Address already in use" 오류 발생                       │
│                                                             │
│                                                             │
│  예시:                                                      │
│  ─────────────────────────────────────────                  │
│                                                             │
│  1. Apache 웹 서버가 80번 포트 사용 중                      │
│  2. Nginx를 80번 포트로 시작하려 함                         │
│                                                             │
│  ┌─────────────┐                                            │
│  │   Apache    │                                            │
│  │  포트: 80   │ ✓ 사용 중                                 │
│  └─────────────┘                                            │
│                                                             │
│  ┌─────────────┐                                            │
│  │   Nginx     │                                            │
│  │  포트: 80   │ ✗ 시작 실패!                              │
│  └─────────────┘                                            │
│                                                             │
│  오류 메시지:                                               │
│  "bind() to 0.0.0.0:80 failed (98: Address already in use)"│
│                                                             │
│                                                             │
│  해결 방법:                                                 │
│  ─────────────────────────────────────────                  │
│                                                             │
│  1. 기존 프로그램 종료                                      │
│     Windows:                                                │
│     > netstat -ano | findstr :80                            │
│     > taskkill /PID 1234 /F                                 │
│                                                             │
│     Linux:                                                  │
│     $ lsof -i :80                                           │
│     $ kill -9 1234                                          │
│                                                             │
│                                                             │
│  2. 다른 포트 사용                                          │
│     • Nginx를 8080번 포트로 설정                            │
│                                                             │
│     ┌─────────────┐  ┌─────────────┐                       │
│     │   Apache    │  │   Nginx     │                       │
│     │  포트: 80   │  │  포트: 8080 │ 둘 다 실행 가능!      │
│     └─────────────┘  └─────────────┘                       │
│                                                             │
│                                                             │
│  3. TIME_WAIT 상태 대기                                     │
│     • 서버 재시작 시 TIME_WAIT로 포트가 일시적으로 점유     │
│     • 1~2분 대기 후 재시도                                  │
│     • 또는 SO_REUSEADDR 옵션 사용                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘

방화벽과 포트

┌─────────────────────────────────────────────────────────────┐
│                    방화벽 포트 제어                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  방화벽의 역할:                                             │
│  • 특정 포트를 열거나 차단                                  │
│  • 보안을 위한 접근 제어                                    │
│                                                             │
│                                                             │
│  예시: 웹 서버 방화벽 설정                                  │
│  ─────────────────────────────────────────                  │
│                                                             │
│  [인터넷]                      [방화벽]           [서버]    │
│     │                             │                │        │
│     │── 포트 80 요청 ─────────→  │  허용 ✓       │        │
│     │                             ├───────────────→│        │
│     │                             │                │        │
│     │── 포트 22 요청 ─────────→  │  차단 ✗       │        │
│     │                             ╳                │        │
│     │                                              │        │
│                                                             │
│                                                             │
│  Windows 방화벽 포트 열기:                                  │
│  ─────────────────────────────────────────                  │
│                                                             │
│  > netsh advfirewall firewall add rule                     │
│      name="HTTP Port 80"                                    │
│      dir=in                                                 │
│      action=allow                                           │
│      protocol=TCP                                           │
│      localport=80                                           │
│                                                             │
│                                                             │
│  Linux 방화벽 포트 열기 (firewalld):                        │
│  ─────────────────────────────────────────                  │
│                                                             │
│  $ firewall-cmd --permanent --add-port=80/tcp               │
│  $ firewall-cmd --reload                                    │
│                                                             │
│                                                             │
│  Linux 방화벽 포트 열기 (ufw):                              │
│  ─────────────────────────────────────────                  │
│                                                             │
│  $ ufw allow 80/tcp                                         │
│  $ ufw enable                                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

보안 고려사항

┌─────────────────────────────────────────────────────────────┐
│                  포트 보안 Best Practice                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 불필요한 포트 닫기                                      │
│  ─────────────────────────────────────────                  │
│     • 사용하지 않는 서비스는 중지                           │
│     • 포트 스캔으로 열린 포트 확인                          │
│                                                             │
│     $ nmap -p- localhost     # 모든 포트 스캔              │
│                                                             │
│                                                             │
│  2. 잘 알려진 포트 변경 (Security by Obscurity)             │
│  ─────────────────────────────────────────                  │
│     • SSH 22번 → 2222번 변경                                │
│     • 완벽한 보안은 아니지만 자동화된 공격 방어             │
│                                                             │
│     나쁜 예: SSH 22번 (기본)                                │
│     좋은 예: SSH 2222번 + 키 인증                           │
│                                                             │
│                                                             │
│  3. 외부 접근 제한                                          │
│  ─────────────────────────────────────────                  │
│     • 관리 포트는 특정 IP만 허용                            │
│     • 로컬호스트에서만 접근 허용                            │
│                                                             │
│     예: MySQL은 127.0.0.1:3306만 허용                       │
│         (외부 직접 접근 차단)                               │
│                                                             │
│                                                             │
│  4. 포트 노킹 (Port Knocking)                               │
│  ─────────────────────────────────────────                  │
│     • 특정 순서로 포트를 두드려야 포트 개방                 │
│     • 예: 7000, 8000, 9000 순서로 접근 → SSH 22번 개방     │
│                                                             │
│                                                             │
│  5. 정기적인 포트 감사                                      │
│  ─────────────────────────────────────────                  │
│     • 주기적으로 열린 포트 점검                             │
│     • 불필요하게 노출된 포트 발견                           │
│                                                             │
│     $ netstat -tuln | grep LISTEN                          │
│     $ ss -tuln                                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

핵심 정리

개념설명
포트 번호0~65535 범위의 16비트 숫자, 애플리케이션 식별
Well-Known Ports0~1023, 잘 알려진 서비스용 (HTTP:80, HTTPS:443)
Registered Ports1024~49151, 등록된 애플리케이션용 (MySQL:3306)
Dynamic Ports49152~65535, 클라이언트가 임시로 사용
소켓IP 주소 + 포트 번호 조합 (예: 192.168.1.10:80)
동적 포트 할당OS가 클라이언트에게 자동으로 포트 할당
포트 충돌같은 포트를 여러 프로그램이 사용하려 할 때 발생

포트 번호 요약

┌─────────────────────────────────────────────────────────────┐
│                   포트 번호 핵심 개념                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 포트 번호 = 애플리케이션 구분자                         │
│     ─────────────────────────────────────────               │
│     • IP: 컴퓨터 찾기                                       │
│     • Port: 프로그램 찾기                                   │
│                                                             │
│  2. 16비트 = 0~65535                                        │
│     ─────────────────────────────────────────               │
│     • 0~1023: 시스템 예약 (HTTP, HTTPS, SSH 등)            │
│     • 1024~49151: 애플리케이션 등록                         │
│     • 49152~65535: 동적 할당 (클라이언트)                   │
│                                                             │
│  3. 소켓 = IP + Port                                        │
│     ─────────────────────────────────────────               │
│     • 통신의 양 끝점                                        │
│     • 예: 192.168.1.10:52341                                │
│                                                             │
│  4. 서버는 고정 포트, 클라이언트는 동적 포트                │
│     ─────────────────────────────────────────               │
│     • 서버: 80, 443 등 고정                                 │
│     • 클라이언트: OS가 자동 할당 (52341 등)                 │
│                                                             │
│                                                             │
│  통신 예시:                                                 │
│  ─────────────────────────────────────────                  │
│                                                             │
│  [클라이언트]                      [서버]                   │
│  192.168.1.10:52341          203.0.113.50:80                │
│  └────────┬─────────┘        └────────┬──────┘              │
│      동적 할당                     고정 포트                │
│                                                             │
│  → 두 소켓이 연결되어 HTTP 통신!                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

주요 명령어 정리

포트 확인:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Windows:
> netstat -an               # 모든 연결
> netstat -ano              # PID 포함
> netstat -an | findstr ":80"  # 특정 포트

Linux:
$ ss -tuln                  # 모든 연결
$ ss -tulnp                 # 프로세스 포함
$ lsof -i :80               # 포트 80 사용 프로세스
$ netstat -tuln             # 전통적 방식


포트 사용 프로세스 확인:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Windows:
> netstat -ano | findstr ":80"
> tasklist /FI "PID eq 1234"

Linux:
$ lsof -i :80
$ fuser 80/tcp


테스트:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

$ telnet [host] [port]      # 포트 연결 테스트
$ nc -zv [host] [port]      # 포트 스캔
$ nmap -p 80 [host]         # 포트 확인

용어 정리

  • 포트 번호 (Port Number): 0~65535 범위의 16비트 숫자로 애플리케이션을 구분
  • Well-Known Ports: 0~1023 범위, 잘 알려진 서비스용 포트
  • Registered Ports: 1024~49151 범위, 등록된 애플리케이션용
  • Dynamic Ports (Ephemeral Ports): 49152~65535 범위, 임시 포트
  • 소켓 (Socket): IP 주소와 포트 번호의 조합 (예: 192.168.1.10:80)
  • 출발지 포트 (Source Port): 데이터를 보내는 측의 포트 번호
  • 목적지 포트 (Destination Port): 데이터를 받는 측의 포트 번호
  • 동적 포트 할당: 운영체제가 클라이언트에게 자동으로 포트 번호를 할당하는 과정
  • 포트 충돌 (Port Conflict): 같은 포트를 여러 프로그램이 동시에 사용하려 할 때 발생하는 문제