
이런 네트워크가 있다고 해보자. 또, 각각의 Router들은 자신만의 Routing Table을 가지고, Host들도 자신만의 Routing Table을 가지고 있을 것이다. 예를 들어 192.16.7.2라는 host가 194.17.21.7이라는 host로 데이터를 보내고 싶다면 Destination Address와 Source Address를 각각 194.17.21.7과 192.16.7.2로 설정하고 보내면 된다. 이러면 192.16.7.0에 연결된 host나 router들에게 Broadcast하게 자신의 데이터그램을 보내고, 각각의 host나 router들은 그 데이터그램을 받아 Routing table을 lookup하여 Mask값을 적용한 후, 엔트리의 Destination address와 같은 값이 나온다면 그곳으로 보내고, 아니라면 해당 데이터그램을 버리고 요청을 무시하면 된다. 자신에게 전달된 패킷이 아니기 때문이다.
이렇게 하면 Source에서 Destination까지 데이터그램이 잘 전달될 것 같다. Destination address가 194.17.21.7 이라는 패킷을 R5가 받는다면 거기서부터는 Direct Delivery로 host에게 전달하면 되기 때문이다.
❗️그러나, 사실은 이렇게 동작하지 않는다. ❗️
지금 우리가 사용했던 주소는 IP 주소이다. 즉, Network layer에서 사용하는 논리 주소라는 뜻이다. 그러나, LAN, 즉 Network layer보다 하위 계층인 Physical layer와 Datalink layer을 포함하는 LAN에서는 우리가 물리 주소인 MAC Address를 사용해서 패킷을 전달한다. 패킷을 전달하려면 결국 물리적으로 전기신호를 보내야 하는데, IP주소는 물리적으로 신호를 보낼 때 사용되는 주소가 아니라는 말이다. 물리적으로 보내는 LAN에서는 Physical address를 사용해서 신호를 보냈다.
그래서 실제로는 패킷을 보낼 때는 IP주소가 아니라 MAC Address를 사용해서 Source와 Destination의 위치를 파악하고 전송한다. 그러면, Sender는 Destination의 IP주소 뿐만 아니라 MAC Address 주소를 알아야 패킷을 보낼 수 있다. 이때 사용되는 것이 ARP라는 프로토콜이다.

ARP 프로토콜은 다음과 같은 단계로 진행된다.

✨ ARP Cache Table은 ARP를 실행한 이후에, Receiver의 MAC 주소들을 저장하고 있는 캐시 테이블이다. 그러나, Receiver의 MAC 주소가 바뀌었다면, Table의 정보와 실제 주소 정보가 달라 통신에 장애가 발생하므로 Receiver가 자신에게 패킷을 보냈을 때부터 타이머를 구동하여 일정 시간 내에 다시 패킷이 오지 않는다면 Cache table에서 해당 주소를 삭제한다. 이후, 이 Receiver로 패킷을 전송하고자 한다면 다시 ARP를 사용하면 된다.
✨ ARP request는 Broadcast하게 전송되고, ARP response는 unicast하게 전송된다.

ARP packet은 다음과 같은 구조로 되어있다.

이 ARP packet은 Datalink Frame의 Data 자리에 들어가게 된다.
왜 저 자리에 들어갈까?
ARP는 Network layer에서 사용하는 프로토콜이기 때문에 하위 계층인 Datalink layer의 Frame에 들어갈 때 Data자리에 캡슐화되어 들어가는 것이다.

그러면 다시 맨 처음의 예시로 돌아와보자. 192.16.7.2가 194.17.21.7에게 패킷을 보내고 싶다면 어떤 과정을 거칠까?(라우팅 과정 생략)
❗️ 주목할 점은 여기서 IP 패킷에 들어가는 Source address와 Destination address, 논리주소는 바뀌지 않지만, Frame에 들어가는 Source address와 Destination address, 즉 물리주소들은 계속해서 바뀐다.
❗️그래서 IP주소 같은 논리 주소는 전세계적으로 유일한 값이어야 하지만 MAC Address와 같은 물리 주소는 로컬에서만 사용되는 주소이기에 유일한 값이 아니어도 된다.

ARP는 앞선 설명처럼 같은 네트워크 안에서 통신하기 위해 주소를 요청하는 방식으로, 다른 네트워크로는 ARP 요청이 가지 못한다. 때문에, 다른 네트워크로 패킷을 보내고자 한다면 ARP 요청을 최소 2번 이상 거쳐야 한다. 그렇지만, Proxy ARP를 사용한다면 다른 네트워크에 접속된 Router가 이미 host의 MAC 주소를 알고 있기 때문에 자신이 Destination인 척(Proxy) 자신의 MAC 주소를 Sender에게 전달하는 방식이다. 예를 들어, 위의 그림처럼 하나의 네트워크가 여러 개로 Subnetting된 네트워크에서 Sender가 다른 서브넷으로 패킷을 보내고자 할 때 ARP Request를 보낸다면, Subnetting된 네트워크를 관리하는 Proxy ARP Router가 해당 Request를 받아 자신의 MAC 주소를 Sender에게 보내준다. 이후, 이 Router는 자신의 서브넷에 있는 host의 MAC 주소를 알고 있으니 그 host에게 패킷을 최종적으로 전달하게 된다.
헷갈리면 안되는게, 단순히 Proxy ARP는 목적지까지 가기 위해 Router가 자신의 MAC 주소를 알려주고 여기로 보내는구나! 라고 이해하면 안된다. 다른 네트워크로 가기 위해 Indirect Delivery를 하는 것은 Network Layer 단에서 라우팅하는 개념이기 때문에 여기 Proxy ARP를 적용하진 않는다. 단순히 라우팅을 위해 패킷을 다른 라우터로 옮기는 ARP는 해당 단계에서 이루어질 수 있지만, Proxy ARP는 동일한 네트워크에서 서브넷팅 된 다른 서브넷으로 보내는 것이다. 보내는 라우터는 Direct라고 생각하고 보내는데, 받는 입장에서는 indirect하게 받는 것이다. 라우팅 과정을 거치지 않고 바로 Destination으로 연결할 수 있게 자신의 MAC 주소를 주고 중개해주는 느낌이다.
라우터의 기능 중 Proxy ARP 기능을 지원하는 라우터가 있다고 생각하면 된다.