[[컴퓨터공학|컴퓨터 과학 & 공학
Computer Science & Engineering
]]- [ 펼치기 · 접기 ]
- ||<tablebgcolor=#fff,#1c1d1f><tablecolor=#373a3c,#ddd><colbgcolor=#0066DC><colcolor=white> 기반 학문 ||수학(해석학 · 이산수학 · 수리논리학 · 선형대수학 · 미적분학 · 미분방정식 · 대수학(환론 · 범주론) · 정수론) · 이론 컴퓨터 과학 · 암호학 · 전자공학 · 언어학(형태론 · 통사론 · 의미론 · 화용론 · 음운론) · 인지과학 ||
하드웨어 구성 SoC · CPU · GPU(그래픽 카드 · GPGPU) · ROM · RAM · SSD · HDD · 참조: 틀:컴퓨터 부품 기술 기계어 · 어셈블리어 · C/C++ · C# · Java · Python · 바이오스 · 절차적 프로그래밍 · 객체 지향 프로그래밍 · 해킹 · ROT13 · 일회용 비밀번호 · 사물인터넷 · 와이파이 · GPS · 임베디드 · 인공신경망 · OpenGL · EXIF · 마이크로아키텍처 · ACPI · UEFI · NERF · gRPC · 리버스 엔지니어링 · HCI · UI · UX · 대역폭 · DBMS · NoSQL · 해시(SHA · 브루트 포스 · 레인보우 테이블 · salt · 암호화폐) · RSA 암호화 · 하드웨어 가속 연구
및
기타논리 회로(보수기 · 가산기 · 논리 연산 · 불 대수 · 플립플롭) · 정보이론 · 임베디드 시스템 · 운영 체제 · 데이터베이스 · 프로그래밍 언어{컴파일러(어셈블러 · JIT) · 인터프리터 · 유형 이론 · 파싱 · 링커 · 난해한 프로그래밍 언어} · 메타데이터 · 기계학습 · 빅데이터 · 폰노이만 구조 · 양자컴퓨터 · 행위자 모델 · 인코딩(유니코드 · MBCS) · 네트워크 · 컴퓨터 보안 · OCR · 슈퍼컴퓨터 · 튜링 머신 · FPGA · 딥러닝 · 컴퓨터 구조론 · 컴퓨터 비전 · 컴퓨터 그래픽스 · 인공지능 · 시간 복잡도(최적화) · 소프트웨어 개발 방법론 · 디자인 패턴 · 정보처리이론 · 재귀 이론 · 자연어 처리(기계 번역 · 음성인식) · 버전 (버전 관리 시스템 · Git · GitHub · GitLab)
1. 개요
port / port number동일한 기기 내에서 독립적으로 실행되고 있는 프로세스들에 속한 개별 연결을 구분하고 다중화하기 위한 논리적 식별자.
2. 역사
네트워크 포트의 개념은 1970년대 초반 ARPANET의 초창기 개발자들에 의해 확립되었다. 다만 이때만 해도 포트 번호라는 용어는 아직 쓰이지 않았다. 아파넷은 NCP(Network Control Protocol)라는 사실상 현재 TCP/IP 프로토콜의 전신격 프로토콜을 사용했는데, 여기서는 40비트 크기의 소켓 번호(socket number)[1]라는 포맷을 사용한다. 맨 앞자리 32비트는 현재의 IPv4와 비슷한데, 맨 끝에 추가적인 8비트 영역이 있는 게 차이점. 이 자리를 추가 8비트 숫자(Another Eightbit Number), 줄여서 AEN으로 불렀다. 현재는 이 AEN을 네트워크 포트의 전신격으로 보고 있다. 당시 RFC 33을 보면 후술할 포트 멀티플렉싱 문제의 해결 과정과 매우 흡사함을 알 수 있다.[2]1972년 3월 26일 네트워크 측정 그룹(Network Measurement Group)이 빈트 처프(Vint Cerf)와 존 포스탈(Jon Postel) 박사에게 현재 각 호스트와 사용 중인 소켓 번호, 그리고 각 소켓 번호가 수행하는 기눙(function)을 카탈로그화할 것을 제안했고, # 이는 RFC 433으로 등록되었다. 즉, 최초의 (현재는 IANA가 하고 있는) 포트 레지스트리인 셈이다.
빈트 교수는 이어 1974년 RFC 675를 통해 TCP/IP 프로토콜을 제안하며 16비트 길이의 포트 번호 체계를 도입하게 되고, 이 표준이 현재 우리가 사용 중인 포트 표준이다.
3. 의의
일반인에겐 네트워크 식별자로 흔히 IP만 알려져 있고 대부분의 경우 잘 알려진(well-known) 포트 번호는 생략되기에 포트를 직접 알아야 할 일이 없다. 간혹 포트 포워딩을 하다 맞닥드리는 정도. 하지만 네트워킹과 네트워크 응용 프로그래밍에서 포트는 늘 IP와 함께 쌍으로 묶이는, IP만큼이나 중요한 개념 중 하나이다.가장 큰 쓰임새는 멀티 프로세싱이다. 웹 브라우저, 이메일 클라이언트, 온라인 게임 등 여러 네트워크 응용 프로그램을 동시에 실행하고 있는 한 컴퓨터를 생각해 보자. 기본적으로 각 컴퓨터는 하나의 IP를 부여받으므로 유저가 보고 있는 웹사이트 서버, 이메일 서버, 게임 서버 등과 같은 IP를 사용해 통신하게 될 것이다. 여기까진 큰 차질 없이 가능하지만 문제는 각 서버에서 받은 응답 패킷을 어느 프로세스로 보내줘야 하는지 알 수 없을 때 발생한다. 이를 해결하기 위해서 개별 프로세스가 연 커넥션마다 고유한 식별자를 부여하게 되는데 이게 바로 포트 번호이다. 이제 운영체제는 각 프로세스가 보낸 요청을 하나의 채널로 섞어서 호스트 IP를 통해 전송할 수 있게 되고, 마찬가지로 수신받은 여러 응답들을 구분해 알맞은 프로세스로 향하게(forward) 만들 수 있다. 이 때 전자를 멀티플렉싱(multiplexing, muxing), 후자를 디멀티플렉싱(demultiplexing)이라고 한다.
그냥 개별 프로세스마다 그때그때 IP를 할당하면 될 것 아닌가? 하고 생각할 수 있지만, 크게 두 가지 걸림돌이 있다. 첫째는 IP 주소가 정말 적다는 것이고, 둘째는 IP 할당 과정이 매우 느리고 복잡하다는 것이다. IP 주소 문제야 새로운 표준을 만드는 등 어떻게든 해결할 방법이 있어도, IP 주소 할당이 오래 걸린다는 문제는 해결하기 힘들다. DHCP 서버 수정과 캐시 갱신이 그렇게 오래 걸리나 의문이 들 수 있지만, 포트 할당은 매 네트워크 연결마다 이루어진다. 지금도 사용자의 컴퓨터에선 수십개에서 많게는 수백 개 내지의 휘발 포트(ephemeral ports)들이 클라이언트에 의해 할당(assign)되고 해제(free)되고 있다.[3]
4. 범위
TCP와 UDP에서 포트 번호를 나타내는 구간은 총 16비트로, 최대 65,536개이다.하지만 상술했다시피 요청을 주고 받을 때마다 매번 사용하는 포트가 바뀐다면, 정확히 어떤 포트로 요청해야 할지 요청을 보내기 전에 어떻게 알 수 있을까? 이 문제를 해결하기 위해 자주 쓰이는 서비스의 경우 서버는 특정 포트만 사용하기로 약속하고, 대부분의 경우 서버가 해당 포트에서 대기(listening)하고 있음을 가정한 뒤, 클라이언트 포트만 동적 포트(dynamic port) 또는 휘발 포트(ephemeral port)라고 불리는 범위 내에서 아무거라 골라 할당하게 된다.
그런데 또 어떤 서비스가 정확히 어떤 포트를 쓰는지 겹치면 어떻게 될까? 이런 문제를 미연에 방지하기 위해 IANA에서 등록된 포트 번호 목록을 관리하게 된다. 이중 포트 0번부터 포트 1023번까지는 특별히 따로 관리하는 시스템 포트로, 유저 포트와는 다르게 보통 시스템 관리자 권한이 필요하다. 결국, 포트 범위는 RFC 6335에 의해 아래와 같이 총 3구역으로 나뉘게 된다.[4]
종류 | 이명 | 범위 | 설명 |
시스템 포트 | 잘 알려진 포트(well-known ports) | 0~1023 | 대부분의 중요한 프로토콜 용도 |
유저 포트 | 등록된 포트(registered ports) | 1024~49151 | IANA에 의해 사용처가 등재된 포트 |
동적 포트 | 휘발 포트(ephemeral ports), 개인 포트(private ports) | 49152~65535 | 클라이언트용 단기 포트 |
5. 기술
5.1. 방화벽
자세한 내용은 방화벽 문서 참고하십시오.5.2. 포트 포워딩
port forwarding / port mappingNAT(network address translation) 기술의 일종으로, 주어진 사설망 안의 특정 호스트 및 해당 호스트의 특정 포트를 게이트웨이의 특정 포트와 매핑시키는 기술. 주로 라우터 단에서 이루어지나, 클라우드의 경우 가상 방화벽 구현체에서 수행되기도 한다.
흔히 실 서비스가 작동 중인 호스트가 비공개 서브넷 안에 들어가 있어 공인 IP로 직접 연결되지 않을 때 사용한다.
5.3. 포트 스캐닝
6. 목록
표준 |
비표준 |
예약 |
포트 번호 | TCP | UDP | 설명 |
80 | 표준 | HTTP |
7. 관련 문서
[1] 현재의 소켓 프로그래밍에서 말하는 소켓과는 어원이 같지만 살짝 뉘앙스가 다르다. 현대에 와선 소켓 프로그래밍은 대부분 유닉스 소켓처럼 IPC 기술만을 의미하는 편.[2] A major issue is how to refer to processes in a foreign HOST. Each HOST has some internal naming scheme, but these various schemes often are incompatible. Since it is not practical to impose a common internal process naming scheme, an intermediate name space was created with a separate portion of the name space given to each HOST. It is left to each HOST to map internal process identifiers into its name space.[3]
$ ss -tun
명령어로 현재 열려 있는 ephemeral ports를 전부 확인할 수 있다.[4] TCP, UDP, UDP-Lite, SCTP, and DCCP use 16-bit namespaces for their port number registries. The port registries for all of these transport protocols are subdivided into three ranges of numbers RFC1340