코딩/Network

[네트워크] 브로드캐스팅

나야, 웅이 2023. 6. 6. 15:21
728x90
반응형
SMALL

목차

1.브로드캐스팅

2. 브로드캐스팅 데이터 보내기 위한 절차

 

 

 

브로드캐스팅

 

통신모델

유니캐스팅 (unicasting) : 한 개체가 다른 한 개체에 데이터를 보내는 모델

 

브로드캐스팅 (broadcasting) : 한 개체가 특정 네트워크에 속한 모든 개체에 데이                                                      터를 보내는 모델

 

멀티캐스팅 (multicasting) : 동일 그룹에 가입한 모든 개체에 데이터를 보내는 모델

                                           (개념적으로 브로드캐스팅은 멀티캐스팅의 특수한 경우                                              이다)

 

애니캐스팅 (anycasting) : 한 개체가 동일 그룹에 가입한 개체 중 가장 가까운 하나                                             에만 데이터를 보내면, 데이터를 받은 개체가 그룹에 속                                             한 나머지 개체에 데이터를 보내는 모델

 

 

 

 

브로드캐스팅 (broadcasting)

  • 브로드캐스팅, 멀티캐스팅은 엄밀하게는 IP가 제공하는 기능이지만, 응용프로그램 수준에서는 UDP를 사용하여 구현한다.
  • 송신자가 보낸 데이터 하나를 다수의 수신자가 받는 방식
  • 데이터 복사본을 여러 개 만들어 보내는 것이 아니므로 송신자 관점에서 보면 상당히 효율적인 기술

 

 

브로드캐스트 데이터 보내기 위한 절차

 

1. 브로드캐스팅 활성화

int WSAAPI setsockopt(
  [in] SOCKET     s,
  [in] int        level,
  [in] int        optname,
  [in] const char *optval,
  [in] int        optlen
);

[in] s

소켓

[in] level

옵션의 정의 수준, ex) SOL_SOCKET => SOCKET 수준에서의 옵션

[in] optname

값을 설정할 소켓 옵션, ex) SO_BROADCAST

[in] optval

요청된 옵션의 값이 지정된 버퍼에 대한 포인터

[in] optlen

optval이 가리키는 버퍼의 크기

 

 

사용 예시) SOCKET 수준에서 SO_BROADCAST 옵션을 사용한다

DWORD bEnable = 1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (const char *)&Enable, sizeof(bEnable));

 

 

2. 데이터 보내기

  • IP주소 부분만 제외하면 기존 유니캐스팅과 동일
  • 따라서, 브로드캐스팅을 위한 IP만 알고 있으면 브로드 캐스팅 가능
  • IPv6는 브로드캐스팅을 지원하지 않음

 

 

그러면 브로드캐스팅을 위한 IP는 무엇인가

주소 지정에서 계층 구조

 

Prefix = 네트워크 주소

Suffix = 호스트 정보

 

 

 

 

 

 

클래스 기반의 주소지정

class A, B, C는 낭비가 심하여 지금은 사용하지 않음

 

클래스 기반 주소 지정이 더 이상 사용되지 않는 이유 => 주소 고갈, 기관이나 개인이 사용할 주소가 더 이상 남지 않음

 

 

 

클래스 A는 세계에서 128개의 기고나에만 할당 가능하며, 각 기관은 단일 네트워크에 16,772,216개의 노드를 가지는 구조 : 대부분 소진

클래서 B는 중간 크기의 기관을 위해 설계 : 대부분 소진

클래스 C는 오직 256개의 노드만 사용 가능한 문제가 있어서 조직이 조금만 규모가 있어도 사용할 수 없는 클래스임

클래스 E는 거의 사용되지 않아 낭비되고 있음

 

클래스 없는 주소지정

전체 주소 공간은 가변 길이의 블록으로 구분

접두사는 네트워크, 접미사는 노드를 지정

블록에 사용되는 숫자는 2의 거듭제곱으로 사용되어야 함

클래스 없는 주소 지정 방법에서는 접두사 길이를 아는 방법

- 슬래시를 추가하여 접두사 길이를 표시

- 비공식적 이름은 슬래시 표기법

- 공식 명칙은 클래스 없는 인터도메인 라우팅 (CIDR)

       n = prefix length = 네트워크 주소 길이

 

네트워크 주소 = 첫 번째 주소 (prefix)

=> 패킷을 목적지로 라우팅하는 데 사용

router = 네트워크 주소로 찾아갈 수 있는 곳, 종점

 

 

브로드캐스트 주소

IPv4 주소 = 네트워크 ID + 호스트 ID

지역 브로드캐스트 = 내가 속해 있는 그룹에 브로드캐스팅 하는 것

255.255.255.255

 

 

브로드캐스트 주소의 종류

 

브로드캐스팅 실습 - client

#include "../../common.h"

#define REMOTEIP	"255.255.255.255"
#define REMOTEPORT	9000
#define BUFSIZE		512

int main(int argc, char* argv[])
{
	int retval = 0;

	//	initialize winsock
	WSADATA wsa;
	if (0 != WSAStartup(MAKEWORD(2, 2), &wsa))
		return 1;

	//	create socket
	SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (INVALID_SOCKET == sock)
		err_quit("socket()");

	//	activate broadcast function
	//	소켓 옵션
	//	255.255.255.255 브로드캐스팅을 할려면 이 소켓 옵션을 set해야 사용가능, 아니면 오류발생
	DWORD bEnable = 1;
	retval = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (const char*)&bEnable, sizeof(bEnable));
	//						socket level, socket level의 option
	if (SOCKET_ERROR == retval)
		err_quit("setsockopt()");

	// connect()
	struct sockaddr_in remoteaddr;
	memset(&remoteaddr, 0, sizeof(remoteaddr));
	remoteaddr.sin_family = AF_INET;
	inet_pton(AF_INET, REMOTEIP, &remoteaddr.sin_addr);
	//				지역내 브로드캐스팅할 IP주소
	remoteaddr.sin_port = htons(REMOTEPORT);

	//	variables declaration
	char buf[BUFSIZE + 1] = { 0, };
	int len = 0;

	//	data communication
	while (1)
	{
		//	get data to send
		printf("\n[data to send] ");
		if (fgets(buf, BUFSIZE + 1, stdin) == NULL)
			break;

		//	remove null terminate character
		len = (int)strlen(buf);
		if ('\n' == buf[len - 1])
			buf[len - 1] = '\0';

		//	no data to send
		if (0 == strlen(buf))
			break;

		//	send data
		retval = sendto(sock, buf, (int)strlen(buf), 0, (struct sockaddr*)&remoteaddr, sizeof(remoteaddr));
		if (SOCKET_ERROR == retval)
		{
			err_display("sendto()");
			break;
		}
		printf("[UDP client] %d bytes have been sent.\n", retval);
	}

	//	close socket
	closesocket(sock);

	//	close socket
	WSACleanup();

	return 0;
}

 

ping

  • 상대쪽 호스트의 작동 여부 및 응답시간(RTT, Round Trip Time)을 측정하는 유틸리티(응용)프로그램
  • ICMP 질의 메시지인 Echo request (type 8)와 Echo Reply (type 0)를 수행함으로써, IP패킷 왕복시간과 TTL 값을 알아냄

ICMP : 인터넷 제어 메시지 프로토콜

오류보고와 네트워크 성능평가를 위한 진단 도구이다.

 

Host A ---------> Host B 

<ping, ICMP type 8, echo request>

 

Host A <--------- Host B

<ICMP type 0, echo Reply>

728x90
반응형
LIST