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 – 연결되고, 신뢰성 있고, 순서가 보장되는 스트림)입니다.