CS/네트워크

[Network] 짧은 상식, MAC와 IP 주소값은 어떻게 만들어질까?

장아장 2024. 1. 25. 20:57

네트워크 관련 공부를 하면서, 물리적인 장치의 주소는 MAC주소로, 

논리적인 주소는 IP로 담는다는 것을 알게 되었다. 

 

그렇다면, 이 MAC 주소와 IP 주소는 어떻게 생겼을까? 그리고 무슨 규칙성을 가지게 될까?

 

이 부분에 대해서 정리해야겠다는 생각이 들었다. 

 


MAC

MAC 주소가 만들어지는 원리는 생각보다 단순하다. 

주소는 물리적 장치의 주소이며, 이는 Network Interface Card(NIC)라는 하드웨어 장치가 6바이트 주소를 가지고 있게 한다. 

이 주소를 통해 물리적 장치의 고유 식별번호가 생기는 것이다.

 

맥 주소는 하드웨어를 생산할 때 해당 제조사에서 직접 부여하는 방식으로 진행된다(마치 태어나서 주민등록번호를 받고 평생 같이사는 우리같다)

맥 주소는 총 6바이트로 이루어져 있으며, 일반적으로는 1바이트씩 나누어 표기한다. 

그렇게 이런 주소로 태어난 장치가 있다고 생각해보자. 

이렇게 붙은 순간, hop by hop으로 통신이 오갈때 내 장치의 주소는 평생 이렇게 되는 것이다.(NIC를 바꾸면 바꿀 수 있을지도?)

 

이제 이 주소를 반으로 쪼개보자. 

이렇게 앞 뒤로 3바이트씩 쪼갰을 때, 이 둘은 서로 다른 의미를 가지고 있다. 

07:01:02는 제조사 식별 번호로, 네트워크 카드(NIC)를 만든 회사의 고유 식별번호이다. OUI라고 부르기도 한다. 

 

뒤의 01:2C:4B는 제조사 내에서 이 장치에 부여한 고유 식별 번호를 말한다. 

우리가 노트북을 사거나 할 때, 안의 태그에도 붙어있다

(예전에 내 맥을 수리맡길 때, 이걸 찍어서 보내달라고 한 적이 있었다. 이제야 이유를 알겠...)

 

MAC 주소는 거미줄처럼 얽히고 섥혀있는 구조이다. 

여기에서 통신을 할 때에는 정확한 단일 개체를 향한 송신, 정확한 다중 개체를 향한 송신, 그냥 뿌리기가 존재한다. 

이걸 우리는 유니캐스트, 멀티캐스트, 브로드캐스트라고 한다. 

 

브로드캐스트의 경우에는, FF:FF:FF:FF:FF:FF로 보내는 방식이다. (즉, 만들 수 있는 최댓값으로 쏘게 된다)

멀티캐스트는 정보통신기술용어해설에 따르면 아래와 같은 주소일 때 가능하다고 나온다. 

 48 비트 MAC 주소에서 최상위 Octet에서 최하위 비트가 1인 경우를 멀티캐스트 주소로 정함

 

무슨 말인지 쉽게 봤을 때, 우리가 나눈 6자리에서 첫 째 자리를 보자. 

여기에서 1의 자리가 홀수면 된다.(이게 다다.)

그 외에도 특정 용도로 정해진 멀티캐스트용 주소가 있다고 한다. 

이 외의 모든 주소는 유니캐스트에 사용된다고 한다. 


 

IP

우리가 흔히 아는 IP는 127.0.0.1처럼 4개의 최대 세자리 숫자구조이다. 

 

실제 IP는 32비트로 이루어져 있고, 8비트씩 4개묶음으로 나누어 센다. 

8비트(0~255)의 값을 가지므로, 0.0.0.0~255.255.255.255까지의 경우의 수가 나오게 된다. 

 

위의 MAC가 3바이트씩 나누면 OUI와 기계 식별번호로 분류되는 구조를 가진 것 처럼, 

IP도 주소값을 두 개로 나누어 정리할 수 있다. 

String NetworkID;
String HostID;

String IP = NetworkID + HostID;

 

이런 구조로 분류할 수 있게 되는데, 

그렇다면 NetworkID와 HostID가 무엇일까?

 

  • 네트워크 ID
    • 모든 호스트 개개인을 모두 식별해 인터넷상에서 우리가 부르고, 관리하기가 너무 힘들다. 
    • 그래서 어느정도 범위를 두고, 해당 범위를 식별해서 대분류를 해두는 것이다. 
    • 이걸 NetworkID라고 한다. 
  • 호스트 ID
    • 네트워크 내에서 호스트를 직접 식별하기 위해 사용한다. 

 

MAC주소에서는 6바이트일 때, 정확하 3바이트씩 나누어 제조사 식별번호와 제조사 내 식별번호가 있다. 

하지만 IP는 MAC처럼 딱 반으로 나누어 네트워크/호스트를 사용하게 하지 않는다. 

한번 더 깊게 가봐야겠다. 


IP - Class(객체 Class 아닙니다~)

IP는 A~E클래스가 존재한다. 

각 클래스마다 고정되는 비트값이 존재하며, 사용할 수 있는 HostID의 범위가 다르다. 

  • A클래스
    • 비트가 0으로 시작해야 한다. 
    • 처음 8비트가 NetworkID, 나머지 24비트가 HostID로 할당된다.
    • NetworkID로는 총 128곳에서만 가능하며, Host는 최대 16,777,214개가 가능하다. 
    • 결국 가능한 값의 범위는 0.0.0.0 ~ 127.255.255.255까지이다. 
  • B클래스
    • 비트가 10으로 시작해야 한다. 
    • 처음 16비트가 NetworkID, 나머지 16비트가 HostID로 할당된다. 
    • NetworkID로는 총 16,384곳에서 가능하며, Host는 최대 65,534개가 가능하다. 
    • 가능한 IP값의 범위는 128.0.0.0~ 191.255.255.255이다. 
      • 네트워크ID가 생각보다 적고, IP범위가 255까지가 아닌 191까지인 이유는 C클래스가 110으로 시작하기 때문이다. 
  • C클래스
    • 비트가 110으로 시작해야한다. 
    • 처음 24비트가 NetworkID, 나머지 8비트가 HostID로 할당된다. 
    • NetworkID로는 총 2,097,152곳이 가능하며, Host는 최대 254대밖에 못쓴다. 
    • 가능한 IP 범위는 192.0.0.0 ~ 223.255.255.255
  • D클래스
    • 특수 케이스에 한해 멀티캐스트용으로 사용되는 IP 범위이다. 
    • 비트가 1110으로 시작해야한다. 
    • 처음 4비트가 NetworkID로 고정되며, 나머지는 모두 HostID로 할당된다. 
    • 가능한 IP 범위는 224.0.0.0 ~ 239.255.255.255
  • E클래스
    • 테스트용 대역폭이며 실제로는 사용하지 않는다. 
    • 240.0.0.0~ 255.255.255.255까지이다. 

결국 이런 식의 구조를 가지게 된다.

이렇게 하면 어느정도 분류는 되어있다는 생각이 들 수 있다. 

여기에서 문제가 무엇일까?

꼭 A, B, C, D클래스로 분리해야할까?

그렇게 했을 때, 우리가 설정할 수 있는 네트워크 ID 범위는 한정되게 된다. 

한정성을 넘어서, 유동적으로 네트워크 ID를 사용할 수 없을까?

 

이를 위해 우리는 서브넷 마스크라는 것을 사용한다. 

서브넷 마스크는 무엇일까?

단어를 나눠서 생각해보자. 

 

  • 서브넷
    • 서브넷팅이 무엇인지 이해하는 것이 필요하다. 
    • 서브넷팅이라는 것은 IP 주소공간을 클래스 기반의 NetworkID, HostID로 나누는 것이 아닌, 더 세밀하게 나누는 방식이다. 

 

  • 마스크
    • 마스킹 테이프를 생각하면 편하다. 
    • 마스크라는 것은 일종의 표시막이다.

 

그렇다면, 이 말들을 합치면 어떻게 될까?

서브넷 마스크란, IP공간을 어떻게 더 세밀화되게 나누었는지 마스킹을 해두는 방식이다. 

어떻게 마스킹이 되는지, 위의 클래스를 가지고 예시를 들어보자. 

 

192.168.1.1이라는 IP가 있다. 이 때 이 IP의 서브넷 마스크가 255.255.255.0이라고 한다. 

이 때 우리는 기존 IP와 서브넷 마스크를 AND 연산을 해준다.

(즉 2진수로 바꾸었을 때, 둘 다 1이어야 1이되는 연산이라는 뜻!)

그때 우리가 가지는 값은 192.168.1.0이 된다. 

여기에서 0이 되지 않는 부분들, 즉 192.168.1이라는 주소가 네트워크 ID이며, 0이 호스트 ID인 것이다. 

이걸 표현할 때, 서브넷 마스크는 어떻게 작성할까?

192.168.1.1/24라고 한다. 

총 32비트 중 앞의 24비트가 네트워크 주소인 것이다(이게 255.255.255.0이라는 뜻!)

 

클래스를 넘어서 계산하면 더 효율적인 네트워크/호스트 ID 분할을 할 수 있다. 

위의 주소가 192.168.1.1/20이라고 하면 어떨까? (단순한 예시일 뿐이다)

모두 비트로 바꾸면, 11000000.10101000.00000001.00000001이 된다. 

이걸 서브넷 마스크 11111111.11111111.11110000.00000000와 AND 연산을 해준다. 

그랬을 때 나오는 값이 네트워크 ID가 되는 것이다 (11000000.10101000.0000)

나머지 0001.00000001가 호스트 주소가 되는 방식이다. 

 

후우 길기도 하다. 

포트에 관해서는 후에 TCP/UDP를 공부할 때 정리하도록 해야겠다. 

 

그럼...twenty thousand...🔥