> [!abstract] Introduction > OSI 7계층 중 2, 3계층이 주소를 가지고 있지만, 2계층의 MAC 주소와 3계층의 IP 주소는 아무런 관계가 없습니다. 그렇다면 MAC 주소는 IP 주소와 어떻게 연결되어 있는 걸까요? 이번 글에서는 MAC 주소와 IP 주소를 연결하는 프로토콜인 ARP*Address Resolution Protocol*에 대해 알아보겠습니다. # 네트워크 통신의 수수께끼 OSI 모델의 관점에서 네트워크 통신은 다음과 같은 형태로 이루어져 있다. 여기서 주목할 만한 영역은 바로 2계층인 데이터 링크 계층과 3계층인 네트워크 계층이다. ![[OSIModel.png]] 네트워크 통신에서는 안정성을 위해 데이터를 여러 개의 패킷*Packet*으로 쪼개서 보내는데, 위에 나와있는 것과 같이 각 계층에서 사용하는 패킷의 이름이 다르다. 2계층에서 사용하는 패킷의 이름은 프레임*Frame*이며, 가장 흔하게 사용되는 프레임인 이더넷 프레임*Ethernet Frame*의 구조는 아래와 같다. ![[EthernetFrameFormat.png]] 여기서 이더넷 프레임의 구조를 보면 출발지와 도착지의 MAC 주소가 들어가는 자리가 있다는 것을 확인할 수 있다. 이제 3계층을 보자. 3계층에서 사용하는 패킷의 이름은 똑같이 패킷이며 그 구조는 아래와 같이 이전 계층의 패킷에서 해당 계층의 맨 앞과 맨 뒤를 제거한 모습이다. ![[FrameAndPacket.png]] 그래서 네트워크 계층의 패킷에 남는 것은 패킷 헤더, TCP 헤더, 그리고 사용자 데이터다. 여기서 대표적인 패킷 헤더인 IPv4 헤더를 살펴보자. IPv4 헤더는 아래와 같은 구조를 지니고 있다. ![[IPv4Header.png]] 여기서 Source Address, Destination Address에 해당하는 영역은 IP 주소를 입력하는 영역이고 MAC 주소를 입력하는 곳은 하나도 없다. 그렇다면 목적지의 MAC 주소는 어떻게 가져오는 걸까? 여기 4대의 호스트*Host*와 2개의 스위치*Switch*, 그리고 라우터*Router* 한 개로 구성된 네트워크에서 호스트 1이 어떻게 나머지 호스트의 MAC 주소를 알아내는지 살펴보자. ![[TwoSwitchedEthernetLANsJoinedByARouter.png]] # ARP의 과정 ARP가 바로 여기서 등장한다. ARP는 Address Resolution Protocol의 약자로, 말 그대로 IP 주소를 MAC 주소로 변환하기 위한 통신 규약이다. 기존의 IPv4 헤더에는 MAC 주소를 담는 곳이 없다는 것을 확인했을 것이다. ARP가 실시되는 과정에서 사용되는 ARP 패킷이 따로 있다. 우선 이 ARP 패킷의 구조부터 살펴보자. ## ARP 패킷 ARP 패킷의 구조는 아래와 같다. 가장 먼저 살펴볼 부분은 송신자*Sender*와 대상자*Target*의 MAC 주소인데, 아래 그림에서는 각각 SourceHardwareAddr과 TargetHardwareAddr로 표기되어 있다. 다음으로 살펴볼 것은 송신자와 대상자의 IP 주소로, 그림에서는 각각 SourceProtocolAddr와 TargetProtocolAddr로 표기되어 있다. ARP 패킷의 동작 과정을 이해하기 위해서는 이 네 필드가 중요하다. ![[ARPPacketFormat.png]] ARP는 기본적으로 물리 네트워크의 유형을 가리지 않는데, 이는 Hardware type이라 적혀있는 필드의 공이 크다. 이 필드는 ARP가 수행되고 있는 네트워크의 유형을 정의하는 16비트 필드이며, 이더넷을 사용하는 상황을 가정하고 있기에 그 값이 `1`이다. 또한 ARP는 상위 프로토콜의 종류와 상관없이 사용할 수 있는데, 이는 ProtocolType이라 적혀있는 필드의 공이 크다. 이 필드는 3계층 프로토콜의 종류를 정의하는 16비트 필드이며, 그림에서는 IPv4를 사용하는 상황을 가정하여 그 값을 `0x0800`으로 설정했다. HLen과 PLen이라 적혀있는 필드는 각각 물리 주소와 논리 주소의 길이를 바이트 단위로 정의하여 저장하는 필드이며, 그림에서는 각각 MAC 주소와 IPv4 주소에 맞게 48비트와 32비트로 설정되어 있다. 마지막으로 Operation이라는 이름의 16비트 필드는 뒤이어 설명할 ARP의 작동 방식과 관계되어 있기 때문에 나중에 같이 살펴본다. ## ARP 요청과 ARP 응답 ARP에서는 송신자 측에서 대상자의 MAC 주소를 알기 위해 하는 ARP 요청*ARP Request*과 대상자 측에서 송신자가 요청한 MAC 주소를 알려주는 ARP 응답*ARP Reply*를 정의하고 있다. 우선 호스트 2의 IP 주소(IP2)인 `192.32.65.5`를 대상자 IP 주소로 적었다고 생각해보자. 지금은 송신자의 MAC 주소는 알아도 대상자의 MAC 주소는 알 수가 없는 상황이다. 여기서 송신자의 MAC 주소를 알기 위해 호스트 1은 대상자의 MAC 주소란(TargetHardwareAddr)에 1을 채운다. 그러면 대상자의 MAC 주소는 `ff:ff:ff:ff:ff:ff`가 되는데, 이것이 바로 브로드캐스트*Broadcast*다. > [!attention] Broadcast > 브로드캐스트는 네트워크에서 사용하는 통신 방식 중 하나로, 하나의 호스트에서 출발해 동일 네트워크에 존재하는 모든 호스트로 데이터를 보낸다. 기본적으로 IP주소는 알려진 상태에서 통신을 하기 때문에 송신자와 대상자의 IP 주소는 제대로 적혀 있다. 하지만 2계층 목적지 주소가 브로드캐스트이기 때문에 이 ARP 패킷은 같은 네트워크 안에 있는 모든 단말에 보내지고 모든 단말은 ARP 프로토콜 내용을 확인하는데, 각 단말은 대상자 IP가 자신이 맞는지 확인하고 자신이 아니면 ARP 패킷을 버린다. 그러면 호스트 2에서는 자신에게 온 패킷이 맞기 떄문에 버리지 않고 수신한다. > [!attention] Operation Field > 이 패킷을 받아들면 Operation 필드의 값은 1로 되어 있을 것인데, 이는 ARP 요청시 사용하는 패킷에는 Operation 필드에 1이 저장되고 ARP 응답시 사용하는 패킷에는 Operation 필드에 2가 저장되기 때문이다. 이제 호스트 2가 패킷을 수신했으니 그에 대한 응답을 보낼 차례다. 이때는 송신자와 대상자의 위치가 바뀌고, 처음 보냈던 ARP 요청과 달리 호스트 2에서는 호스트 1의 IP 주소(`192.32.65.7`)와 MAC 주소(`E1`)까지 알고 있어 ARP 패킷의 모든 필드를 제대로 된 정보로 채워서 보낼 수 있다. 대상자의 MAC 주소와 IP 주소는 호스트 1의 것을 그대로 쓰면 되고, 송신자의 MAC 주소와 IP 주소는 호스트 2의 것으로 채워서 응답하면 된다. 그래서 ARP 응답은 브로드캐스트였던 ARP 요청과 달리 모든 주소가 명시되어 있는 유니캐스트*Unicast* 방식으로 진행된다. > [!attention] Unicast > 유니캐스트는 브로드캐스트처럼 네트워크에서 사용하는 통신 방식 중 하나로, 하나의 호스트에서 출발해 동일 네트워크에 존재하는 특정 호스트로 데이터를 보낸다. 호스트 1은 호스트 2에서 보낸 ARP 응답 패킷을 받아 자신의 ARP 캐시 테이블을 갱신한다. 이 ARP 캐시 테이블은 정해진 시간 동안 호스트 2와의 통신이 없을 때까지 유지되며, 해당 시간 안에 통신이 다시 이루어지면 그 시간은 다시 초기화된다. 그리고 이때부터는 상대방의 MAC 주소를 알고 있기 때문에 정상적으로 유니캐스트 통신을 수행할 수 있다. 나머지 호스트와도 같은 방식으로 통신하며 결국 호스트 1은 모든 호스트의 MAC 주소를 저장할 수 있게 된다. ARP를 통해 우리는 상대방의 MAC 주소를 몰라도 IP 주소만으로도 네트워크 위에서 상대방과 통신할 수 있다. --- # 출처 - https://dad-rock.tistory.com/201 - Peterson, L.L. and Davie, B.S. (2022) _Computer Networks: A Systems Approach_. Cambridge, MA. - Tanenbaum, A.S., Feamster, N. and Wetherall, D.J. (2021) _Computer Networks_. 6th edn. Pearson. - _IT 엔지니어를 위한 네트워크 입문_ (2020). (주)도서출판길벗.