개념적으로 IP주소
를 주면 ARP
는 MAC주소
를 아웃풋으로 내보낸다. Hop-to-Hop
을 하기 위해서는 ARP가 필요하다.
그림(a)는 멀티캐스트가 아니라 브로드캐스트 상황이다. A가 B한테 보내는 상황이다. B의 MAC주소를 모를 때 Request를 보낸다. 회색 말풍선에 들어있는 IP주소를 가지고 있는 곳에서만 MAC주소가 무엇인지 응답을 해준다. 이 응답은 보낸 쪽인 A한테만 간다.
맨 위의 칸에는 MAC의 유형을 나타내며 보통 1
로 고정이다. 그리고 프로토콜 타입은 IPv4인 경우에 0x0800
으로 설정이 된다.
두번째 칸에는 맥주소의 길이로 보통0x06
, 프로토콜 주소의 길이로 보통 0x04
그리고 Operation Code는 위 그림의 오른쪽 파란색 표에서 4개중 하나가 선택된다. 여기서 RARP
는 ARP
와 반대로 인풋이 MAC주소이고 아웃풋이 IP주소이다.
아래 네칸은 차례대로 보내는 곳의 IP와 MAC주소, 받는 곳의 IP와 MAC주소가 들어간다.
Preamble and SFD
에는 싱크를 제대로 읽기 위해서 도와주는 패턴이 들어있다. Destination
과 Source
는 MAC주소가 들어간다. Data
에는 일반적으로 IP datagram이나 ARP가 들어가는데, 이를 구분해줄 수 있는게 앞의 Type
이다. 이 데이터의 맥시멈이 MTU
이다. ARP 구조에서 봤던 헤더 표가 저 데이터 영역에 들어간다고 생각하면 된다.
처음에 다 1로 되어있는 상태로 보내는 것이 MAC주소용 브로드캐스트 주소이다. 세번째 칸에는 보내는 곳의 MAC주소가 들어간다. 그리고 헤더에서 세번째 칸은 찾고자 하는 MAC주소를 모르기 때문에 다 0으로 된 것을 보낸 것이다. 상대방이 보낼 때에는 이제 MAC주소를 알기 때문에 내 MAC주소와 보내는 곳의 주소를 담아서 보내준다.
IP packet
을 받은 경우에 우선 cache table
을 찾아본다.
만약에 Entry가 없는 경우에는 Entry를 만들고 P상태
가 된다. 그리고 Attempt=1을 추가한다. 큐를 생성하여 큐에 넣은 후 ARP request
를 보낸다.
만약에 Entry가 있는 경우에는 P상태
인 경우에는 큐에 넣어두고 R상태
인 경우에는 MAC주소를 가져와 전송한다.
ARP packet
을 받을 경우에 cache table
을 찾아본다.
만약에 Entry가 없는 경우에는 Entry를 만들고 테이블에 추가한다.
만약에 Entry가 있는 경우에는 Entry를 업데이트 해줄건데 P상태
인 경우에는 큐에 있던 모든 패킷을 전송하고 R상태
인 경우에는 타임아웃을 초기화한다.
ARP Request
를 받은 경우에 ARP reply를 보낸다.
주기적으로 cache table
을 관리 해준다. 오래되면 지워버린다. 우리 예제에서는 60초를 기준으로 만약 R상태
이면 60초를 기다린다. 그리고 타이머 값이 0보다 같거나 작으면 지워버린다.
만약 P상태
라면 몇번을 시도했는지 본다. 우리 수도코드에서는 5로 해놨는데 5가 되었다면 지워버린다.