[혼자 공부하는 네트워크]Chapter 4 - 1 전송 계층 개요 : IP의 한계와 포트
IP의 한계와 포트
IP는 신뢰할 수 없는 통신과 비연결성 통신을 수행한다는 한계가 있다. 전송계층은 이런 한계를 극복하고, 포트 번호를 통해 응용 계층의 애플리케이션 프로세스들을 식별하는 역할을 수행한다.
신뢰할 수 없는 통신
IP는 크게 IP 단편화와 IP 주소지정을 한다고 했는데, 이것 외에도 두 가지 특징이 있다.
- 신뢰할 수 없는(비신뢰성) 프로토콜 : IP 프로토콜이 패킷이 수신지까지 제대로 전송되었음을 보장하지 않는다.
- 비연결성 프로토콜 : 송수신 호스트 간에 사전 연결 수립 작업을 거치지 않는다.
IP가 이런 특징을 가지고 있는 이유는 성능 때문이다. 패킷이 제대로 전송되었음을 처리하는 작업과 호스트 간에 연결을 수립하는 작업은 패킷의 빠른 송수신과는 배치되는 작업이기 때문이다.
IP의 한계를 보완하는 전송 계층
전송 계층이 IP의 한계를 어떻게 보완하는지 알아보자.
- 전송 계층은 연결형 통신을 가능하게 한다.
- 연결형 통신을 지원하는 대표적인 전송 프로토콜로 TCP가 있다. TCP는 정보를 주고받기 전에 연결을 수립한다. 송수신하는 동안에는 연결을 유지하다가 송수신이 끝나면 연결을 종료한다.
- 전송 계층은 신뢰성 있는 통신을 가능하게 한다.
- 패킷이 수신지까지 올바른 순서대로 확실히 전달되는 것을 보장한다. 다만 성능이 떨어지는데, 만약 성능이 중요한 통신이라면 UDP라는 비신뢰성 비연결성 통신 프로토콜을 사용할 수도 있다.
포트
패킷을 최종적으로 수신하는 대상은 특정 애플리케이션 프로세스인데, 포트는 애플리케이션 프로세스를 식별할 수 있도록 도와주는 정보이다.
전송 계층은 포트 번호를 통해 애플리케이션을 식별하며, 전송 계층의 핵심 프로토콜인 TCP와 UDP는 모두 포트 번호 필드인 송신지 포트 번호와 수신지 포트 번호를 포함한다. 포트 번호는 16비트로 표현 가능하며, 0번부터 65535번까지, 총 65536개가 존재한다.
- 0번부터 1023번까지는 잘 알려진 포트로, 일반적으로 사용하는 널리 알려지고 유명한 포트 번호를 의미한다.
- 1024번부터 49151번까지는 등록된 포트로, 잘 알려진 포트에 비해서는 덜 범용적이지만 흔히 사용되는 애플리케이션 프로토콜에 할당하기 위해 사용된다.
- 49152번부터 65535번까지는 동적포트, 사설 포트, 임시 포트라고 불리며, 특별히 관리되지 않는 포트 번호이다.
서버로서 동작하는 프로그램은 포트 번호가 사전에 암묵적으로 정해진 경우가 많으며, 잘 알려진 포트와 등록된 포트로 동작하는 경우가 많다. 클라이언트로서 동작하는 프로그램은 동적 포트 번호 중에서 임의의 번호가 할당되는 경우가 많다.
포트 번호를 통해 특정 애플리케이션을 식별할 수 있기 때문에, IP 주소와 포트 번호를 모두 알고 있다면 특정 호스트에서 실행 중인 특정 애플리케이션 프로세스를 식별할 수 있다. 그래서 포트번호는 일반적으로 IP 주소:포트 번호 형식으로 표기되는 경우가 많다.
포트 기반 NAT
사설IP 주소와 공인 IP 주소를 변환해 주는 기술은 NAT을 떠올려보자. NAT이 사설 IP 주소와 공인 IP 주소를 변환을 해주기 위해선 NAT 변환 테이블이 필요하며, 사설 IP 주소와 공인 IP 주소가 1대 1로 매칭되어 있다고 알고 있다.
하지만 이렇게 사용되면 외부에서 사용되는 공인 IP가 금세 고갈될 것이며, 사설 IP 주소와 공인 IP 주소로 나눈 이유가 없다. 이 부분을 이상하게 생각했다면 잘 생각한 것이다.
사실 사설IP 주소와 공인IP 주소는 1대 1로 매칭되지 않는다. 1대1로 매칭될 경우 공인 IP가 빠르게 고갈되기 때문에, 실제로는 IP주소와 포트번호를 함께 사용하여 1대다로 매칭된다.
포트 기반의 NAT를 NAPT(Network Address Port Translation) 혹은 APT(Address Port Translation)이라고 부른다. NAPT는 공인IP 주소가 부족해지는 문제를 개선한 기술로도 간주된다.
포트 포워딩
포트 포워딩(port forwarding)이란 네트워크 내 특정 호스트에 IP 주소와 포트 번호를 미리 할당하고, 해당 호스트에게 패킷을 전달하는 기능이다. 이렇게 명시적으로 IP 주소와 포트 번호가 정의되어 있으면, 네트워크 외부에서 내부로 (원격 접속을 시도하는 등) 통신을 시작하는 상황에서 곧바로 통신할 수 있게 된다.
포트 포워딩은 주로 네트워크 외부에서 네트워크 내부로 통신을 시작할 때, 네트워크 내부의 서버를 외부에서 접속할 수 있도록 접속 정보를 공개해 주기 위해 자주 사용된다.
ICMP
IP의 신뢰할 수 없는 전송 특성과 비연결형 전송 특성을 보완하기 위한 네트워크 계층의 프로토콜로 ICMP(Internet Control Message Protocol)가 있다. ICMP는 IP 패킷 전송 과정에 대한 피드백 메시지를 얻기 위해 사용되는 프로토콜이다.
ICMP 메시지의 종류로는 크게 두 가지가 있다.
- 전송 과정에서 발생한 문제 상황에 대한 오류 보고
- 네트워크에 대한 진단 정보
ICMP 메시지는 패킷 헤더에 타입과 코드 정보가 포함된다. 타입은 ICMP 메시지의 유형이 번호로 명시되고, 코드엔 구체적인 메시지 내용이 번호로 명시된다.
ICMP는 IPv4에 사용되는 ICMPv4와 IPv6에 사용되는 ICMPv6이 있다. 이하 내용은 ICMPv4에 대한 정보이다.
대표적인 ICMP 메시지 타입으로는 수신지 도달 불가와 시간초과가 있으며, 두 타입에 대한 일부 코드는 다음과 같다.
ICMP는 IP의 신뢰성을 보장하는 것이 아닌 도우미 역할만 하기 때문에 여전히 IP 패킷이 수신지까지 도달하지 못하거나 ICMP 메시지를 담은 패킷 자체가 송신지까지 되돌아오지 못할 수 있다.