과목명 : 컴퓨터 통신(Computer communication)
수업일자 : 2022년 11월 28일 (월)
1. 브로드캐스팅(Broadcasting)
1-1. 정의
- 송신 호스트가 보낸 데이터를 네트워크에 연결된 모든 호스트가 받게 되는 데이터 송신 방법을 의미합니다.
1-2. 네트워크 브로드캐스트(Network-directed broadcast)
- 호스트 ID 비트가 모두가 1인 경우로 특정 네트워크에 대한 브로드캐스팅을 의미합니다. 데이터가 라우터를 거쳐야 하나 라우터 설정에 따라 데이터가 전송되지 않아 브로드캐스팅이 불가능할 수 있는 특징이 있습니다.
1-3. 서브넷 브로드캐스트(Subnet-directed broadcast)
- 서브넷 ID를 제외한 호스트 ID 비트가 모두 1인 경우로, 특정 서브넷에 대한 브로드캐스팅을 의미하고 있습니다. 마찬가지로 라우터 설정에 의해 데이터가 미전송될 수 있으므로 일반적인 외부 서브넷 브로드캐스팅은 불가능하나, 송신자가 속한 서브넷에 대해선 브로드캐스팅이 가능합니다.
1-4. 지역 브로드캐스트(Local broadcast 또는 Limited broadcast)
- 송신 호스트 자신이 속한 네트워크에 대한 브로드캐스팅을 의미합니다. 자신이 속한 네트워크이기에 항상 브로드캐스팅이 가능하며 브로드캐스트 데이터가 라우터를 넘어가지 않는다는 특징이 있습니다.
2. 소켓 옵션(Socket option)
2-1. 소켓 옵션의 개요
- 소켓 프로그래밍은 TCP/IP 등 통신 프로토콜의 기능을 사용하여 통신하는 응용 프로그램을 설계할 수 있는 네트워크 프로그래밍 기법입니다.
- 현재까지 작성된 모든 소켓 프로그램은 소켓의 동작 속성 변경 없이 소켓 함수를 그대로 사용하여 구현했으나, 다양한 요구 사항에 맞는 응용 프로그램을 작성하다 보면 소켓 함수의 코드나 프로토콜의 동작이 달라져야 할 때가 있으며 이때 소켓 옵션을 사용하여 소켓 함수의 동작을 변경함으로써 코드와 프로토콜 구현을 세부적으로 조정할 수 있게 됩니다.
- 소켓 옵션은 처리 주체에 따라 아래와 같이 두 가지 종류로 구분할 수 있습니다
2-2. 소켓 옵션의 두 가지 종류
(1) 소켓 코드가 처리하는 옵션
- 소켓 옵션을 설정하면 소켓 코드에서 자체적으로 해석하고 처리합니다.
(2) 프로토콜 구현 코드가 처리하는 옵션
- 해당 소켓 옵션을 설정하면 프로토콜 구현 코드에서 해석하고 처리하게 됩니다.
2-3. 소켓 옵션을 설정하는 함수 : setsockopt()
int setsockopt(
SOCKET s,
int level, // 소켓 라이브러리의 위치를 지정한다. (User space 또는 Kernel space의 라이브러리)
int optname,
const char *optval,
int optlen
);
(1) s
- 소켓 옵션을 적용할 소켓 대상입니다.
(2) level
- 소켓 라이브러리의 위치를 지정합니다.
(3) optname
- 설정할 옵션 이름을 지정합니다.
(4) optval
- 설정할 옵션 값을 가지고 있는 버퍼의 주소입니다.
(5) optlen
- optval이 가리키는 버퍼의 크기입니다.(바이트 단위)
2-4. 설정된 소켓의 옵션 값을 얻는 함수 : getsockopt()
int getsockopt(
SOCKET s,
int level,
int optname,
char *optval,
int *optlen
);
(1) s
- 옵션 값을 얻을 소켓 대상입니다.
(2) level
- 옵션을 해석하고 처리할 주체를 지시하게 됩니다.
(3) optname
- 옵션 값을 얻을 옵션의 이름을 지정합니다.
(4) optval
- 얻은 옵션 값을 저장할 버퍼의 주소입니다.
(5) optlen
- 값-결과 인자로 사용되며 해당 함수 호출 후 얻은 옵션 값의 크기로 운영체제가 값을 채워줍니다.
2-5. 사용할 소켓 라이브러리의 대표적인 예시 : IP 프로토콜 코드가 처리하는 IPPROTO_IP
optname | optval 타입 | get | set | 설명 |
IP_HDRINCL | BOOL | - | - | 데이터 송신 시 IP 헤더 직접 포함 여부 |
IP_TTL | int | - | - | IP 패킷의 TTL(Time-to-live) 값 설정 |
IP_MULTICAST_IF | IN_ADDR{} | - | - | 멀티캐스트 패킷을 보낼 인터페이스 선택 |
IP_MULTICAST_TTL | int | - | - | 멀티캐스트 패킷의 TTL 값 설정 |
IP_MULTICAST_LOOP | BOOL | - | - | 멀티캐스트 패킷의 루프백 여부 결정 |
IP_ADD_MEMBERSHIP IP_DROP_MEMBERSHIP |
ip_mreq{} (해당 optval 값은 참여/탈퇴할 그룹의 IP 주소) |
- | 멀티캐스트 그룹의 참여(Join)와 탈퇴 |
3. 멀티캐스팅(Multicasting), IPPROTO_IP, IPPROTO_IPV6 옵션
3-1. 멀티캐스팅(Multicasting)의 정의
- 멀티캐스팅이란, 송신 측에서 한 번의 송신으로 목표로 하는(동일한 그룹에 가입된) 네트워크 사용자에게 데이터를 동시에 전송하는 것을 의미합니다.
3-2. 멀티캐스팅용 주소들(IPv4, IPv6)
- 멀티 캐스팅용 주소의 경우 고정된 상위 비트를 제외한 나머지 부분을 그룹 ID라고 부르며 그룹 ID가 통신할 멀티캐스트 그룹을 나타냅니다. 응용 프로그램들은 멀티캐스트 데이터를 수신하기 위해 자유롭게 그룹에 가입(Join)하고 탈퇴(Leave)할 수 있습니다.
(1) IPv4
- 224.0.0.0 ~ 239.255.255.255
(2) IPv6
- FFXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXX (X는 0~F까지의 Hexademical)
3-3. 웹 멀티캐스팅의 특징
(1) 그룹의 가입과 탈퇴가 자유롭다는 특징이 있습니다.
(2) 아래 그림처럼 A, B 호스트는 그룹 구성원에게 언제든지 멀티캐스트 데이터를 송신할 수 있습니다.
(3) 멀티캐스트 데이터를 수신하려면 그룹에 가입되어 있어야 합니다.
(4) 멀티캐스트 데이터를 송신하기 위해 반드시 그룹에 Join해야 하는 것은 아닙니다.
- 아래 그림처럼 그룹에 Join하지 않은 C도 데이터를 보내고 있습니다.
3-4. 멀티캐스팅 코드
(1) IP_MULTICAST_IF, IPV6_MULTICAST_IF 옵션
- IP 주소를 둘 이상 보유한 호스트에서 멀티캐스트 데이터를 보낼 네트워크 인터페이스를 선택할 때 사용합니다.
- 해당 코드를 수행하면 코드에서 설정한 IP 주소의 네트워크 인터페이스를 통해 멀티캐스트 데이터가 전송됩니다.
(2) IP_MULTICAST_TTL, IPV6_MULTICAST_TTL 옵션
- 라우터 경계를 넘어 특정 범위까지 패킷을 보내려면 해당 옵션을 사용하여 TTL 값을 변경한 후 데이터를 보낼 수 있습니다
- 보통 TTL 값은 Default 값으로 1로 세팅되며, 0이 되면 패킷은 중간에 버려지고 1로 세팅된 TTL 값은 라우터 경계를 넘어갈 수 없기에 해당 옵션을 사용하여 TTL 값을 변경한 후 외부로 패킷을 전송할 수 있도록 합니다.
(3) IP_MULTICAST_LOOP, IPV6_MULTICAST_LOOP 옵션
- 멀티캐스트 그룹에 가입한 응용 프로그램이 자신의 그룹에 멀티캐스트 데이터를 보내면 자신도 수신받게 되며, 이때 해당 루프백 옵션을 통해 그룹에게 멀티캐스트 데이터를 보내고 자신은 받지 않도록 처리할 수 있습니다.
(4) IP_ADD_MEMBERSHIP / IP_DROP_MEMBERSHIP
IPV6_ADD_MEMBERSHIP / IPV6_DROP_MEMBERSHIP 옵션
- 멀티캐스트 데이터를 수신받기 위해선 해당 그룹에 Join되어 있어야 합니다.
- IP(IPV6)_ADD_MEMBERSHIP 옵션은 그룹에 가입(Join)할 때 사용됩니다.
- IP(IPV6)_DROP_MEMBERSHIP 옵션은 해당 그룹에서 탈퇴(Leave)할 때 사용하게 됩니다.
- IP 옵션은 ip_mreq 구조체를, IPv6 옵션은 ipv6_mreq 구조체를 옵션으로 사용하게 됩니다.
- 아래는 예시 코드입니다.
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("123.123.123.123"); // 본인이 가입하거나 탈퇴할 그룹의 주소
mreq.imr_interface.s._addr = inet_addr("147.76.111.12"); // 본인 Interface의 주소
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq));
3-5. IPPROTO_TCP 레벨 옵션
- TCP는 신뢰성 있는 데이터 전송을 담당하는 프로토콜 중 하나로 ACK(Acknowledgement)에 기반한 데이터 재전송을 진행하게 됩니다.
- 즉, 데이터를 보낸 후 상대 측이 잘 수신하였는지 ACK 패킷을 보내 확인하고 수신되지 못했다면 데이터를 재전송합니다.
- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.
- 내용 중에서 오타 또는 잘못된 내용이 있을 시 지적해 주시기 바랍니다.
'전공 수업 > 컴퓨터 통신(Computer Communication)' 카테고리의 다른 글
[12주 차] - 스레드 동기화, UDP 서버 - 클라이언트의 구조, 브로드캐스팅 (0) | 2022.11.14 |
---|---|
[10주 차] - 프로세스와 스레드(Process and Thread), 멀티 스레드(Multi-thread) (0) | 2022.11.06 |
[9주 차] - 디버깅(Debugging), 소켓의 Blocking, Non-Blocking & Synchronous, Asynchronous (0) | 2022.10.24 |
[8주 차] - TCP 서버 - 클라이언트의 동작, 여러 가지 함수 (0) | 2022.10.17 |
[7주 차] - TCP 서버 - 클라이언트의 동작, 여러 가지 함수 (0) | 2022.10.11 |
댓글