IT/컴퓨터프로그램

네트워크 프로그래밍 기초: 유니캐스트, 브로드캐스트, 멀티캐스트의 이해와 실습 예제

chn1002 2024. 5. 6. 09:25

네트워크 프로그래밍에 관심이 있는 분들을 위해, 일상적인 네트워크 상호작용에서 흔히 사용되는 세 가지 데이터 전송 방식인 유니캐스트(Unicast), 브로드캐스트(Broadcast), 멀티캐스트(Multicast)를 Python을 사용해 간단하게 구현하는 방법을 소개하고자 합니다. 이 글은 네트워크 개발자 또는 관심 있는 개발자들이 기본적인 네트워크 통신을 이해하고 실제 코드로 어떻게 구현되는지 배울 수 있는 기회를 제공합니다.

 

유니캐스트 (Unicast)

유니캐스트는 네트워크에서 한 장치에서 다른 한 장치로 데이터 패킷을 직접 전송하는 방식입니다. 가장 흔한 통신 방식으로, 웹 서핑, 이메일 전송 등 대부분의 인터넷 활동이 유니캐스트를 통해 이루어집니다.

서버 코드:

import socket

def unicast_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 12345))
    server_socket.listen(1)
    print("Server is listening on localhost:12345")

    while True:
        client_socket, addr = server_socket.accept()
        print(f"Connected by {addr}")
        message = client_socket.recv(1024).decode()
        print(f"Received message: {message}")
        client_socket.sendall("Message received".encode())
        client_socket.close()

if __name__ == "__main__":
    unicast_server()

클라이언트 코드:

import socket

def unicast_client():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('localhost', 12345))
    client_socket.sendall("Hello, server!".encode())
    response = client_socket.recv(1024).decode()
    print(f"Server response: {response}")
    client_socket.close()

if __name__ == "__main__":
    unicast_client()

 

브로드캐스트 (Broadcast)

브로드캐스트는 네트워크의 모든 장치에 동시에 데이터를 전송하는 방식으로, 네트워크 초기화나 긴급 알림 전송에 유용합니다.

브로드캐스트 클라이언트 코드:

import socket

def broadcast_client():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    message = "Hello, broadcast!".encode()
    client_socket.sendto(message, ('<broadcast>', 12345))
    client_socket.close()

if __name__ == "__main__":
    broadcast_client()

 

멀티캐스트 (Multicast)

멀티캐스트는 데이터를 특정 그룹의 멤버들에게만 전송하는 방식으로, 대규모 실시간 데이터 전송에 효과적입니다. 예를 들어, 라이브 비디오 스트리밍이나 회의 시스템에서 사용됩니다.

멀티캐스트 수신자 코드:

import socket
import struct

def multicast_receiver():
    multicast_group = '224.0.0.5'
    server_address = ('', 12345)

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(server_address)
    group = socket.inet_aton(multicast_group)
    mreq = struct.pack('4sL', group, socket.INADDR_ANY)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

    while True:
        print("\nWaiting to receive message")
        data, address = sock.recvfrom(1024)
        
        print(f"Received {len(data)} bytes from {address}")
        print(data.decode())

if __name__ == "__main__":
    multicast_receiver()

멀티캐스트 송신자 코드:

import socket
import time

def multicast_sender():
    multicast_group = ('224.0.0.5', 12345)
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.settimeout(0.2)
    ttl = struct.pack('b', 1)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)

    try:
        while True:
            message = 'Multicast message!'
            print(f"Sending {message}")
            sock.sendto(message.encode(), multicast_group)
            time.sleep(1)
    finally:
        sock.close()

if __name__ == "__main__":
    multicast_sender()

이러한 코드 예제들은 각 전송 방식의 기본적인 사용법을 보여주며, 실제 네트워크 환경 또는 테스트 환경에서 통신 방식을 이해하고 구현하는 데 도움이 될 것입니다. 각 코드는 로컬 환경에서 실행해볼 수 있으며, 실제 적용하기 전에 환경 설정을 확인하는 것이 중요합니다.