ARP protocol: IP주소로부터 mac 주소를 찾는 프로토콜
- 모든 네트워크간 통신은 mac 주소가 필요 (data link layer에서)
ARP request is broadcast
A가 B의 IP 주소로 B에게 mac 주소를 요청
(어느 mac 주소를 모르니 B를 찾을 수 없어 broadcast 요청)
ARP reply is unicast
B가 A에게 맥주소를 응답함 (A가 보낸 패킷이니 unicast)
ARP 패킷 구조
Hardware Type: mac 주소의 유형을 나타내며 이더넷 통신시 항상 1로 설정
Protocal Type: 매핑 대상인 프로토콜 주소의 유형을 나타내며 IPv4의 경우 0x0800으로 설정
-> 프로토콜에 따른 헤더, 데이터의 길이가 각각 다르기 때문에 어떤 프로토콜인지 파악해야 해석 가능
Hardware Address Length: 하드웨어의 길이, Byte로 표시, 이더넷상에서는 0x06으로 설정
Protocal Address Length: 프로토콜 주소 길이, Byte로 표시, IPv4의 경우 0x04로 설정
Operation Code: ARP의 구체적인 동작을 나타냄
Sorce Address: source의 IP 주소와 mac 주소
Destination Address: Destination의 IP 주소와 mac 주소
Example)
A의 request는 자신의 IP, mac 주소등 ARP 헤더를 패킷에 담아 B의 IP 주소를 이용해 전달
0xFFFFFFFFFFFF는 B의 mac 주소가 들어갈 위치이다.
Broadcast로 B가 패킷을 받으면 받은 패킷에 자신의 mac 주소를 기입하고 A의 IP주소와 mac 주소를 이용해 unicast로 전달한다.
한번 request, reply가 이루어지면 양쪽 테이블에 서로의 정보가 저장된다. 이로써 B는 A에게 패킷을 보낼때 테이블에 적힌mac 주소를 이용하면 ARP request를 보낼 필요가 없다.
ARP components
mac주소를 알아내는 방식이 broadcast이기 때문에 A라는 컴퓨터가 ARP주소를 보낼 때 해당 네트워크의 모든 컴퓨터들이 자신의 테이블에 A의 mac 주소를 저장하여 후에 A에게 요청을 보낼 때 ARP 요청을 생략할 수 있다. 이러한 이점을 위한 기술들과 여러가지 상황이 존재한다.
Output module
IP 패킷을 받았을 때 작동하는 process
1. 받은 IP 패킷에 대한 데이터가 cache table에 존재할 때
1.1 받은 IP 패킷에 대한 mac주소가 존재할 때 (전에 받은 IP 주소와와 ARP 요청 응답을 한적이 있어서 mac주소가 이미 존재하는)
-mac주소를 적고 data link layer로 전송 단계가 넘어간다.
1.2 받은 IP 패킷에 대한 mac 주소가 없을 때 (받은 IP 주소가 처음이라 mac 주소를 몰라 ARP 요청을 했지만 완료되지 않않은 상태에서 또 받았을 때. cache 테이블에 받은 IP 주소에 대한 데이터는 존재하지만 mac 주소는 적혀있지 않음)
- ARP reply가 와서 받은 IP주소에 대한 mac주소를 알 때 까지 대기큐에서 대기한다.
2. 받은 IP 패킷이 cache table에 존재하지 않을 때
- cache table에 받은 IP 패킷을 Pending 상태로 넣는다.
- 대기큐를 생성하고 패킷을 넣는다.
- ARP 요청을 보낸다.
Input module
ARP 패킷을 받았을 때 동작하는 process (request, reply)
1. 받은 ARP 패킷에 대한 정보가 cache 테이블에 존재할 때 (보낸 컴퓨터의 ARP 요청을 받아본적이 있을 때)
1.1 pending 상태가 아닌 데이터에 대한 패킷이 왔지만 데이터가 달라졌을 때
- 최신화한다.
1.2 cache 테이블에 존재하지만 pending 상태인 패킷들이 응답을 받았을 때 (ARP reply를 받았을 경우?)
- 대기큐가 빌 때까지 대기하는 패킷에 대한 응답처리 (mac주소 응답)를 하고 해당 패킷을 큐에서 제거한다.
2. 받은 ARP 패킷에 대한 정보가 cache 테이블에 없을 때 (보낸 컴퓨터의 ARP 요청을 받는 것이 처음일 때)
- 테이블을 업데이트 한다.
3. 받은 패킷이 request 일 때
- 1,2 번 중 하나의 과정을 마치고 응답 패킷을 보낸다.