-
[TCP/IP] [OOB] OOB 통신에 대해서 알아보자C_C++ 프로그래밍/TCP_IP 2019. 6. 4. 20:29
개발 환경
OS
Ubuntu 18.04.2
컴파일러
gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04)
OOB란
대역외 발사 (Out-of-band Emission, OOB) ㅇ 변조의 결과로써 생기는 필요주파수대역 바로 바깥쪽에 있는 1 이상의 불요발사 - 이에는 스퓨리어스 발사를 포함하지 않음 . 즉, 기본파 주위에 인접하여 발생하는 것
OOB = Out of Band라는 의미로 대역 외의 발사를 의미합니다.
우리가 보내는 데이터들은 대부분 In of Band 방식으로 대역폭 내에 있기 때문에 우선순위가 특별히 존재하지 않습니다.
하지만 우리가 긴급하게 데이터를 보내고자 할 때
즉 우선 순위 통신을 하고자 할 때, OOB 통신을 사용합니다.
또한, 소켓 프로그래밍 상에서는 flags를 사용하여 OOB 통신이 가능합니다.
TCP 전용 입출력 함수
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
UDP 전용 입출력 함수
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flage,
struct sockaddr *src_addr, socklen_t *addrlen);ssize_t sendto(int sockfd, void *buf, size_t len, int flage,
const struct sockaddr *dest_addr, socklen_t *addrlen);NS
(1 비트) – ECN-nonce 은폐 보호(RFC 3540에 의해 헤더에 추가).CWR
(1 비트) – 혼잡 윈도 축소(Congestion Window Reduced) 플래그는 송신측 호스트에 의해 설정되는 것으로, 호스트가ECE
플래그가 포함된 TCP 세그먼트를 수신했으며 혼잡 제어 메커니즘에 의해 응답했음을 알리는 역할을 한다(RFC 3168에 의해 헤더에 추가).ECE
(1 비트) – ECN-Echo는 다음을 나타낸다.
SYN
플래그가 (1)로 설정된 경우, TCP 상대가 명시적 혼잡 통지(Explicit Congestion Notification, ECN)가 가능함을 의미한다.SYN
플래그가 (0)으로 해제된 경우, IP 헤더 셋에 혼잡 경험(Congestion Experienced) 플래그가 설정된 패킷이 정상적인 전송 중에 수신되었다는 것을 의미한다(RFC 3168에 의해 헤더에 추가).
URG
(1 비트) – Urgent pointer 필드의 값이 유효함을 나타낸다.ACK
(1 비트) – Acknowledgment 필드의 값이 유효함을 나타낸다. 클라이언트가 보낸 최초의SYN
패킷 이후에 전송되는 모든 패킷은 이 플래그가 설정되어 있어야 한다.PSH
(1 비트) – 푸시 기능. 수신 애플리케이션에 버퍼링된 데이터를 푸시해 줄지 여부를 질의하는 역할을 한다.RST
(1 비트) – 커넥션 리셋SYN
(1 비트) – 동기화 시퀀스 번호. 양쪽이 보낸 최초의 패킷에만 이 플래그가 설정되어 있어야 한다. 다른 일부 플래그들의 의미가 이 플래그의 값에 따라 바뀌며, 일부 플래그들은 이 플래그가 설정되어 있을 때만 유효하고, 또 다른 일부 플래그들은 이 플래그가 해제되어 있을 때에만 유효하다.FIN
(1 비트) – 남은 송신측 데이터 없음
TCP 헤더를 참고하면 URG를 사용하여 OOB 통신이 가능하다는 것을 알 수 있다.
대표적인 TCP의 flags이다.
MSG_PEEK : 데이터를 읽은 뒤에 버퍼를 지우지 않는 용도이다. 서브루틴이 값을 유지를 원할 떄 사용.MSG_DONTROUTE : 데이터 전송시 라우팅 테이블을 참고 하지 않는다. 지역 네트워크에서만 사용할 때 쓰인다.MSG_DONTWAIT : 비봉쇄 통신을 시도한다.MSG_OOB : out-of-band 통신을 한다. (우선순위 데이터)송신 측send 함수의 마지막 arg에 MSG_OOB만 설정해준다.send(sockfd, buf, MAX_LINE, MSG_OOB);
수식 측시스템에서 발생하는 URG 긴급 시그널을 발생시켜야한다.
=> 시그널 발생과 처리에 관한 handler 필요
signal(SIGURG, urg_handler); // URG 시그널 발생 시 핸들러 호출fcntl(sockfd, F_SETOWN, getpid()); // SIGIO와 SIGURG 신호를 받는 프로세스 아이디를 얻는다.※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다
반응형'C_C++ 프로그래밍 > TCP_IP' 카테고리의 다른 글
Blocking, Unblocking 봉쇄/비봉쇄 통신 (0) 2019.06.06 멀티쓰레드를 이용한 소켓 통신 (0) 2019.06.04 1:1 TCP 소켓 통신 프로그램 (0) 2019.05.21 [struct rlimit] setrlimit, getrlimit... (0) 2019.05.20