티스토리 뷰

728x90
반응형

링크 계층에서의 전송(1홉 통신) 시 문제 의식


우리가 네이버에서 제공하는 서비스들을 이용하려면 먼저 네이버 서버와 통신을 해야 하고, 그 방법들 중 가장 보편적으로 www.naver.com 의 도메인 주소로 접속합니다. www.naver.com이란 도메인은 DNS 서버에서 매핑되어 있는 네이버의 ip로 바꿔 전송해 줍니다. 즉, 우리는 네이버의 ip주소를 이용해 네이버 서버와 통신을 하게 되는 것이고, 이는 네트워크 계층 통신이라고 이해할 수 있습니다. 실제 네트워크 계층은 Internet Protocol을 이용하고, 이 ip를 통해 멀티홉 통신을 합니다. 

하지만 네트워크 통신의 계층적 구조를 생각해 보면, 멀티홉 통신을 하기 위해서는 결국 1홉 통신이 먼저 가능해야 합니다. 어떻게 보면 멀티홉 통신은 1홉 통신의 연속입니다. 패킷 해더의 목적지 ip 주소는 패킷이 멀티홉을 거쳐 최종 목적지로 가기 위한 정보라면, 당장 다음 노드(ex. 라우터)로 패킷을 보내기 위해서는 MAC address(물리적 주소 or 이더넷 주소)가 필요합니다.

여기서 이제 공부하는 우리는 문제의식을 가질 수 있습니다. 네이버에 접속하려고 하는 사람 중 네이버 서버의 MAC 주소를 아는 사람은 아마 없을 겁니다.... IP주소를 어쩌다 가끔 외우고 있는 사람은 있을 지라도 MAC 주소를 알 수는 없습니다. 하지만 어떻게 우리는 당장 1홉 앞의 라우터에 전송 요청 패킷을 보내 네이버 서버에 접속할 수 있을까요 ? 1홉 앞의 라우터 MAC 주소를 아는 것도 물론 아니잖아요 ? 이를 가능하게 해 주는 것이 ARP입니다.

 

MAC(Media Access Control) Address


맥 주소는 NIC(Network Interface Card)에 등록되어 있는 6바이트 주소다. ip주소가 살고 있는 집 주소라면, MAC 주소는 자신의 주민등록번호 같은 것이다. ip 주소는 다른 ip 주소로 바뀔 수 있지만 MAC 주소는 바뀌지 않습니다. 기본 적으로 통신을 할려면 NIC가 장착되어 있어야 하고, NIC가 장착되어 있는 호스트나 라우터는 모두 기계의 주민등록번호같은 고유의 MAC 주소를 가지고 있다.

국제 IEEE가 규정을 따르는 표준 MAC 주소는 총 48비트로 구성되어 있습니다. 이 중 첫 24비트는 OUI(Organizational Unique Identifier) 제조업체의 식별코드이며, NIC 제조업체의 정보를 파악할 수 있고, 24비트는 해당 업체의 랜 카드의 정보를 담고 있습니다.

 

IP 주소로 MAC 주소 알아내기 = ARP


위에서 말씀드렸듯이 MAC 주소를 알아야 당장 1홉 간의 통신을 할 수 있고, 데이터를 보낼 수 있습니다. 하지만 IP 주소 밖에 모르기 때문에 불가능 할 것 같지만 이를 가능하게 해주는 프로토콜이 ARP 입니다.

ARP의 기본 개념은 목적지 IP 주소로 목적지 MAC 주소를 알아온다 입니다.

예를 들어보며 ARP의 과정을 알아보겠습니다.

호스트 A가 호스트 C에게 데이터를 보내야 할 경우

호스트 A는 네트워크 계층에서 자신의 ip 주소 222.222.222.222와 목적지 ip 주소(호스트 C) 222.222.222.220의 정보를 패킷 헤더에 기록한 후 캡슐화합니다. 그런 다음 데이터 링크 계층으로 내려 자신의 MAC 주소와 호스트 C의 MAC 주소를 다시 헤더에 기록할려고 하지만 호스트 C의 MAC 주소를 모르는 상황입니다. 때문에 패킷을 데이터 링크 계층으로 내릴 수 없고, 전송할 수 없게 됩니다.

이 때 호스트 A는 ARP Table을 참조해 봅니다. 

ARP table

ARP table에는 자신이 속한 서브넷 마스크 영역(브로드캐스트 영역 or 하나의 라우터를 거치기 전 로컬 영역)에 있는 호스트 혹은 라우터들의 IP 주소와 MAC 주소가 적혀 있습니다. 따라서 이 ARP table을 보면 목적지 IP 주소에 맞는 목적지 MAC 주소를 손쉽게 알아낼 수가 있습니다.

하지만 자세히 보면 위의 테이블에는 두 개의 노드 정보밖에 적혀있지 않습니다. 그 이유는 TTL(Time-to-Live) 때문입니다. TTL은 해당 데이터의 유효기간을 나타내는 시간으로 보통 15~20분이 유효한 최대 시간입니다. 이 시간이 지나게 되면 ARP table에서 그 데이터는 사라지게 됩니다. 즉, ARP table은 캐시 정보입니다.

때문에 ARP table에 호스트 C 정보가 있었다면 좋았겠지만, 안타깝게 이 ARP table로는 호스트 C의 MAC 주소를 알 수 없습니다. 결국 호스트 A는 ARP packet을 만들게 됩니다.

호스트 A는 원래의 패킷을 잠시 저장해 두고, 새로운 ARP 패킷(ARP request)을 제작합니다. 이 ARP 패킷의 구조는 잠시 미뤄두고, 알아야될 중요 정보는 4가지입니다.

sender's ip address 222.222.222.222
sender's mac address 49-BD-D2-C7-56-2A
target's ip address 222.222.222.220
target's mac address  ?

현재 호스트 C의 MAC 주소는 모르는 상황이기 때문에 ?이고, 이를 채우는 것이 목적입니다.

이제 ARP 패킷을 보내서 MAC 주소를 알아와야 하는데 여기서 또 문제가 있습니다. 당장 호스트 C의 MAC 주소를 모르는데 또 어떻게 보내나요 ??????

ARP packet을 데이터 링크 계층으로 내려 Ethernet header를 붙일 때, destination address(수신 주소)를 FF-FF-FF-FF-FF-FF로 설정합니다. 이 FF-FF-FF-FF-FF-FF MAC 주소의 의미는 브로드캐스트 주소입니다. 이 브로드캐스트 주소로 패킷을 내려 보내면, 브로드캐스트 영역(하나의 라우터를 넘어가기 전 라우터까지)에 있는 모든 호스트와 라우터가 패킷을 수신하게 됩니다. 즉, 목적지의 MAC 주소를 모르기 때문에 모든 노드를 목적지로 만들어 버린 것입니다. 

이때 호스트는 패킷을 열어보고 target's ip address가 자신의 ip address와 맞지 않으면 버리고, 일치하면 자신의 MAC address를 적은 후 Ethernet destination address를 Ethernet source address(송신 자, 여기서는 호스트 A)로 고친 ARP 패킷(ARP reply)을 보냅니다. (참고로 sender와 target은 바뀌어야 겠죠?) 단, 이 ARP 패킷을 송수신 하는 것은 다른 프로토콜이 아닌 ARP에서 이루어 집니다.

이제 호스트 A는 호스트 C가 보낸 ARP 패킷을 받고 호스트 C의 MAC 주소를 ARP table에 기록합니다. 그럼 위의 table은 대충 예상해 보면 아래처럼 업데이트 될 것입니다.

IP Address MAC Address TTL
222.222.222.221 88-B2-EF-54-1A-OF 13:45:00
222.222.222.223 5C-66-AB-90-75-B1 13:52:00
222.222.222.220 1A-23-F9-CD-06-9B 15:00:00

또한 아까 저장해 놨던 원래의 패킷에 호스트 C의 MAC 주소를 적고 데이터 링크 계층으로 내려 호스트 C에게 보냅니다.

 

이번에는 라우터 하나를 거쳐 다른 로컬 네트워크에 있는 호스트에게 데이터를 보내야 합니다. 만약 IP : 111.111.111.111인 호스트가 IP : 222.222.222.222인 호스트에게 데이터를 보내야 하는데 MAC 주소를 모르는 상황입니다. 이때 역시 위와 같은 방법을 이용하면 될 것 같지만 고민이 생깁니다.

두 호스트는 다른 로컬 네트워크 영역에 있습니다. 이 말은 다른 브로드캐스트 영역이므로 브로드캐스트한 ARP 패킷이 목적지 호스트에 도착하지 못한다는 것입니다. 이는 매우 난감한 상황입니다.

하지만 똑똑한 라우터덕에 이 문제는 아무것도 아니게 됩니다. 호스트는 목적지 IP주소와 자신의 IP주소가 일치하지 않으면 과감히 패킷을 버립니다. 하지만 라우터는 데이터 포워딩 테이블을 봅니다. 이 데이터 포워딩 테이블에는 라우터에 연결된 호스트나 스위치들의 IP 정보 등이 적혀있습니다. (자세한건 다음 포스트에 적겠습니다.)

라우터는 데이터 포워딩 테이블을 참조해 패킷의 목적지 IP 주소가 자신과 일치하지 않더라도 건너편에 있는 호스트의 IP 주소가 테이블에 적혀있다면, 라우터가 대신 응답해 줍니다. 왜냐하면 라우터 자신은 패킷을 받아 건너편에 있는 호스트에게 전달할 수 있는 능력이 되기 때문입니다. 따라서 응답을 할 때 일단 먼저 자신의 MAC 주소를 적어 ARP Reply 패킷을 보냅니다. 그러면 IP : 111.111.111.111 호스트는 라우터의 MAC 주소로 패킷을 보내고, 라우터는 이 패킷을 받아 건너편의 호스트에게 전달합니다. 물론 이 때도 MAC 주소를 모른다면 전과 같은 방법을 이용합니다.

 

ARP packet format


Ethernet destination addr : 이더넷 목적지 주소로 FF-FF-FF-FF-FF-FF(브로드캐스트 주소)로 설정

Ethernet source addr : ARP 패킷을 송신하는 호스트 MAC 주소

frame type : 프레임 타입 필트로 ARP request/reply 프레임의 경우 0x8060

hard type : MAC 주소의 유형을 나타낸다. 이더넷의 경우 1

prot type : 프로토콜 유형으로 ip의 경우 0x0800

hard size : MAC 주소의 길이를 byte로

prot size : 프로토콜 주소의 길이를 byte로

op : Operation Field로 수행할 동작을 의미

1 - ARP request

2 - ARP reply

3 - RARP  request

4 - RARP reply

나머지는 위에서 설명했으므로 생략하겠습니다.

 

References

  • Computer_Networking_A_Top-Down_Approach - James Kurose, Keith Ross
728x90
반응형

'CS > 네트워크 공부' 카테고리의 다른 글

[네트워크] OSI 7 계층 개요  (1) 2023.03.26
[네트워크] 소켓 프로그래밍 개요  (0) 2023.03.26
Network Layer  (0) 2019.05.26
raw socket을 이용한 packet sniffing  (0) 2019.05.06
Packet switching 더 자세히...  (2) 2019.03.25
댓글