본문 바로가기

개인 공부/네트워크

네트워크P-014 (소켓 옵션 & Broadcast)

소켓 옵션 & 브로드캐스트

소켓 옵션

: 소켓 함수의 기본 동작을 변경 

  ->  소켓 코드와 프로토콜 구현 코드를 세부적으로 제어

 

소켓 옵션의 종류

(1) 소켓 코드가 처리하는 옵션(프로토콜에 독립적)

    - 옵션을 설정하면 소켓 코드에서 해석하고 처리한다

 

(2) 프로토콜 구현 코드가 처리하는 옵션(프로토 콜에 의존적)

    - 옵션을 설정하면 프로토콜 구현 코드에서 해석하고 처리한다

 

소켓 옵션 함수

// ===== Windows =====
#include<winsock2.h>
int setsockopt(
	SOCKET sock,
	int level,
	int optname,
	const char* optval,
	int optlen
);
// 성공 : 0
// 실패 : SOCKET_ERROR

// ===== Linux =====
#include<sys/socket.h>
int setsockopt(
	int sock,
	int level,
	int optname,
	const void* optval,
	socklen_t optlen
);
// 성공 : 0
// 실패 : -1
// ===== Windows =====
#include<winsock2.h>
int getsockopt(
	SOCKET sock,
	int level,
	int optname,
	const char* optval,
	int optlen
);
// 성공 : 0
// 실패 : SOCKET_ERROR

// ===== Linux =====
#include<sys/socket.h>
int getsockopt(
	int sock,
	int level,
	int optname,
	const void* optval,
	socklen_t *optlen
);
// 성공 : 0
// 실패 : -1

sock : 소켓 옵션을 설정할 소켓

level : 소켓 정보를 가져오거나 변경할 것인지 명시(보통 SOL_SOCKET, IPPROTO_TCP 사용)

optname : 소켓 설정을 위한 소켓 옵션의 번호

optval : 설정할 값을 저정하기 위한 버퍼의 포인터

optlen : optval 버퍼의 크기

 

소켓 옵션 종류

SO_BROADCAST 옵션 : 브로드캐스트 데이터 전송 기능 활성화

    - TCP 소켓에는 사용할 수 없고 UDP 소켓에만 사용 가능

 

SO_KEEPALIVE 옵션 : TCP 프로토콜 수준에서 연결 여부를 확인

    - 상대 TCP에 주기적으로 TCP 패킷을 보낸다

 

SO_LINGER 옵션 : closesocket() 함수의 동작 변경

    - 소켓을 닫고 할당된 운영체제 자원을 반환

SO_SNDBUF & SO_RCVBUF 옵션 : 소켓의 송신 버퍼와 수신 버퍼 크기 변경

 

SO_SNDTIMEO & SO_RCVTIMEO 옵션 : 데이터 전송 함수가 작업 완료와 상관없이 일정 시간 후 리턴하게 한다

 

SO_REUSEADDR 옵션 : 현재 사용 중인 IP 주소와 포트 번호를 재사용

    - 현재 사용 중인 IP 주소와 포트 번호를 이용해 bind() 함수를 호출할 수 있다

 

브로드캐스트

[1] 브로드캐스팅 : UDP 특징으로 브로드 캐스팅과 멀티 캐스팅을 지원(1:N 통신)

 

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

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

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

(4) 애니 캐스팅 : 한 개체가 동일 그룹에 가입한 개체 중 가장 가까운 하나에만 데이터를 보내고

                             데이터를 받은 개체가 그 그룹에 속한 난 머지 개체에 데이터를 보내는 모델 (IPv6만)

 

[2] 브로드캐스팅 개념

송신자가 보낸 데이터 하나를 다수의 수신자가 받는 방식

- 데이터 복사본을 여러 개 만들어 보내는 것이 아니므로 송신자 관점 에서 보면 상당히 효율적이다

- 송신자가 보내는 메시지는 이더넷을 통해 모든 객체에 전달된다

- 각 개체는 메시지가 브로드 캐스트 주소로 보낸 것임을 확인하고 읽어 들인다

 

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

(1) 브로드캐스팅을 활성화

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

// ===== Linux =====
int bEnable = 1;
retval = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &bEnable, sizeof(bEnable));

(2) 브로드캐스트 주소로 데이터 보낸다

IPv4 : 255.255.255.255

IPv6는 브로드캐스트 되신 멀티캐스트와 애니캐스트로 대체되었다

 

[4] 브로드 캐스팅 종류

네트워크 브로드캐스트 : 호스트 ID비트가 모드 1인 경우, 특정 네트 워크에 대한 브로드 캐스트

     - 데이터가 라우터를 거쳐야 하므로 라우터 설정에 따라 브로드 캐스팅이 불가능할 수 도 있다

 

서브넷 브로드캐스트 : 서브넷 ID를 제외한 호스트 ID비트가 모두 1 인 경우,특정 서브넷에 대한 브로드 캐스트

     - 라우터를 통과하지 못 할 수 있으므로, 외부 서브넷에 대한 브로드 캐스팅 목적으로 사용 하기 어렵다

 

지역 브로드 캐스트 : 송신자 자신이 속한 네트워크에 대한 브로드 캐스트를 의미

    - 브로드 캐스트 데이터가 라우터 경계를 넘어가지 않는다