ARP의 작동 원리
스위치는 콜리전 도메인(Collision Domain)을 쪼개주고, 라우터는 브로드캐스트 도메인(Broadcast Domain)을 쪼개준다.
ARP의 동작 과정을 살펴보기 위해 우리가 관심을 가져야 하는 것은 브로드캐스트 도메인이다.
라우터로 인해 나누어지는 네트워크는 브로드캐스트 도메인이라는 명칭 외에도, 서브넷 혹은 LAN(Local Area Network)이라고 부를 수 있다.
위 그림에선 네트워크가 192.168.1.0/24와 192.168.2.0/24 두 개의 서브넷으로 나누어져 있다. (IP주소의 호스트부분이 0이라는 것은 그 네트워크 자체를 의미한다.)
각각의 서브넷에 속한 네트워크 장비들은 다음과 같다.
-192.168.1.0/24에 속한 네트워크 장비들 (24는 서브넷마스크의 1이 24개, 즉 255.255.255.0이라는 뜻)
- 라우터의 여러 I/F(인터페이스)들 중, 192.168.1.254라는 IP주소를 가진 왼쪽 I/F
- Switch 1
- PC 1의 여러 I/F들 중, 192.168.1.1라는 IP주소를 가진 I/F
- PC 2의 여러 I/F들 중, 192.168.1.2라는 IP주소를 가진 I/F
-192.168.2.0/24에 속한 네트워크 장비들
- 라우터의 여러 I/F들 중, 192.168.2.254라는 IP주소를 가진 오른쪽 I/F
- Switch 2
- PC 3의 여러 I/F들 중, 192.168.2.1라는 IP주소를 가진 I/F
- PC 4의 여러 I/F들 중, 192.168.2.2라는 IP주소를 가진 I/F
(앞 그림과 같은 그림이다. 보기 쉽게 다시 가져왔다.)
위 그림에서 PC 1이 PC 4에게 데이터를 전송하고 싶다고 하자.
PC 1이 PC 4에 대해 알고있는 정보는 단 하나, IP주소 192.168.2.2 뿐이다.
PC 4가 같은 네트워크인지, 다른 네트워크인지, 아니면 아예 존재하지도 않는 Host인지 알 수 있는 정보는 아무것도 없다.
이럴 때 PC 1는 먼저 자신의 라우팅 테이블(Routing Table)을 확인한다.
라우팅 테이블은 서브넷(네트워크)에 대한 정보를 저장해놓는 일종의 캐시이다.
만약 PC 1이 복잡한 과정을 거쳐 192.168.2.0이라는 네트워크에 방문하는 방법을 알아내면, 다음에 또 그 네트워크에 방문할 일이 생길 때마다 불필요한 오버헤드를 덜 수 있도록, 처음 탐색을 통해 얻어낸 정보들을 다시 사용하기 위해 모두 라우팅 테이블에 저장해놓는다.
라우팅 테이블에서 얻을 수 있는 정보는 다음과 같다.
- 목표 네트워크의 IP주소(Key 값) + 서브넷 마스크
- 그 네트워크에 도달하기 위해 거쳐야 하는 게이트웨이의 IP주소(Gateway는 서로 다른 네트워크 사이의 경계에서 관문과 같은 역할을 한다.)
- 그 네트워크에 도달하기 위해 사용하는 PC의 I/F(앞에서 PC의 I/F는 여러 개가 있다고 했다.)
- 그 네트워크에 도달하는 위해 거쳐야 할 Hop의 개수 (Hop이란 라우터와 같은 '서브넷의 경계'라고 생각하면 된다. Metric으로 표시된다.)
라우팅 테이블을 확인할 때 나타나는 결과는 2가지가 있다.
- 목표 네트워크의 IP주소가 라우팅 테이블에 있는 경우
- 목표 네트워크의 IP주소가 라우팅 테이블에 없는 경우
1번의 경우일 때, PC 1은 라우팅 테이블에서 PC 4로 가는 게이트웨이의 IP 주소를 알아낸다.
하지만 2번의 경우에 Host는 라우팅 테이블에 정보가 없으므로 어디로 가야 PC 4를 찾을 수 있을지 알 수 없기 때문에, PC 1이 속한 서브넷의 기본 게이트웨이(위 그림에선 라우터의 왼쪽 I/F가 되겠다)로 프레임을 보낸다.
기본 게이트웨이는 라우팅 테이블에 IP주소가 기록되어 있다.
그럼 Host는 1, 2번의 경우 둘 다 Next Hop의 IP 주소를 알게됐다.
그럼 이제 전송이 가능한걸가?
아니다.
PC 1은 게이트웨이의 IP주소만 알 뿐, 게이트웨이의 MAC 주소는 모른다.
IP주소는 논리적인 주소일 뿐, 실제 네트워크의 통신은 MAC 주소를 통해 이루어지기 때문에, 게이트웨이에 프레임을 보내려면 게이트웨이의 MAC 주소를 알고있어야 한다.
그러면 어떻게 게이트웨이의 IP주소만 알고 있는 PC 1이 게이트웨이의 MAC주소를 알 수 있을까?
이 경우에 PC 1은 ARP 캐시를 확인한다.
ARP 캐시도 이름에서 알 수 있듯이 라우팅 테이블과 비슷한 일종의 캐시이다.
하지만 ARP 캐시는 라우팅 테이블과 다르게, IP 주소를 통해 그 IP 주소의 소유자가 가지고 있는 MAC 주소를 알아내는데 쓰인다.
ARP 캐시가 가지고 있는 정보는 다음과 같다.
- 목표 네트워크의 IP주소
- 그 네트워크의 MAC주소
- 캐시의 타입(Static / Dynamic)
캐시의 타입이 Dynamic 이라면 그 캐시는 1200초 동안 사용되지 않을 경우 사라진다. (사라지기 전에 사용된다면 다시 타이머가 1200초로 갱신된다.)
반면 Static 캐시는 시간이 지나도 자동으로 사라지지 않는다.
ARP 캐시 테이블을 확인할 때 나타나는 결과도 마찬가지로 2가지일 것이다.
- 목표 네트워크 장비의 IP주소가 ARP 캐시에 있는 경우
- 목표 네트워크 장비의 IP주소가 ARP 캐시에 없는 경우
2번 경우에 드디어 ARP가 동작한다. 이 때 ARP 프레임을 서브넷 전체에 브로드캐스트 해준다.
ARP 프레임에는 송신자의 IP주소, MAC주소, 수신자의 IP주소, MAC주소가 담긴다.
수신자의 MAC주소는 FF:FF:FF:FF:FF:FF가 되는데, 이는 브로드캐스트를 한다는 의미이다. 이 프레임을 받는 모든 Host의 I/F들은 이를 받아 디바이스 드라이버를 통해 커널에 인터럽트 요청(IRQ)을 보낸다. (이 때 수신자의 ARP Cache에 송신자의 IP주소와 MAC주소가 업데이트된다.)
브로드캐스트가 도착했으니 자신의 IP주소와 ARP 프레임의 IP주소를 비교하여 같으면 MAC주소를 전송하라는 신호를 보내는 것이다.
그렇게 ARP프레임의 '수신자의 IP주소'를 가지고 있는 Host가 자신의 MAC주소가 담긴 프레임을 유니캐스트로 ARP 브로드캐스트를 발생시킨 최초 송신자에게 보내준다.
그 정보는 ARP Cache에 업데이트되고, 최초 송신자는 목적지의 MAC주소를 알게되었으므로 이제 성공적으로 목적지로 데이터를 전송할 수 있다.
이렇게 2번 케이스의 동작 상황을 알아보았다.
하지만 위 그림과 같은 경우엔 기본 게이트웨이의 IP주소는 웬만하면 ARP 캐시에 있으므로 2번일 경우를 생각하지 않기로 한다. (기본 게이트웨이ㅡ라우터로 ARP 브로드캐스트를 보내면 라우터는 브로드캐스트를 무시하는 특성이 있기 때문에 앞과 같은 상황이 발생하지 않는다.)
어쨋든 이렇게해서 보낸 Host의 IP주소와 목적지 Host의 IP가 적힌 프레임이 라우터에 도착하게 된다.
그렇다면 라우터에서는 이제 어떤 과정이 일어나게 되는걸까?
간단하다. 앞에서 했던 작업들이 똑같이 반복된다.
앞에서는 Routing Table을 확인하여 ARP Cache를 확인하는 작업을 진행했는데,
라우터에서도 똑같이 라우터의 Routing Table을 확인하고 ARP Cache를 확인하는 과정이 수행된다.
메시지 전달과정 중 만나게 되는 'Network Layer를 다루는 모든 Node(라우터, PC 등)'에서 반복적으로 이러한 Routing Table Lookup -> ARP Cache Lookup -> Forwarding 의 흐름이 일어나는 것이다.
정리하자면 아래와 같다.
PC 1에서 PC 4의 IP 주소를 가지고 PC 4의 MAC 주소를 알아내려고 한다면, 다음과 같은 과정을 통해 ARP가 수행된다.
PC 1 라우팅테이블 체크 -> PC 1 ARP 캐시 체크 -> Next Hop(라우터)으로 프레임을 전송 -> 라우터의 라우팅테이블 체크 -> 라우터의 ARP 캐시 체크 -> 목적지(PC 4)로 프레임을 전송 -> PC 4 라우팅테이블 체크 -> PC 4 ARP 캐시 체크 -> Next Hop(라우터)으로 프레임을 전송 -> 라우터의 라우팅테이블 체크 -> 라우터의 ARP 캐시 체크 -> 목적지(PC 1)로 프레임을 전송
이상 ARP의 동작 과정에 대해 알아보았다.
'개발' 카테고리의 다른 글
어떤 정렬 알고리즘을 사용할 것인가? (0) | 2019.05.28 |
---|---|
백준 9251번 LCS 문제 풀이 (C++) (0) | 2019.04.14 |
자바에서 Vector와 Stack 컬렉션이 쓰이지 않는 이유? (1) | 2019.03.11 |
백준 5373번 큐빙 문제 풀이 (자바) (0) | 2019.03.03 |
switch와 if else 중 어떤 것을 써야하는가? (3) | 2019.02.23 |