9.8. 포트¶
IP 주소는 패킷이 어느 호스트 를 위한 것인지 알려줍니다. 현대의 호스트는 한 번에 여러 프로그램을 실행합니다. 웹 브라우저, 채팅 클라이언트, 화상 통화, 백업 작업 등이 있으며, 이들 각각이 패킷을 병렬로 송수신하고 있습니다. IP 계층은 이들을 구별할 방법이 없습니다. 그저 도착하는 모든 패킷을 “호스트”에게 넘길 뿐입니다. 무언가가 어느 패킷이 어느 프로그램에 속하는지 결정해야 합니다.
포트 번호 가 그 해답입니다. 전송 계층의 모든 패킷은 IP 헤더 외에 두 개의 추가 필드를 담고 있습니다. 소스 포트 와 목적지 포트 입니다. 각각은 16비트 정수이므로, 호스트당 65535개의 가능한 포트 번호가 있습니다. IP 주소와 결합되어, 포트는 호스트 내부 의 하나의 특정 엔드포인트, 즉 하나의 특정 프로그램의 특정 통신을 식별합니다.
여러 프로그램이 하나의 IP 주소를 공유합니다. 목적지 포트는 도착하는 각 패킷을 올바른 프로그램으로 라우팅합니다.¶
9.8.1. 잘 알려진 포트¶
처음 1024개의 포트 번호는 표준 서비스를 위해 관례적으로 예약되어 있습니다. 독자가 마주칠 몇 가지:
22 – SSH (암호화된 원격 로그인에 사용되는 Secure Shell 프로토콜).
53 – DNS, 도메인 이름 시스템 (이름과 DNS 에서 다룸).
80 – HTTP, 하이퍼텍스트 전송 프로토콜. 웹의 암호화되지 않은 프로토콜입니다.
123 – NTP, 네트워크 시간 프로토콜 (장치가 시간 서버로부터 시계를 맞추는 방법).
443 – HTTPS, 즉 TLS (Transport Layer Security, 인터넷 프로토콜을 위한 표준 암호화 래퍼) 위에서 전달되는 HTTP – 브라우저에서 자물쇠 아이콘을 표시하는 모든 웹 페이지의 기반이 되는 프로토콜입니다.
이 관례 덕분에 브라우저가 포트를 지정하지 않고도 http://example.com 에 연결할 수 있습니다. 80이 HTTP의 잘 알려진 포트이기 때문에 80을 가정하는 것입니다. 웹 서버에 연결하는 카메라도 동일하게 합니다.
1024 위의 포트 번호는 제한이 없으며 어떤 프로그램이든 점유할 수 있습니다. 데이터베이스 서버(PostgreSQL은 5432, MySQL은 3306), 애플리케이션 서버, 사용자 정의 프로토콜은 모두 상위 범위 어딘가에 위치합니다.
9.8.2. 임시 포트¶
서버는 알려진 포트에서 리스닝합니다. 클라이언트는 자신의 쪽에서 다른 포트를 사용하며, 나가는 연결마다 새로 고릅니다.
카메라가 포트 443의 웹 서버에 연결할 때, 통신은 다음 사이에서 이루어집니다
camera IP : <some-port> <--> server IP : 443
<some-port> 은 임시 포트(ephemeral port) 입니다. MicroPython이 높은 범위에서 사용되지 않는 번호를 골라 연결이 지속되는 동안 사용하고 그 후에 해제합니다. 스크립트는 어느 번호가 선택되었는지 신경 쓸 필요가 없습니다. 소켓 계층이 이를 처리합니다.
9.8.3. 리스닝 대 통신¶
포트가 하는 역할은 그것이 통신의 어느 쪽에 있는지에 따라 달라집니다. 두 가지 뚜렷한 경우:
리스닝 포트는 요청하지 않은 연결을 받기 원하는 프로그램에 속합니다. 프로그램은 MicroPython에게 “포트 80에서 나에게 주소가 지정된 모든 들어오는 패킷은 내 것이다”라고 알리고 기다립니다. 서버가 이렇게 합니다.
연결된 포트는 통신을 개시 하려는 프로그램에 속합니다. 프로그램은 임시 포트를 고르고(또는 MicroPython에게 고르도록 요청하고), 그것을 소스 포트로, 서버의 잘 알려진 포트를 목적지로 하여 패킷을 보내며, 통신의 나머지 부분 동안 동일한 포트 쌍을 사용합니다.
하나의 프로그램이 각 역할에 대해 서로 다른 포트를 잡으면서 두 가지를 동시에 할 수 있습니다. 카메라는 구성 사용자 인터페이스로부터의 인바운드 HTTP 연결을 위해 포트 8000에서 리스닝하는 동시에, 포트 443의 원격 서버로의 아웃바운드 HTTPS 연결을 잡을 수도 있습니다. 두 역할은 서로 간섭하지 않습니다. 각 통신은 전체 (src IP, src port, dst IP, dst port) 4중 쌍으로 식별되며, 두 통신이 동일한 4중 쌍을 공유하지 않습니다.
9.8.4. 포트가 열어주는 것¶
포트가 자리잡으면, 전송 계층은 마침내 프로그램 대 프로그램 전달 문제를 해결할 수 있습니다. 이제 패킷은 올바른 호스트 (IP 주소)뿐만 아니라 그 호스트 내부의 올바른 소켓 (포트 번호)으로 라우팅되기에 충분한 정보를 담고 있습니다.
다음 두 페이지는 그 주소 지정 위에서 전송 계층이 제공하는 두 가지 방식을 다룹니다. UDP (User Datagram Protocol – 각 패킷이 독립적이고, 보장이 없음)와 TCP (Transmission Control Protocol – 연결되고, 신뢰성 있고, 순서가 보장되는 스트림)입니다.