null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
포트(Port) — 하나의 IP에서 수천 개의 통신 채널을 분리하는 법
#network
#port
#tcp
#udp
#well-known
@devpc
|
2026-05-04 01:59:39
|
GET /api/v1/nodes/411?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
1
Calls
# 포트(Port) — 하나의 IP에서 수천 개의 통신 채널을 분리하는 법 ## 왜 포트가 필요한가 IP 주소는 네트워크에서 특정 **장치(호스트)** 를 식별한다. 그런데 하나의 장치에서 동시에 HTTP 서버, SSH 서버, NTP 클라이언트가 돌고 있다면 어떻게 구분할까? **포트(Port)** 가 이 역할을 한다. `IP:Port` 조합이 하나의 **엔드포인트**를 유일하게 식별한다. ``` 192.168.0.20:80 → HTTP 서버 192.168.0.20:22 → SSH 서버 192.168.0.20:123 → NTP 클라이언트 ``` --- ## 물리 포트 vs 논리 포트 두 개념을 혼용하지 말아야 한다. | 구분 | 설명 | |------|------| | **물리 포트** | 이더넷 케이블이 꽂히는 물리적 RJ-45 잭 | | **논리 포트** | TCP/UDP에서 프로세스/서비스를 식별하는 16bit 숫자 | 이 글에서 다루는 것은 **논리 포트**다. --- ## 포트 번호 분류 포트 번호는 16bit, 즉 **0 ~ 65535** 범위다. IANA(Internet Assigned Numbers Authority)가 세 구역으로 분류한다. | 분류 | 범위 | 설명 | |------|------|------| | **Well-known Port** | 0 ~ 1023 | 잘 알려진 서비스용. 권한 있는 프로세스만 바인딩 가능 | | **Registered Port** | 1024 ~ 49151 | 등록된 애플리케이션용. 일반 프로세스도 사용 가능 | | **Dynamic Port** | 49152 ~ 65535 | 클라이언트가 임시로 사용하는 포트 (ephemeral port) | ### 주요 Well-known 포트 | 포트 | 프로토콜 | 설명 | |------|---------|------| | 20, 21 | FTP | 파일 전송 | | 22 | SSH | 보안 원격 접속 | | 23 | Telnet | 비암호화 원격 접속 | | 53 | DNS | 도메인 이름 조회 | | 67, 68 | DHCP | IP 자동 할당 | | 80 | HTTP | 웹 | | 123 | NTP | 시간 동기화 | | 443 | HTTPS | 보안 웹 | | 502 | Modbus/TCP | 산업용 프로토콜 | ### 임베디드/자동차 Ethernet에서 자주 보이는 포트 | 포트 | 프로토콜 | 설명 | |------|---------|------| | 30490 | SOME/IP SD | 서비스 디스커버리 | | 30501+ | SOME/IP | 서비스별 동적 할당 | | 17725 | XCP on UDP | 캘리브레이션 (예시, 설정에 따라 다름) | --- ## Ephemeral Port — 클라이언트가 임시로 쓰는 포트 TCP 소켓 연결 시 클라이언트 측 포트는 OS가 자동으로 49152~65535 범위에서 할당한다. Wireshark를 보면 요청 패킷의 출발지 포트가 매번 다른 이유가 이것이다. ``` 클라이언트(MCU): 192.168.0.20:52341 → 서버: 192.168.0.1:80 [랜덤 ephemeral] [고정 well-known] ``` --- ## 소켓 프로그래밍에서의 포트 ```c // TCP 서버: 특정 포트 바인딩 int sock = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(8080), // 포트 8080 .sin_addr.s_addr = INADDR_ANY }; bind(sock, (struct sockaddr*)&addr, sizeof(addr)); listen(sock, 5); ``` ```c // UDP 멀티캐스트 수신 (SOME/IP SD) struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(30490), // SOME/IP SD 포트 .sin_addr.s_addr = INADDR_ANY }; ``` --- ## 정리 포트는 IP 통신에서 **프로세스 단위의 주소**다. 임베디드 소프트웨어에서 소켓을 열 때 포트 번호가 충돌하면 바인딩이 실패하고 서비스가 시작되지 않는다. 특히 SOME/IP 스택에서 서비스별 포트 할당 계획을 초기에 정해두지 않으면 나중에 충돌 디버깅에 시간을 쓰게 된다.
// COMMENTS
Newest First
ON THIS PAGE