브로드 캐스트

2jun0·2022년 10월 3일
0

이번에는 DatagramSocket과 DatagramPacket으로 브로드캐스트를 구현해보려고 한다.

브로드 캐스트란?

출처 : https://ko.wikipedia.org/wiki/브로드캐스팅_(네트워킹)

브로드 캐스트는 같은 네트워크 내 모든 노드에게 패킷이나 프레임을 보낼때 쓰는 방식이다.
일대다 연결이라 TCP에선 쓸 수 없다.
UDP로는 사용 할 수 있지만 주로 노드들의 정보교환 정도로만 쓰인다.

좀 더 디테일 하게 들어가면,
데이터 링크 계층 브로드캐스트 (MAC 브로드 캐스트)
네트워크 계층 브로드캐스트 (IP 브로드 캐스트)로 나뉘는데,

MAC 브로드 캐스트는 목적지를 FF:FF:FF:FF:FF:FF로 정하고 보내는 프레임이고
IP 브로드 캐스트는 목적지를 255.255.255.255로 정하고 보내는 패킷이다.

이 둘의 차이점은 어떤 계층에서 브로드 캐스팅이 이루어지는지 차이인데, 사실상 그냥 브로드 캐스팅을 할때는 둘다 쓰인다고 보면 된다.

(MAC 브로드 캐스트는 ARP에서 쓰이고)
(IP 브로드 캐스트는 DHCP에서 쓰인다.)

예제

이번엔 아쉽게도 가상머신을 사용할 수 없다. 브로드캐스트는 보안 이슈 때문에 기본적으로 라우터에서 막히고 OS단에서도 막는다.
그래서 같은 PC 환경에서 실행했다.

서버가 255.255.255.255(브로드캐스트 ip)로 DatagramPacket을 보내면 클라이언트가 받아서
화면에 보여주는 예제를 준비했다.

서버코드

public class ServerSocket {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket();

        String str = "My ip is : " + InetAddress.getLocalHost().getHostAddress();
        DatagramPacket packet = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("255.255.255.255"), 6000);

        socket.send(packet);
        socket.close();
    }
}

이번에는 클라이언트와 연결을 하지 않는다. 패킷을 보내기만 한다.

DatagramSocketDatagramPacket을 보내기 위한 소켓으로 DatagramPacket은 네트워크 계층에서 tcp/ip(가상회선방식)이 아닌 데이터그램 방식의 패킷을 보낼때 쓰는 클래스다.

(데이터그램 - http://www.ktword.co.kr/test/view/view.php?m_temp1=634)

InetAddress.getLocalHost().getHostAddress()은 내 로컬 주소를 반환한다.
str은 "My ip is : [내 아이피]"가 될 것이다.

패킷은 포트를 6000, 주소를 255.255.255.255로 보낸다고 설정했다.

socket.send(packet)을 통해 만들어진 패킷을 보낸다.

클라이언트 코드

public class ClientSocket {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(6000);

        byte[] buf = new byte[256];

        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        socket.receive(packet);

        String str = new String(buf, 0, packet.getLength());

        System.out.println("input : " + str);

        socket.close();
    }
}

클라이언트 코드는 패킷에 주소를 할당하지 않았다. (비연결성)
socket.receive(packet)으로 서버의 패킷을 기다릴 것이다.
서버에서 브로드캐스트 패킷을 보냈으니 분명 여기서 받을 수 있을 것이다.

출력

input : My ip is : 198.0.10.1

클라이언트는 성공적으로 서버의 패킷을 받아냈다.
출력으로는 서버의 IP가 보인다.

profile
끄적끄적

0개의 댓글