나중에 구현 시 빨리 참조하기 위한 노트
이더넷 헤더 14바이트
목적지 MAC 6 + 출발지 MAC 6 + 타입 2
여기서 ARP에 해당하는 타입 번호는 0x0806, RARP의 경우 0x8035
ARP 요청/응답 28바이트
하드웨어 주소 타입 2 + 프로토콜 타입 2 + 하드웨어 주소 크기 1 + 프로토콜 주소 크기 1 + 오퍼레이션 2 + 전송자 이더넷 주소 6 + 전송자 IP 주소 4 + 목표 이더넷 주소 6 + 목표 IP 주소 4
오퍼레이션 이후의 부분은 이더넷과 IP 주소 매핑인 경우를 상정한 것임.
하드웨어 주소 타입은 이더넷 주소인 경우 1로 씀.
프로토콜 주소 타입은 IP 주소인 경우 0x0800으로 씀.
하드웨어 주소 크기는 이더넷 주소인 경우 6이 되고,
프로토콜 주소 크기는 IP 주소인 경우 4가 됨.
오퍼레이션 코드는 각각
- ARP 요청 - 1
- ARP 응답 - 2
- RARP 요청 - 3
- RARP 응답 - 4
BSD 계열의 경우 캐시된 항목은 20분 타임아웃 적용하고, 아직 수신 안 된 항목은 3분의 타임아웃을 적용함.
Gratuitous ARP는 부팅하고 나서 IP 주소 충돌 확인할 목적으로 주로 사용됨. 전송자 주소와 목표 주소를 자기가 원하는 IP로 써서 확인함. 응답이 없으면 아무도 안 쓰는 것이므로 안심하고 쓰는 것임.
Proxy ARP는 별로 중요하지 않으므로 생략.
RARP 서버는 보통 유저 프로세스로 구현되는데, 이더넷 프레임 타입이 0x8035여서 특별한 방법을 쓰지 않으면 커널에서 이런 패킷을 받아올 방법이 없음. 이럴 때 사용되는게 BSD Packet Filter (BPF), Sun's Network Interface Tap, SVR4 Data Link Provider Interface 같은 부류.
사용 예로는 디스크 없는 장비에서 NIC 롬에 쓰인 MAC 긁어서 RARP 요청 보내고, RARP 응답으로 IP 받은 다음, TFTP로 부트 이미지를 읽어오는 경우를 생각하면 됨.