ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 신호를 받는 프로세스 아이디를 얻는다.




    ※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다


    반응형
Designed by Tistory.