-
IP : Internet Protocol네트워크와 프로토콜 2021. 7. 12. 23:44
'네트워크와 프로토콜' 카테고리의 게시글은 저자 W.Richard Stevens의
[TCP/IP Illustrated, Volume 1, Addison-Wesley, 1994]의 본문을 해석하여 재구성하였습니다.
오역, 지나친 의역 및 현재 사용하지 않는 기술에 대한 피드백은 감사히 받겠습니다.IP는 TCP/IP 프로토콜 중 가장 바쁜 프로토콜이다. TCP/IP에서 IP를 사용하는 Internet 계층보다 한 단계 위인 Transport 계층의 TCP/UDP 데이터와, Internet 계층에서 사용하는 ICMP/IGMP 프로토콜의 데이터는 IP가 IP 데이터그램(IP Datagram)으로 캡슐화한다.
IP의 특징은 첫 번째로 신뢰성 있는 연결을 제공하지 않는다는 것이다. 신뢰성 있는 연결이란 프로토콜이 데이터가 도착지까지 문제없이 전송되었는지 확인하는 것이다. IP는 신뢰성 있는 연결을 제공하지 않는 대신 단순 에러 처리 알고리즘을 사용하여 효율적으로 작동한다. 통신과정에서 문제가 생기면 해당 데이터그램을 폐기(DROP)하고 송신 호스트에 ICMP 메시지를 전송한다. 폐기된 데이터그램을 복구하거나 재전송하는 등 전송 에러를 처리하는 방식은 ICMP 메시지를 수신한 송신 호스트의 상위 계층에서 결정한다.
두 번째로, IP는 connectless 하다. connetless는 IP가 데이터그램의 순서와 같은 관련 전송 정보를 저장하지 않는다는 의미다. 즉, IP는 모든 데이터그램을 독립적으로 관리하기 때문에 데이터그램들이 송신 호스트가 발송한 순서대로 수신 호스트에 도착하지 않을 수 있다. 이는 송신 호스트에서 수신호 스트로 연이어 데이터그램 A, B를 보내더라도 데이터그램을 독립적으로 라우팅 하기 때문에, 각 데이터그램은 같은 라우팅 경로를 사용하지 않으며 또한 A보다 B가 먼저 도착할 수 있음을 의미한다.
이러한 특징들은 IP가 TCP/IP에서 자주 사용하는 프로토콜인 만큼, 꼼꼼하게 통신을 관리하기 보다는 효율성에 초점을 맞추고 있기 때문에 발생한 특징들이다.
IP Header
IP 헤더의 기본 사이즈는 20바이트다. 옵션 필드에 데이터를 저장하면 기본 사이즈에서 데이터 만큼 크기가 추가된다.
헤더의 비트를 전송할 때는 바이트 순서대로 0-7비트, 8-15비트, 16-23비트, 24-31비트 순으로 전송한다. 이러한 바이트 작성 방식을 빅 엔디안(Big-Endian)이라고 한다. TCP/IP 네트워크는 통신을 위한 모든 TCP/IP 패킷의 바이트가 빅 엔디안 방식으로 전송되도록 요구한다. 이 같은 네트워크 바이트 통신 환경을 Network Byte Order라고 한다. 시스템이 메모리에 바이트를 작성할 때는 빅 엔디안 방식, 또는 리틀 엔디안(Little-Endian)등 시스템에 따라 다른 방식을 사용한다. 때문에 리틀 엔디안 같이 Network Byte Order와 다른 방식으로 데이터를 저장하는 시스템은, 통신하기 위해 데이터를 네트워크로 전송할 때, 바이트를 Network Byte Order 형태로 변환하는 과정이 반드시 필요하다.
IP datagram, IP Header fields version
IP 프로토콜 버전을 나타낸다. 현재 헤더의 IP 프로토콜 버전은 4이다. IPv4라고 불린다.
header-length
헤더 크기를 32비트 단위로 표현한다. header-length 필드의 크기가 4비트기 때문에, IP 헤더의 최대 크기는 60바이트이다(32 * 15 / 8 = 60). header-length 필드의 기본 값은 5이다. 즉, 아무런 옵션도 설정하지 않았을 때 IP 헤더의 크기는 20(32 * 5 / 8) 바이트다.
type-of-service(TOS) / DSCP
과거에 패킷 우선순위를 고려(QoS : Quality of Service) 하기 위해서 TOS 필드를 참조했으나, 최근에는 TOS 필드의 값을 더 세분화한 DSCP(DiffServ Code Point) 필드를 사용한다.
8-bit DSCP 필드는 6-bit(DSCP) + 2-bit(ECN)으로 이루어진다. DSCP 값은 3-bit(Class) + 2-bit(Drop Probability) + 1-bit(Reserved) 영역으로 구성한다. Class 비트는 패킷 중요도를 표시하여 000(일반 인터넷 트래픽) ~ 111(우선순위 높음)으로 표현하고. Drop Probabillity 비트는 패킷을 폐기할 가능성을 01(낮음), 10(보통), 11(높음)으로 표현한다. 나머지 1비트는 사용하지 않는다.
ECN 필드는 네트워크에 혼잡이 발생한 것을 명시한다. 00(ECN 필드 사용하지 않음), 11(라우터 혼잡 발생)을 표현한다.
total-length
IP 데이터그램 크기를 바이트 단위로 표현한다. total-length 필드와 header-length 필드를 참조하여 IP 데이터그램의 데이터 필드 시작 위치와 데이터 필드의 크기를 알 수 있다. total-length의 크기가 16비트이기 때문에 IP데이터그램의 최대 크기는 65535 바이트이다. 하지만 데이터그램을 65535 바이트 크기로 전송하더라도, Internet 계층의 하위 계층인 layer 계층에서 해당 데이터그램을 분할하여 전송할 것이다.
또한 total-length 필드를 참조하여 link 계층의 데이터와 IP 데이터그램을 구분할 수 있다. link 계층의 프로토콜은 프레임의 최소 크기에 맞추기 위해 프레임에 패딩 비트를 추가한다. 예를 들어 이더넷 프로토콜의 경우, 이더넷 프레임의 최소 크기는 46 바이트이다. 만약 이더넷 헤더와 IP 데이터그램의 크기의 합이 46 바이트 보다 작으면 이더넷은 최소 크기에 맞추기 위해 0 비트를 부족한 비트 수만큼 채운다. 이때 total-length 필드를 제공하지 않으면 IP 데이터그램은 데이터 영역과 이더넷 프레임의 패딩 비트를 구분할 수 없다.
identification
송신한 데이터그램을 특정하는 필드이다. identification 필드는 일반적으로 데이터그램을 송신하면 값을 하나씩 증가시킨다.
Time-to-live(TTL)
데이터그램이 지나가는 라우터의 개수를 제한하여 데이터그램의 유효기간을 설정하는 필드이다. TTL 값은 송신 호스트가 설정(일반적으로 linux 32 또는 64, windows는 138로 설정)한다. TTL은 데이터그램이 라우터를 경유할 때마다 값이 하나씩 감소한다. TTL 값이 0이 되면 데이터그램을 폐기하고 송신호스트에 ICMP 패킷을 전송한다. 이러한 TTL 알고리즘으로 데이터그램이 계속해서 라우팅되어 네트워크를 떠도는 현상을 방지한다.
protocol
Internet 계층에서 IP 프로토콜이 전송할 상위 Transport 계층의 프로토콜을 설정한다.
header-checksum
IP Header 체크섬만 계산한다. TCP/UDP, ICMP/IGMP는 헤더와 데이터의 체크섬을 모두 계산하는 체크섬 알고리즘을 사용한다. IP Header 체크섬은 헤더의 값이 변경될 때 마다 헤더의 값을 검사한다.
체크섬을 검사하기 위해 먼저, 송신 호스트는 헤더의 체크섬 필드 값을 0으로 초기화한 뒤 체크섬 필드의 크기에 맞추어 헤더를 16바이트씩 자르고 모두 더한다. 이때, 더한 값이 16바이트를 초과하면 첫 번째 비트를 16번째 비트에 더한다. 이렇게 구해진 값의 1의 보수를 체크섬 필드에 저장하여 데이터그램을 전송한다.
수신 호스트는 같은 방법으로 헤더를 모두 더한 값을 구하고, 마지막으로 체크섬 필드에 저장된 값과 직접 구한 값을 더한다. 체크섬에는 헤더를 더한 값의 1의 보수 값을 저장하고 있기 때문에 오류가 발생하지 않으면 체크섬 비트는 모두 1이 된다.
TCP/UDP, ICMP/IGMP도 같은 체크섬 알고리즘을 사용한다. 또한, RFC 1071은 IP 헤더 체크섬을 효율적으로 계산하기 위한 새로운 방식을 정의한다. IP 헤더는 값이 변경될 때마다 헤더 체크섬을 계산하기 때문에 각 라우터에서 TTL값을 변경하고 체크섬을 계산하는 방식이 비효율적이다. 때문에 TTL 필드를 하나씩 감소하고 체크섬의 값은 하나씩 증가하는 방식이다.
source IP address
모든 IP 데이터그램은 32bit 주소 체계를 사용한 송신 호스트 IP 주소와, 수신 호스트 IP 주소를 포함한다.
destination IP address
모든 IP 데이터그램은 32bit 주소 체계를 사용한 송신 호스트 IP 주소와, 수신 호스트 IP 주소를 포함한다.
options
options 필드의 크기는 데이터그램이 포함하는 추가 정보에 따라 변한다. 현재 정의된 옵션은 다음과 같다.
- 보안 핸들링 규약(군사용)
- record 라우트(데이터그램이 경우 하는 모든 라우터가 자신의 IP 주소를 저장)
- timestamp(데이터그램이 경유하는 모든 라우터가 자신의 IP와 작성 시간을 저장)
- 규약 호출 라우팅
옵션은 현재 드물게 사용하기 때문에 모든 호스트, 라우터가 옵션을 지원하지 않는다. options 필드는 32비트 단위에 맞추어 작성된다. 때문에 32비트를 맞추기 위해 패딩 비트가 사용되기도 한다. 이는 header-length 필드가 헤더 크기를 32비트 단위로 표현하기 때문이다.
IP 라우팅
IP 라우팅 이론은 간단하다. 송수신 호스트가 직접 연결(token ring 등)되어있거나, 혹은 공유 네트워크로 연결(Ethernet 또는 token ring)되어 있다면, IP 데이터그램을 수신 호스트에 바로 전송한다. 송수신 호스트가 내부 네트워크로 연결되어 있지 않다면 즉, 데이터그램을 디폴트 라우터로 전송하면 라우터가 데이터그램을 수신 호스트로 전송한다. 이런 간단한 로직이 인터넷 통신의 기본 개념이다.
TCP/IP 네트워크에서 IP는 일반적으로 TCP/UDP, 또는 ICMP/IGMP 데이터를 전송하기 위해 같은 호스트의 상위 계층에서 데이터그램을 내려받는다. 또는, 데이터그램을 포워딩해주기 위해 네트워크 인터페이스로부터 다른 호스트의 데이터그램을 전달받는다. Internet 계층은 이러한 데이터그램을 포워딩할 때 사용하는 라우팅 테이블을 가지고 있다.
네트워크 인터페이스에서 데이터그램을 전송받으면 IP는 가장 먼저 수신지 주소가 자신의 주소인지 또는 브로드캐스팅 주소인지 확인한다. 만약 그렇다면, IP는 헤더에 명시된 모듈을 통해 데이터그램을 가져온다. 만약 수신지 주소가 자신의 IP 주소가 아니라면
- 1. 자신 호스트가 라우터로서 설정되어있다면 패킷을 포워딩한다. 패킷은 out-going 데이터그램으로 취급한다.
- 2. 라우터로 설정되어 있지 않다면 데이터그램을 폐기한다.
라우팅 테이블
라우팅 테이블은 다음과 같은 정보를 저장한다.
- 1. 도착지 IP 주소
도착지 IP 주소는 라우팅 테이블의 플래그 값에 따라 수신 호스트의 주소이거나, 네트워크 주소가 된다. 호스트 주소는 특정 호스트의 전체 IP 주소이다. 네트워크 주소는 IP 주소의 호스트 자리가 0으로 채워진 주소이다. - 2. next - hop 라우터 주소 또는 외부 네트워크와 연결된 호스트의 주소
next-hop 라우터는 외부 네트워크와 연결된 라우터이다. next-hop 라우터는 최종 도착지가 아니며 데이터그램을 수신 호스트에 포워딩하는 역할을 한다. - 3. 플래그
수신 호스트의 IP 주소가 호스트 주소인지 네트워크 주소인지 명시하는 플래그와 next-hop 라우터가 next-hop 라우터인지 외부 네트워크와 연결된 인터페이스 호스트인지 명시하는 플래그로 이루어진다. - 4. 데이터그램을 전송하기 위해서 통과해야 하는 네트워크 인터페이스에 대한 명시
IP 라우팅은 데이터그램을 수신 호스트까지 호스트에서 다른 호스트로 전달하는 hop-by-hop방식으로 작동한다. 하지만 라우팅 테이블이 저장하는 정보에서 알 수 있듯이, IP는 수신 호스트까지 도달하는 완전한 주소를 가지고 있지 않다(송수신 호스트가 직접적으로 연결되어 있는 경우를 제외하고). 다만, 라우팅 테이블은 데이터그램을 포워딩해줄 next-hop 라우터의 주소를 제공한다. 이러한 상황에서 IP는 데이터그램을 수신 호스트까지 전송하기 위해, 내부 네트워크에 연결된 모든 호스트 중 next-hop 라우터가 수신 호스트에 가장 가깝다고 판단하여 데이터그램을 next-hop 라우터에 전달한다.
IP 라우팅 작동
IP 라우팅은 다음과 같은 순서로 작동한다.
- 1. 라우팅 테이블을 검색하여 엔트리에 수신 호스트의 주소와 일치하는 주소가 있는지 확인한다. 만약 동일 주소를 저장한 엔트리가 있다면 데이터그램을 해당 호스트 주소로 또는 네트워크로(플래그 값에 따라) 전송한다. 이 경우는 PPP로 연결된 네트워크 환경에서 링크 끝단의 주소가 수신 호스트의 IP 주소인 경우 등에 적용할 수 있다.
- 2. 라우팅 테이블을 검색하여 엔트리에 수신 호스트의 네트워크 주소와 일치하는 주소가 있는지 확인한다. 만약 주소를 저장한 엔트리가 있다면 데이터그램을 해당 호스트 주소로 또는 네트워크로(플래그 값에 따라) 전송한다. 수신 호스트의 네트워크에 연결된 모든 호스트는 하나의 라우팅 엔트리로 관리한다. 이 경우는 이더넷으로 연결된 네트워크 환경 등에 적용할 수 있다. 다만, 반드시 서브넷 마스크를 고려해야 한다.
- 3. 라우팅 테이블을 검색하여 "default" 엔트리를 찾는다. 만약 엔트리가 있다면 데이터그램을 next-hop 라우터로 전송한다. 이 경우는 데이터그램을 외부 네트워크로 포워딩하는 경우이다.
모든 라우팅 절차에도 해당하지 않는 데이터그램은 전송이 불가능하다. 전송 불가 데이터그램이 발생하면 일반적으로 "host unreachable"이나 "network unreachable" 오류를 송신 호스트에 반환한다.
다시 한번 IP 라우팅 작동 순서를 살펴보면, 라우터는 네트워크 주소를 검색하기 전에 수신 호스트 주소와 일치하는 주소를 먼저 검색한다. 그리고 주소를 검색하는 절차에 모두 실패한 경우에는 디폴트 루트를 사용한다. 디폴트 라우팅은 수신 호스트까지 동적으로 최적의 루트를 찾는 기능이다. 이러한 디폴트 라우팅는 ICMP 프로토콜과 함께 IP 라우팅의 핵심 기능이다.
수신 호스트까지 경로를 설정해도, 설정하지 않아도 최적의 경로로 데이터그램을 전송하는 IP 라우팅 기능이 인터넷 통신을 가능하게 한다. 이 덕분에, 인터넷에 연결된 모든 라우터가 서로의 주소를 저장하는 대신 몇 천 개의 주소만 라우팅 테이블 엔트리에 저장하기 때문이다.