[전공 시리즈] 2. 데이터 링크 계층과 인터페이스, ARP(Address Resolution Protocol)
[전공 시리즈] 1. 인터넷과 프로토콜, 계층화 원칙 [전공 시리즈] 0. 소개 🔰작성 동기 예전에 정말 열심히 공부했었지만.. 시간이 지날수록 까먹어서 복습을 위해 시리즈를 계획했다. 전공 공부
nan-noo.tistory.com
🔰서론
네트워크 계층을 배우기 전에, IP 주소에 관해 먼저 공부해보자 :D 이번 챕터에서는 IPv4 주소(IP 주소), IPv6 주소를 정리할 것이다. 내용이 좀 많다!
이 포스팅에서 IP 주소는 IPv4 주소를 의미한다.
🔰IP 주소
인터페이스 식별자
IP 주소는 32bit로 구성되어 있다. IP 주소는 호스트와 라우터의 인터페이스를 구분하기 위한 identifier 역할을 한다.
🍎 호스트와 라우터
호스트는 1개 또는 2개 정도의 인터페이스만 갖고 있다. 랜선 연결과 와이파이 연결을 생각하면 된다! 반면에 라우터는 여러개의 인터페이스를 가지고 있다. 각각의 용도 때문에 이런 차이가 생긴다.
컴퓨터에는 32bit로 주소를 저장하지만, 사람이 읽기 힘들기 때문에 IP 주소를 8bit씩 4등분을 해서 십진수로 표기한다. 이 표기 방식을 Dotted Decimal Notaion라고 한다.
IP 주소는 ICANN(Internet Corporation for Assigned Names and Numbers)에서 배분한다.
🔰Classful IP 주소
클래스를 기준으로 주소를 나눠주자.
IP 주소는 총 2^32개의 주소가 존재하고, 0.0.0.0(000...0000)부터 255.255.255.255(111...1111)까지 있다. 이 IP 주소를 원래는 클래스로 구분했다.
클래스는 초기 인터넷이 성행하기 시작했을 때 주소를 분배하는 용도로 사용됐다. 주소를 1 블록 단위로 각각의 기관(인터넷 가입자)에 나눠줬다. 클래스는 주소를 받아가는 기관에 속한 컴퓨터 수를 기준으로 결정됐었다.
IP 주소를 모두 일렬로 늘어놓고 절반을 자른 후 앞부분은 A 클래스, 뒤 절반을 또 반으로 자른 앞부분은 B 클래스, ... 이런 식으로 C, D, E 클래스까지 존재한다. 이렇게 일정한 규칙으로 나눴기 때문에 각 클래스마다 특징이 존재한다.
클래스 | 특징 |
A |
|
B |
|
C |
|
D |
|
E |
|
이 클래스를 사용한 방식에 문제가 있었다! 위에서 말한 것처럼 인터넷 가입자(기관)의 클래스를 정하는 기준은 기관에 속한 컴퓨터 수다. 그런데, 인터넷에 가입하는 거의 모든 기관의 컴퓨터 수는 B 클래스에 해당했다. B 블록 총 개수는 2^14개로 이미 1990년대 중반에 B 블록이 거의 고갈됐었다, 이 때문에 클래스 개념에 대한 문제를 제기하는 사람들이 늘어났다.
B 클래스 블록 고갈 문제는 인터넷이 없어질 뻔한 3개의 위기(3 deaths of internet) 중 첫번째 위기다.
결국 분배 단위로서 클래스는 폐기되었다. 지금은 IP 주소 공간에서 위치(어떤 출신인지 정도) 개념으로만 사용된다. A 클래스는 1 블록이 매우 크니 쪼개고, C 클래스는 집속(aggregation)을 통해 여러 블록을 묶어서 나눠준다.
🔰IP unicast 주소 구조
IP 주소는 32bit가 단순히 나열된 것이 아닌, 구조를 가지고 있다. 2-tiered, loose confederation network인 인터넷의 구조를 반영했다.
클래스 기반일 때 IP 주소는 네트워크 ID와 호스트 ID로 구성되어 있었다. A 클래스의 주소는 앞의 8bit가 네트워크 ID고, B 클래스는 16bit, C 클래스는 24bit가 네트워크 ID다. 각 클래스마다 고정된 네트워크 ID를 가졌다. 라우터는 IP 데이터그램을 배달할 때 클래스를 먼저 확인하고 네트워크 ID로 라우팅했다. 다시 말하면 라우팅 테이블에 호스트 ID를 제외한 네트워크 ID만 저장했다.
그런데 인터넷이 점점 활성화되면서 클래스 기반의 비효율적인 주소 블록 배분 방식때문에 또 다른 문제가 발생했다. 클래스 A의 경우 네트워크 ID가 8bit이기 때문에 나머지 24bit가 모두 호스트 ID다. 한 네트워크에 속하는 호스트가 너무 많아서(2^24개) 찾기 어렵다. '서울시 김ㅇㅇ에게 배달해주세요.'와 같다고 생각하면 된다. 이런 문제를 해결하기 위해 서브넷(subnet)이 등장했다.
서브넷
서브넷은 주소를 좀 더 세분화해서, 호스트가 많은 문제를 해결했다. 호스트 ID를 서브넷 ID와 호스트 ID로 더 쪼갠다. 여러 번 쪼개서 계층적으로 서브넷을 구성하는 것도 가능하다. '서울시 김ㅇㅇ'에서 '서울시 ㅁㅁ구 ㅎㅎ동 김ㅇㅇ'!
C 클래스를 예로 들어보겠다. 기존의 호스트 ID가 8bit니까 한 번 나눈 후에는 서브넷 ID(1bit)와 호스트 ID(7bit)가 된다. 따라서 총 호스트는 2^7개(128개)라고 생각할 수 있지만 실제로는 126개다. 128개 중 가장 첫 번째 주소는 라우팅 테이블에서 서브넷을 대표하는 주소로 사용되고, 가장 마지막 주소는 broadcast 주소로 사용된다(A, B, C 클래스가 '대부분' unicast 였던 이유). 계속해서 호스트 ID를 쪼개서 여러 레벨의 서브넷을 만들 수 있다.
네트워크 ID부터 서브넷 ID까지를 구별해주는 서브넷 마스크(subnet mask)도 있다. 똑같이 32bit로 구성되어있고, IP 주소를 서브넷 마스크와 bit AND 연산을 했을 때 유지되는 부분이 네트워크 ID와 서브넷 ID다. 즉, 서브넷 마스크의 bit 1인 부분이 해당 부분이다.
CIDR(Classless Inter-Domain Routing)
분배 단위로서 클래스가 폐기된 이후로 더이상 클래스를 기반으로 네트워크 ID를 판별할 수 없었다. 따라서 몇 bit까지가 네트워크 파트인 지 표기하는 것이 필요했다. CIDR 블록은 앞부분은 IP 주소와 비슷하지만 '/' 뒤에 서브넷 파트의 bit 수를 적는다. x.x.x.x/y 형태다. 예를 들어, 111.22.0.0/18이면 앞의 18bit는 라우팅에 사용한다는 의미다.
IP 주소 집속(aggregation = supernetting = summarization)
원래는 기관마다 하나의 블록을 나눠줬으므로, 라우팅 테이블에서 하나의 블록이 하나의 엔트리(row)를 차지했다. 클래스 개념이 폐기되면서 이 규칙이 깨졌다. 이제는 하나의 기관이 여러 개의 블록을 받기도 하고(C 클래스의 경우), 여러 기관이 하나의 블록을 나눠 받기도 한다(A 클래스의 경우). 같은 목적지여도 여러 엔트리가 필요한 경우가 많아지면서, 라우팅 테이블 크기가 폭발했고 인터넷이 느려지는 현상이 발생했다.
클래스 개념 폐기로 인한 라우팅 테이블 크기 폭발 - 3 deaths of internet 중 두번째!
이 문제를 집속으로 해결했다. 같은 아웃풋 인터페이스와 다음 홉(출구와 바로 다음 목적지가 같으면)을 가지고 있고, 비슷한 IP 주소를 가진 엔트리들을 합치는 것이 집속이다. 예를 들어, 한 기관에 분배된 222.0.0.0/24부터 222.0.31.0/24까지 총 32개의 블록을 222.0.0.0/19로 묶는 것이다. 꼭 같은 기관일 필요도 없다. 서로 다른 기관에 할당되었더라도 비슷한 IP 주소면 집속한다. 따라서 인터넷 중심부로 갈수록 집속이 많이 이뤄지고, 중심부를 벗어나 목적지로 갈수록 점점 풀어진다.
현재 인터넷 중심부 라우터의 엔트리 수는 약 80만개다. 집속이 이상적으로 이뤄졌다면 더 줄었겠지만, CIDR이 도입되기 전에 C 클래스의 블록들이 아무렇게나 분배되었기 때문에 집속할 수 없는 경우가 있었다. 집속의 조건은 위에서도 설명했다시피 같은 아웃풋 인터페이스와 다음 홉이어야 하고 IP 주소가 비슷해야 한다. IP 주소는 비슷하지만, 서로 다른 아웃풋 도는 다음 홉을 가지고 있는 엔트리가 있어 집속이 되지 못했다.
🔰IP multicast 주소
multicast 주소(D 클래스 출신)는 목적지 주소로만 사용 가능하다. 송신측 주소로 사용할 수 없다. 또한 unicast 주소처럼 하나의 인터페이스에 할당되는 것이 아니다. 이 주소들은 배분되지 않는다. 대신, 인터페이스들이 어떤 multicast 주소가 대표하는 '그룹'에 가입한다. 특정 multicast 주소로 데이터를 전송하면, 해당 그룹에 속하는 인터페이스들에게 데이터가 전송된다.
multicast 주소는 3가지로 분류된다.
- 224.0.0.0/24(well-known addresses): 224.0.0.0부터 224.0.0.255까지 총 256개가 이 부류에 속하며, IANA(Internet Assigned Numbers Authority)에서 관리한다. 이 주소들은 함부로 사용하면 안 된다.
- 239.0.0.0/8(사설 주소): 239.0.0.0부터 239.255.255.255까지 약 1700만 개의 주소가 속하며, 특정 네트워크 안에서만(scoped = local) 사용가능하다.
- 나머지: 224.0.1.0부터 238.255.255.255까지 주소는 개념상으론 누구나 사용할 수 있고 어디나 갈 수 있는 multicast 주소다. 현실적으로는 협의가 안 돼서 불가능하다. 한 네트워크 안에서는 자유롭게 사용할 수 있다(IPTV 등).
multicast 주소인 경우, MAC 주소로 번역할 때 ARP를 사용하지 않는다. multicast MAC 주소가 따로 있어서 일정한 규칙에 따라 IP 주소로부터 MAC 주소를 얻을 수 있다.
24-bit IANA Multicast OUI 블록과 32-bit Multicast IP 주소를 조합한다. OUI 블록은 MAC 주소(6B)의 앞 3B가 되고, 바로 다음 bit는 항상 0으로 채운다. 그리고 IP 주소의 앞의 9bit를 제외한 나머지 bit가 나머지를 채운다. 이 규칙을 따르면 D 클래스이기 때문에 공통으로 가지는 '1110'을 제외하면 5bit가 버려지는데, 따라서 32개의 multicast IP 주소가 하나의 multicast MAC 주소와 대응하는 32:1 모호성이 발생한다. 그래도 문제가 발생하지 않는 이유는, 어쨌든 인터페이스에 해당 인터페이스가 속한 IP multicast 주소들이 저장되어 있기 때문이다. 몇 개가 대응되든 상관 없다.
🔰IP broadcast 주소
broadcast 주소는 두 종류로 나뉜다.
- limited broadcast(255.255.255.255): 송신자가 속한 링크에서만 broadcast가 가능하다.
- directed broadcast: 특정 IP 주소로 겨냥하고, broadcast하는 범위(호스트 또는 서브넷)의 ID를 모두 1bit로 채운다. 예를 들어 163.152가 네트워크 ID고 13이 서브넷 ID인 주소가 있다고 가정하자. 163.152.13.255로 겨냥하면 163.152.13 서브넷에 속한 모든 호스트에게 broadcast하는 것이고, 163.152.255.255는 163.152 네트워크 아래에 있는 모든 서브넷에게 broadcast하는 것이다.
directed broadcast는 보안상 허용되지 않아서, 지금은 limited broadcast와 directed broadcast가 거의 차이 없다. 그리고 둘 모두 대응되는 broadcast MAC 주소는 'ff-ff-ff-ff-ff-ff'다(유일한 broadcast MAC 주소).
🔰특별한 IP 주소
이전 챕터에서 언급한 주소들도 있다.
- 0.0.0.0: 발신지 주소로만 사용 가능하다. 인터페이스에 아직 주소 할당이 안 되었을 때 임시로 사용하는 주소다. 또 ACD Probe할 때도 사용된다.
- 255.255.255.255: limited broadcast 주소다.
- 사설 주소(private address): A, B, C 클래스의 각각 한 블록씩을 사설 주소 용도로 사용한다. 사설 주소는 사용되는 네트워크 내부에서는 괜찮지만, 외부로 패킷이 나가려면 NAT를 거쳐야 한다.
🍎 NAT(Network Address Translation)란?
말 그대로 지역 네트워크와 외부 네트워크(인터넷의 나머지 부분) 사이에서 사설 주소를 공용 주소로 번역해주는 역할을 한다.
지역 네트워크에서 외부 네트워크로 어떤 패킷을 전달하려 할 때, NAT 라우터가 송신자 사설 IP 주소와 포트 번호를 테이블에 맵핑된 공용 IP 주소와 새로운 포트 번호로 교체한다. 포트 번호를 사용하는 이유는, 한 서브넷에 대해서 하나의 공용 IP 주소를 사용하기 때문이다. 포트 번호로 내부 호스트를 구분한다.
NAT에는 여러 장점이 있다. 첫째, 하나의 public IP 주소로 지역 네트워크 전체를 대신할 수 있다. 둘째, 지역 네트워크 내부 어딘가 주소 변화가 발생해도 외부에 알릴 필요가 없다. 셋째, 지역 네트워크 내부의 주소를 바꾸지 않고도 ISP를 바꿀 수 있다. 넷째, 지역 네트워크 내부 기기들의 보안이 보장된다.
문제도 있다. 첫째, 결국 IP 주소가 바뀐다는 것은 새로운 커넥션을 만든다는 의미다. IP의 목표인 출발지로부터 목적지까지 커넥션을 유지한다는 것이 깨진다(e2e argument violation). 둘째, IPv6에서 주소 부족 문제를 해결했다. 셋째, NAT 필요성을 어플리케이션 설계자가 고려해야 한다. 넷째, 외부 호스트가 NAT 뒤에 있는 사설망 호스트와 통신하고 싶다면(인터넷 전화같은 경우!) NAT traversal이 필요하다.
- 127.0.0.0/8: local loopback 주소다.
- 169.254.0.0/16: 자동구성 주소(autoconfiguration address)다. 수동으로 주소를 할당하거나 DHCP 설정도 안 될 때 사용한다. 원칙적으로 인터넷을 사용할 수 없다. 랜덤으로 주소 중 하나가 선택되고 할당을 시도한다(ACD로 검증).
🔰IPv6 주소
IPv4 주소 고갈 문제의 해결책으로 등장!
IP 주소를 배분하다보니, 2000년대에는 남은 IP 주소가 절반밖에 되지 않았고 2010년대에는 실제로 거의 고갈됐다. 이 IP 주소 고갈 문제를 1992년에 자각했고, 1994년에 기존의 IP 주소를 개선한 IPv6 개발을 시작했다. IPv4에서 이젠 사용하지 않는 기능들은 제거하고 새로운 기능을 추가했다.
IPv4 주소 고갈 문제가 3 deaths of internet의 3번째다. IPv6를 완성하기 전에 임기응변으로 사용한 방식이 NAT인데, 사실 NAT가 문제를 꽤 잘 해결해서 지금도 IPv6가 IPv4를 완전히 대체하진 않았다 :D
본격적으로 IPv6 주소를 설명하면, IPv6 주소는 128bit로 대폭 늘렸고 16bit(2B)씩 쪼개서 hexadecimal(16진수)로 표기한다. IPv4 주소보다 2^96배나 더 많다.
표기 방식
IPv6는 Colon-hexadecimal notation을 사용한다. 2B씩 총 16B를 모두 16진수로 표현하는 것이 아닌, 압축된 형태로 표기한다. 먼저 2B 묶음에서 가장 왼쪽부터 0은 연속적으로 생략 가능하다(leading-zero suppressed). 그 다음 2B 묶음이 모두 0인 부분들은 '::'로 딱 한 군데에서 대체 가능하다(zero-compressed). 한 군데에서만 생략 가능한 이유는 여러 곳에서 생략할 경우 다시 bit로 복구할 때 모호성 문제가 발생하기 때문이다.
예를 들어, '8056:0000:DC28:0000:0000:0000:FC57:1FFF'라는 IPv6 주소가 있다고 하자. 이 주소를 Colon-hexadecimal notation으로 표기하면 2가지 형태가 가능하다. 첫번째는 '8056::DC28:0:0:0:FC57:1FFF'이고, 두번째는 '8056:0:DC28::FC57:1FFF'이다.
유형
unicast와 multicast는 유지되었지만, IPv4에는 있던 broadcast가 사라졌다! 쭉 읽어봤으면 알겠지만 IPv4의 broadcast는 진짜 broadcast 역할을 못하고 있었다. 그래서 IPv6에선 multicast가 broadcast를 대신한다. 그리고 anycast가 새롭게 추가됐다. anycast는 모양은 unicast인데 load balancing을 위해 도입됐다. 동일한 IP 주소를 사용하는 인터페이스들이 서로 완전히 다른 위치에 존재할 때 사용된다. 예를 들어, 서울과 부산에 각각 같은 IP 주소를 사용하는 기관이 있을 때 해당 IP 주소로 unicast로 패킷을 전송하면 송신측과 가장 가까운 인터페이스로 패킷이 배달된다.
주소가 어떤 bit로 시작하는가에 따라 쓰임이 다르다.
- 001(global unicast addresses): IPv6 주소 공간의 1/8을 차지한다.
🍎 global unicast address
global unicast 주소는 global routing prefix(48bit), subnet ID(16bit), interface identifier(64bit)로 구성되어 있다.
앞의 고정된 '001'을 제외하면 총 2^45개의 네트워크 ID가 존재한다. 서브넷 ID의 경계는 IPv4 주소와 달리 유동적으로 바뀌지 않고 고정 16bit다.
🍎 interface ID 생성 과정
인터페이스 ID(= 호스트 ID)는 인터페이스의 MAC 주소로부터 생성했으나(48bit IEEE MAC 주소에서 일정 규칙에 따라 64bit Modified EUI-64 Interface ID를 얻어냈다.), MAC 주소는 (거의) 바뀌지 않기 때문에 MAC 주소로부터 인터페이스 ID를 유추할 수 있는 보안상의 문제가 있어 최근에는 랜덤으로 생성하고(2^64가지) ACD로 검증하는 방식을 사용한다.
- 1111 1110 10(link-local unicast addresses): FE...로 시작하는 주소로, 지역 내에서 사용되는 unicast 주소다.
- 1111 1111(multicast addresses): FF...로 시작하는 주소로, multicast에 사용된다. IPv4의 broadcast와 헷갈리면 안 된다!
🍎 IPv6 multicast 주소
IPv6의 multicast 주소의 가장 앞 2B는 역할이 정해져 있다. multicast 주소는 항상 'FF'로 시작한다. 그 뒤 4bit는 '000X'로 flag 역할을 한다. '0000'이라면, 다시 말해 주소가 'FF0'으로 시작한다면 이 주소는 IANA에서 지정한 특별한 주소라는 것을 의미한다. 나머지 4bit는 scope ID다. FF0'1'은 node-local, FF0'2'는 link-local, FF0'E'는 global scope를 의미한다.
이 외에도 여러 유형이 존재한다.
SNM(Solicited-Node Multicast) 주소
IPv6는 ARP를 사용하지 않는다. ARP는 IPv4를 위한 프로토콜이다. IPv6는 ARP와 비슷한 동작을 위해 사용되는 주소가 있다. 바로 SNM 주소다. SNM 주소는 '다음 홉'만 알아들을 수 있다. 다음 홉이 알아들을 수 있는 이유는, 다음 홉이 이미 해당 SNM 주소에 자동으로 가입되어 있기 때문이다(인터페이스에 저장되어 있다.).
SNM 주소는 'FF02:0:0:0:1:FF'에 다음 홉 IPv6 unicast 주소의 마지막 3B를 이어서 만든다. 이렇게 만든 SNM 주소를 목적지로 해서 multicast 한다(neighbor solicitation). 그리고 Ethernet frame의 목적지 MAC 주소는 33:33에 SNM 주소 뒤 4B를 더해서 만든다(multicast MAC 주소).
응답 과정(neighbor advertisement)에선 다음 홉의 IPv6 주소에 해당하는 MAC 주소를 응답한다.
더 자세하게는 ICMPv6 프로토콜이 ARP 역할을 대체한다. 나중에 다룰 수도 있는 ICMP 챕터에서 설명!
특별한 주소
- :: : 모두 0인 주소! IP 주소를 아직 할당 받지 않았을 때 임시 source 주소로 사용한다.
- ::1 : 마지막 bit만 1인, local loopback 주소다.
🔰정리
- IP 주소는 인터페이스 식별자다.
- IP 주소는 원래 클래스를 기준으로 분배했으나, B 클래스 고갈 문제가 발생해서 분배 단위로서 클래스는 폐기됐다.
- IP unicast 주소는 구조를 갖고 있으며, 현재는 CIDR 방식으로 표기한다. 또, 집속을 통해 라우팅 테이블 크기를 줄였다.
- IPv4 주소 고갈 문제로 IPv6가 개발되었으며, IPv4에서 쓸모 없어진 기능을 제거하고 새로운 기능을 추가했다.
내용이 참 많다. 그래서 뒤로 갈수록 글을 많이 줄였다. 그림을 보면 좋을 것 같다! 다음 챕터는 드디어 IP!
'CS > Network' 카테고리의 다른 글
[전공 시리즈] 4. 라우팅 프로토콜(Routing Protocol) (0) | 2023.04.17 |
---|---|
[전공 시리즈] 3. IP(Internet Protocol) (0) | 2022.12.23 |
[전공 시리즈] 2. 데이터 링크 계층과 인터페이스, ARP(Address Resolution Protocol) (0) | 2022.12.06 |
[전공 시리즈] 1. 인터넷과 프로토콜, 계층화 원칙 (0) | 2022.12.01 |
[전공 시리즈] 0. 소개 (0) | 2022.12.01 |