서브넷 Subnet

2024. 5. 22. 14:33대학교/정보통신

반응형

서브넷은 네트워크 안의 네트워크이다.

https://www.cloudflare.com/ko-kr/learning/network-layer/what-is-a-subnet/

이것이 라우팅과 무슨 관련이 있는지는... 라우터를 아직 더 탐색하지 않아서 모르겠다. 일단 이건 패스하고
 
쨋든. 서브넷의 개념은 결국 내트워크 내부의 네트워크다. 이것을 구축하는 방법은
IP주소를 이용하는것이다.
IP주소는 네트워크 주소와 호스트 주소로 나뉜다. 여기서 호스트 주소는 내맘대로 해도 되니까 이것을 더 잘게 쪼개서
네트워크 주소 / 서브넷 주소 / 호스트 주소 이렇게 3개로 나누는것이다. 
 
이것을 수행하는 것이 서브넷 마스크이다. 서브넷 마스크는 네트워크 주소를 1로, 호스트 주소를 0으로 표현한것이다.
 
만약, C클래스의 IP이라면 서브넷 마스크는 11111111 . 11111111 . 11111111 . 00000000이다.
 
여기서 호스트 부분 (00000000)에 1을 더 채워넣어 만든것이 서브넷!!

호스트 주소중 첫번째 비트를 빌려 서브넷을 만들었다.
0,1 두가지가 가능해 서브넷은 2개가 되고 나머지 7비트로 호스트가 되는것이다.
 
많은 자료를 찾아보았는데, 결국 서브넷의 핵심은 브로드캐스트 도메인을 줄이는것이라고 설명한다.
하나의 네트워크에 연결되어 있는 호스트가 C클래스에서는 253, B클래스에서는 65023이다. B 클래스의 경우 연결된 호스트가 많으니 브로드캐스트 도메인 (브로드캐스트 영역)이 커진다. 이것은 성능 저하, 혹은 마비를 불러온다. 따라서 필요 이상의 호스트를 하나의 네트워크에 때려박지 말고 일정한 영역으로 분리하라! 이런 느낌인것같다. 
 
참고자료 : https://www.youtube.com/watch?v=s_Ntt6eTn94&t=195s

 
https://www.youtube.com/watch?v=NyZWSvSj8ek

 

 

이것을 토대로 서브넷을 만들어보고자(?) 했다.
이더넷 설정 -> 어댑터 옵션 변경 -> 케이블 OR WIFI 클릭 
 
 

인터넷 프로토콜 버전 IPV4 클릭

자동으로 받는것을 수동으로 설정! 여기서는 서브넷 마스크를 255.255.255.128로 설정하겠다.

 
192.168.80.101에서 255.255.255.128이니, 서브넷 ID는 0, (1bit)
브로드 캐스트 주소는 네트워크 주소는 그대로, 호스트 주소의 모든 값은 1 이여야 함.
0111 1111이니까 127.
 
이제 브로드캐스트 테스트를 진행해보겠다. PC는 두대가 필요하다.
C#으로 작성한 브로드캐스트 메시지 전송 프로그램이다.

#define BROADCAST_SEND_MODE // 브로드캐스트 호출 모드

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main(string[] args)
    {

        Console.WriteLine(IPAddress.Any);
        int port = 12345;
        Console.WriteLine("서브넷 마스크 입력");
        string subnetMaskStr =  Console.ReadLine();
        string ipAddressStr = Dns.GetHostEntry(Dns.GetHostName()).AddressList[1].ToString();

        Console.WriteLine("현재 시스템의 IP 주소: " + ipAddressStr);

        IPAddress ipAddress = IPAddress.Parse(ipAddressStr);
        IPAddress subnetMask = IPAddress.Parse(subnetMaskStr);

        byte[] ipAddressBytes = ipAddress.GetAddressBytes();
        byte[] subnetMaskBytes = subnetMask.GetAddressBytes();
        byte[] networkAdrsBytes = new byte[4];
        for (int i = 0; ipAddressBytes.Length == subnetMaskBytes.Length && i < ipAddressBytes.Length; i++) {
            networkAdrsBytes[i] = (byte)(ipAddressBytes[i] & subnetMaskBytes[i]);
        }
        for (int i = 0; ipAddressBytes.Length == subnetMaskBytes.Length && i < ipAddressBytes.Length; i++)
        {
            Console.WriteLine(networkAdrsBytes[i]);
        }
        byte[] braodcastAddressByte = new byte[networkAdrsBytes.Length]; 
        Array.Copy(networkAdrsBytes, braodcastAddressByte,networkAdrsBytes.Length);
       

        Console.WriteLine("XOR연산을 진행합니다.");
        //NXOR Test
        for (int i = 0; networkAdrsBytes.Length == subnetMaskBytes.Length && i < networkAdrsBytes.Length; i++)
        {
            Console.WriteLine("XOR 연산 " + networkAdrsBytes[i].ToString() + "and" + subnetMaskBytes[i].ToString());
            braodcastAddressByte[i] = (byte)~(networkAdrsBytes[i] ^ subnetMaskBytes[i]);
        }
        foreach (byte i in braodcastAddressByte) {
            Console.WriteLine(i);
        }
        IPAddress broadcastAddress = new IPAddress(braodcastAddressByte);
        string braodcastAddressStr = broadcastAddress.ToString();

        Console.WriteLine("BroadCastaddress" + broadcastAddress);

#if BROADCAST_SEND_MODE
        Console.WriteLine("전송 준비중.");
        // 브로드캐스트 주소 설정
        IPAddress broadcastAddress2 = IPAddress.Parse(braodcastAddressStr);

        // UDP 클라이언트 소켓 생성
        UdpClient client = new UdpClient();

        // 전송할 데이터 생성
        string message = "Hello, Broadcast World!";
        byte[] bytes = Encoding.ASCII.GetBytes(message);

        try
        {
            // 패킷 전송
            client.Send(bytes, bytes.Length, new IPEndPoint(broadcastAddress2, port));
            Console.WriteLine("Broadcast message sent successfully.");
        }
        catch (Exception e)
        {
            Console.WriteLine("Error sending broadcast message: " + e.Message);
        }
        finally
        {
            // 클라이언트 소켓 닫기
            client.Close();
        }

#else // BROADCAST_RECEIVE_MODE
        // UDP 서버 소켓 생성
        UdpClient server = new UdpClient(port);

        try
        {
            // 브로드캐스트 수신 대기
            IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, port);
            byte[] receivedBytes = server.Receive(ref remoteEP);
            string receivedMessage = Encoding.ASCII.GetString(receivedBytes);

            // 수신한 메시지 출력
            Console.WriteLine("Received broadcast message from " + remoteEP.Address.ToString() + ": " + receivedMessage);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error receiving broadcast message: " + e.Message);
        }
        finally
        {
            // 서버 소켓 닫기
            server.Close();
        }
#endif
        Console.ReadLine();
    }
}

 
간단한 프로그램 설명이다.
1.내 아이피 구해서
2.서브넷 마스크를 이용해 네트워크 주소 구하기
3.네트워크 주소를 이용해 XNOR연산 을 진행해서 브로드캐스트 주소 구하기
4.브로드캐스트 주소에 패킷 전송. 브로드캐스트 도메인에 해당하는 모든 PC가 받을것임.
 
송신측 PC의 서브넷 마스크는 255.255.255.128이고, 수신측 PC의 서브넷 마스크는 255.255.255.0이다. 

 
브로드 캐스트 메시지가 전송되었고, 수신측에서는 받을 수 없었다.
 
이제 통일해서 255.255.255.128으로 바꾸자.

 
성공적으로 수신을 한것을 알 수 있다.
 
이제 서브넷 아이디가 1로 바뀌도록 호스트를 211로 할당한 후 다시 브로드캐스트를 보내본다.

수신측에서는 아무런 반응이 없다.
내가 얻은 정보를 통해 이런 테스트를 진행해봤다. 

이게 맞는건가? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 하....독학이란 어렵구만 ..

 

몇일동안 찾아봤는데 안나오니까 여기서 종결! 
 

'대학교 > 정보통신' 카테고리의 다른 글

IP 주소 Classful, Classless  (0) 2024.05.20
IP (Internet Protocol), IP 주소  (0) 2024.05.16
네트워크 허브 Hub  (0) 2024.05.15