본문 바로가기
Programming/열혈 TCP, IP 소켓 프로그래밍(저자 윤성우)

Ch 13. 내용 확인문제

by minjunkim.dev 2020. 8. 9.

    모든 내용은 [윤성우 저, "열혈강의 TCP/IP 소켓 프로그래밍", 오렌지미디어] 를 기반으로 제 나름대로 이해하여 정리한 것입니다. 다소 부정확한 내용이 있을수도 있으니 이를 유념하고 봐주세요!


01. 다음 중, 데이터 전송 옵션인 MSB_OOB에 대한 설명 중 맞는 것을 모두 고르면?

a. MSG_OOB는 Out-of-band 데이터의 전송을 의미한다. 그리고 이는 다른 경로를 통한 고속의 데이터 전송이라는 의미를 갖는다.

d. MSG_OOB는 TCP의 기본 데이터 전송방식을 벗어나지 못한다. 즉, MSG_OOB는 옵션이 지정되더라도 전송순서는 그대로 유지된다. 다만 이는 수신 측에 데이터 처리의 "긴급을 요청"하는 용도로 사용될 뿐이다.

# 틀린 설명


b. MSG_OOB는 다른 경로를 통한 고속의 데이터 전송이라는 의미를 갖기 때문에,
TCP 상에서도 이 옵션을 이용해서 전송된 데이터는 상대 호스트로 먼저 전송된다.
=> - TCP는 별도의 통신경로를 제공하지 않으므로, 전송순서는 그대로이다.

c. MSG_OOB 옵션이 주어진 상태에서 상대 호스트로 데이터가 먼저 전송된 이후에는
일반 데이터와 동일한 형태와 순서로 읽혀진다. 즉, 전송이 빠를 뿐 수신 측에서는 이를 인지하지 못한다.
=> MSG_OOB 옵션의 데이터는 긴급패킷이 되기는 하지만 전송이 더 빠르지 않다. MSG_OOB의 목적은 수신 측에 빠른 데이터 처리를 요청하는 용도이다.



02. readv & writev 함수를 이용해서 데이터를 송수신 할 경우 어떠한 이점이 있는지
함수 호출의 횟수와 입출력 버퍼의 관점에서 각각 설명해 보자.

 

- 입출력 버퍼로의 데이터 송수신을 데이터를 모아서 한번에 진행할 수 있기 때문에 데이터 송수신의 효율성을 향상시키는데 도움이 되는 함수
- 데이터를 모아서 전송하고, 모아서 수신하는 기능의 함수 => 입출력 함수호출의 수를 줄일 수 있음

=> 함수의 호출횟수가 적으면 그만큼 성능 향상 + 전송되는 패킷의 수를 줄일 수 있다는데 더 큰 의미가 있음



03. recv 함수호출을 통해서 입력버퍼의 데이터 존재유무를 확인하고자 할 때(확인 후 바로 반환하고자 할 때),
recv 함수의 마지막 전달인자인 데이터 전송의 옵션을 어떻게 구성해야 하는가? 그리고 각각의 옵션이 의미하는 바는 무엇인지도 설명해 보자.

 

- MSG_PEEK 옵션을 주고 recv 함수 호출시, 입력버퍼에 데이터가 읽히더라도 입력버퍼에 데이터가 지워지지 않음

- MSG_DONTWAIT 옵션을 주면 입출력 함수 호출과정에서 블로킹 되지 않음

- 따라서 MSG_PEEK | MSG_DONTWAIT => 입력버퍼의 데이터 존재유무를 확인하되, 데이터가 존재하지 않아도 블로킹 상태에 빠지지 않음



04. 리눅스에서는 MSB_OOB 데이터의 수신을 이벤트 핸들러의 등록을 통해서 확인이 가능하다.
그렇다면 윈도우에서는 어떻게 MSB_OOB 데이터의 수신을 확인할 수 있는지, 그 방법을 설명해보자.

- MSB_OOB의 데이터 수신은 select 함수의 입장에서 "예외상황이 발생한 소켓" 이벤트 발생에 해당한다.
따라서 select 함수를 통해 윈도우 기반의 프로그램에서도 MSB_OOB 데이터의 수신을 확인할 수 있다.


[출처] : 윤성우 저, "열혈강의 TCP/IP 소켓 프로그래밍", 오렌지미디어