ARP (주소 결정 프로토콜)

게임 서버 프로그래밍/네트워크 개념정리

2020. 2. 18. 14:19

등장배경

서로 다른 링크 계층 프로토콜로 연결된 네트워크 사이에서 IPv4로 어떻게 패킷을 전달하는가?

패킷 전달 방식

이더넷 모듈은 IP 주소만으로 패킷을 전달할 수 없다. IP주소는 링크 계층이 아닌 네트워크 계층 개념이기 때문이다.

링크 계층은 IP주소를 이에 대응하는 MAC 주소로 변환하는 방법을 알고 있어야 한다.

링크 계층에서의 ARP가 이러한 변환을 수행한다.

 

ARP 구성

NIC가 어느 MAC 주소에 대응되는지 질의하는 패킷구조

짝을 이루는 여러 NIC와 MAC 주소 쌍을 정리해둔 표

IP Address MAC Address
18.19.0.1 01:01:01:00:00:10
18.19.0.3 01:01:01:00:00:30

ARP를 이용한  패킷 전달 방식

- 수신자의 IP 주소에 대응하는 MAC 주소를 ARP 테이블에서 찾는다.

- MAC 주소를 찾았다면 IP 모듈은 해당 MAC 주소를 포함한 링크 계층 프레임을 만들어 이를 링크 계층 모듈에 전달한다.

- 테이블에서 찾지 못한 경우 ARP 모듈이 링크 계층 네트워크에서 도달 가능한 모든 호스트에 ARP 패킷을 발신하여 올바른 MAC 주소를 찾고자 시도하게 된다.

 

ARP 패킷 구조

 

Hardware Type (16 bit)

링크 계층이 호스팅된 하드웨어 종류를 정의한다. 이더넷의 경우 1이다.

 

Protocol Type (16bit)

네트워크 계층 프로토콜의 이더타입 값과 일치하다. IPv4 라면 0x8000이다.

 

Hardware Length (8 bit)

링크 계층 하드웨어 주소의 길이를 바이트로 나타낸다. 대부분 경우 MAC 주소는 6바이트다.

 

Protocol Length (8 bit)

네트워크 계층 논리 주소의 바이트 길이다. IPv4의 IP 주소 길이는 4바이트이다.

 

Operation (16 bit)

1 or 2의 값. 이 패킷이 요청(1)인지 응답(2)인지를 나타낸다.

 

Sender Hardware Address, Sender Protocol Address (가변 길이)

각각 하드웨어 주소 및 네트워크 계층 주소를 나타낸다. Hardware Length, ProtocolLength와 일치해야 한다.

 

Target Hardware Address, Target Protocol Address (가변 길이)

각각 하드웨어 주소 및 네트워크 계층 주소를 나타낸다. 주소 질의를 요청하는 경우, 목적지 하드웨어 주소는

알 수 없는 상태이므로 패킷을 받는 측에선 이 내용을 무시한다.

 

ARP Table에 대응하는 MAC주소가 없을 경우

- 호스트A가 이더넷 브로드캐스트 주소 FF:FF:FF:FF:FF:FF로 패킷을 발신한다. 네트워크상 모든 호스트가 이 프레임을 받아 살펴보게 된다.

- 프레임을 받은 호스트(호스트B라 칭함) 중 목적지 IP주소가 자신의 주소와 일치하는 경우 ARP 패킷을 하나 만들어 응답하는데, 자신의 주소를 발신지로, 프레임을 보낸 호스트의 주소를 목적지로 한다.

- ARP 테이블에 호스트 B에대한 MAC 주소를 갱신하고 B 호스트 MAC 주소에 IP 패킷을 이더넷 프레임에 포함하여 보낸다.

 

추가 설명

호스트 A가 ARP 요청을 네트워크상 모든 호스트에 처음 브로드캐스트할 때, 다른 호스트들이 호스트 A의 MAC 주소와 IP 주소를 매핑해 둔다. 이렇게 미리 갱신해 두면 나중에 통신할 필요가 생겼을 때 ARP 요청부터 보내지 않아도 된다.

 

한편으론 악성 호스트가 모든 IP를 자기 것인 양 조작한 ARP 패킷을 뿌릴 수 있다. ARP 정보가 검증된 것인지 확인할 방도가 없다면, 스위치 장비가 의도치 않게 모든 패킷을 악성 호스트에 바치는 결과가 나타날 수 있다.

'게임 서버 프로그래밍 > 네트워크 개념정리' 카테고리의 다른 글

UDP (User Datagram Protocol)  (0) 2020.02.19
서브넷과 서브넷 마스크  (0) 2020.02.18
IP 주소와 패킷 구조  (0) 2020.02.18
이더넷/IEEE 802.3  (0) 2020.02.18
락스텝 알고리즘  (0) 2020.02.18