목차
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)
=> 패킷을 목적지로 라우팅하는 데 사용
브로드캐스트 주소
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>
'코딩 > Network' 카테고리의 다른 글
[네트워크] 멀티캐스트, IPPROTO_IP, IPPROTO_IPV6 레벨 옵션 (0) | 2023.06.06 |
---|---|
[네트워크] 소켓 옵션 / SOL_SOCKET 옵션 (1) | 2023.06.06 |
[네트워크] UDP 서버-클라이언트 (0) | 2023.06.05 |
[네트워크] 멀티스레드 TCP서버/스레드 동기화/임계영역/이벤트 (0) | 2023.06.05 |
[네트워크] 스레드 API, 스레드 제어 (0) | 2023.04.26 |