2011. 8. 12. 06:54

01. 표준 입출력 함수를 사용했을 때 얻게 되는 장점 두 가지는 무엇인가? 그리고 그 두가지 장점을 얻게 되늰 이유는 또 무엇인가?

02. 표준 출력함수를 이용해서 데이터를 전송하는 경우에는 다음과 같이 생각하는 것은 옳지 않다.
"fputs 함수호출을 통해서 데이터를 전송하면, 함수가 호출되자 마자 데이터의 전송이 시작될 거야."
그렇다면 위와 같은 생각이 옳지 않은 이유는 무엇이고, 위와 같이 생각하기 위해서는 추가로 어떠한 과정이 필요한지 설명해 보자.
Posted by Triany
2011. 8. 12. 05:22

01. TTL이 의미하는 바는 무엇인가? 그리고 TTL의 값이 크게 설정되는 것과 작게 설정 되는 것에 따른 차이와 문제점을 라우팅의 관점에서 설명해보자.
 - 작게 설정 : 보내야 하는 위치까지 데이터가 갈 수 없음
 - 크게 설정 : 돌아다니는 패킷이 너무 많다.
  ...(내생각;;()



02. 멀티캐스트와 브로드캐스트의 공통점은 무엇이고 또 차이점은 무엇인가? 데이터의 송수신 관점에서 설명해 보자.
공통점 : 한 번에 여러 호스트에 데이터를 전송
차이점 : 전송이 이루어 지는 범위
   - 멀티캐스트 : 서로 다른 네트워크 상에 연결되어있는 호스트라 할 지라도 멀티캐스트그룹에 가입되어 있으면 데이터 수신 가능
   - 브로드 캐스트 : 동일한 네트웨크로 연결되어 있는 호스트로 데이터의 연결 대상 제한

03. 다음중 ....

04. 멀티캐스트는 트래픽 측면에서도 긍정적이다!! 그렇다면 어떠한 이유로, 어떻게 긍정적인지 TCP의 데이터 송수신 방식과 비교해서 설명해 보자.
  -1000개의 호스트에게 파일을 전송하기 위해 딱 한번만 멀티캐스트 방식으로 파일을 전송해도 가능하다. 호스트에서 하나의 패킷만 보내도, 라우터 측에서 1000개의 호스트에게 파일을 복사해서 전송.


05. 멀티캐스트 방식의 데이터 송수신을 위해서 MBone 이라는 가상의 네트워크가 구성되어 있어야 한다. 즉, MBone은 멀티캐스트를 위한 네트워크이다. 그런데 이러한 MBone을 가리켜 가상 네트워크라 한다. 그렇다면 여기서 말하는 가상네트워크가 무엇을 뜻하는지 설명해보자.
 - 가상네트워크 : 인터넷 상에서 별도의 프로토콜을 기반으로 동작하는 소프트웨어적인 개념의 네트워크.
                         멀티캐스트에 필요한 네트워크 구조를 인터넷 망을 바탕으로 소프트웨어적으로 구현해 놓은 가상의 네트워크
Posted by Triany
2011. 8. 6. 14:07
02. readv& writev 함수를 이용해서 데이터를 송수신 할 경우 어떠한 이점이 있는지 함수 호출의 횟수와 입출력 버퍼의 관점에서 각각 설명해 보자.
   - 데이터 송수신의 효율성을 향상
   - writev 함수를 사용하면 여러 버퍼에 나뉘어 저장되어 있는 데이터를 한 번에 전송할 수 있고,
   - 또 readv 함수를 사용하면 데이터를 여러 버퍼에 나눠서 수실할 수 있다.


03. recv 함수호출을 통해서 입력 버퍼의 데이터 존재 유무를 확인하고자 할 때(확인 후 바로 반환하고자 할 때) recv함수의 마지막 전달인자인 데이터 전송의 옵션을 어떻게 구성해야 하는가? 그리고 각각의 옵션이 의미하는 바는 무엇인지도 설명해 보자.
while(1)
{
    str_len=recv(recv_sock, buf, sizeof(buf)-1, MSG_PEEK|MSG_DOWNWAIT);
    if ( str_len > 0 )
       break;
}


04. 리눅스에서는 MSB_OOB 데이터......
Posted by Triany
2011. 8. 6. 13:38

01. 멀티플렉싱 기술에 대한 일반적인 의미를 말하고, IO멀티플렉싱 한다는 것이 무엇을 의미하는지 설명해 보자.
*멀티 플렉싱
  - 하나의 통신 채널을 통해서 둘 이상의 데이터 시그널을 전송하는데 사용되는 기술.
  - 물리적 장치의 효율성을 높이기 위해서 최소한의 물리적인 요소만을 사용해서 최대한의 데이터를 전달하기 위해 사용되는 기술.
  =>


02. 멀티 프로세스 기반의 동시 접속 서버의 단점은 무엇이며, 이를 멀티 플렉싱 서버에서 어떻게 보완하는지 설명해 보자.
client의 수만큼 child 프로세스를 생성
=> 멀티 플렉싱 기술을 적용하면, 프로세스의 수가 줄어든다. 즉, 접속해 있는 클라이언트의 수에 상관없이 서비스를 제공하는 프로세스의 수는 딱 하나..


03. 멀... (생략)

04. select 함수의 관찰대상에 서버 소켓(리스닝 소켓)도 포함시켜야 한다. 그렇다면 어떠한 부류에 포함을 시켜야 하며, 그 부류에 포함시키는 이유도 설명해 보자.
- 연결요청이 있었다는 뜻...


05. select 함수의 호출에 사용되는 자료형 fd_set 의 정의형태는 윈도우와 리눅스에서 차이를 보인다. 그렇다면 어떻게 차이가 나는지 설명하고, 차이가 날 수 밖에 없는 이유에 대해서도 설명해 보자.
Posted by Triany
2011. 7. 30. 11:15
01. 프로세스에 대한 설명_ (OX 문제, 책에_)

02. fork 함수...... (OX문제, 책에_)

03. 자식 프로세스가 생성되면 부모 프로세스의 모든 것을 복사하는데, 이때 복사의 대상으로 소켓의 파일 디스크립터도 포함이 된다. 그러다면 복사한 파일 디스크립터의 정수 값은 원본 파일 디스크립터의 정수 값과 동일한지 확인하기 위한 프로그램을 작성해 보자.

04. 프로세스가 좀비가 되는 경우에 대해서 설명하고, 이를 막기 위해서 어떠한 방법을 취해야 하는지 설명해 보자.
* 자식프로세스가 종료되는 상황
  - 인자를 전달하면서 exit를 호출하는 경우
  - main 함수에서 return 문을 실행하면서 값을 반환하는 경우
* 좀비가 되는 경우 : 자식프로세스의, exit 함수로 전달되는 인자값과 main함수의 return 문에 의해 반환되는 값 모두 운영체제로 전달된다. 그리고 운영체제는 이 값이 자식 프로세스를 생성한 프로세스에게 전달될 때까지 자식프로세스를 소멸시키지 않는데, 바로 이 상황에 놓여있는 프로세스를 가리켜 "좀비 프로세스"라 한다.

아래의 함수를 사용하여, 자식프로세스의 종료됨을 알린다.(자식 프로세스의 전달 값을 요청)
방법 1 : wait 함수 사용    (블로킹 될 수 있음)
방법 2 : waitpid 함수 사용(블로킹 되지 않음)



05. SIGINT에 대한 핸들러를 등록하지 않은 상태에서 Ctrl+C키가 입력되면, 운영체제가 지정해 놓은 디폴트 이벤트 핸들러에 의해서 프로그램이 종료되어 버린다. 그러나 Ctrl+C키에 대한 핸들러를 직접 등록하면 프로그램은 종료되지 않고 프로그래머가 지정한 이벤트 핸들러가 대신 호출된다. 그렇다면 일반적인 프로그램에서 다음과 같이 동작하도록 이벤트 핸들러 등록을 위한 코드를 구성해 보자.
"Ctrl+C키가 눌리면, 정말로 프로그램을 종료할 것인지 묻고, 이에
 대한 대답으로 'Y'가 입력되면 프로그램을 종료한다."

그리고 간단히 문자열은 1초당 한번 정도 반복 출력하는 프로그램을 작성해서 위의 이벤트 핸들러 등록 코드를 적용시켜보자.
Posted by Triany
2011. 7. 29. 15:37



01. Time-wait 상태에 대해 설명(OX문제_ 책에)



02. 옵션 TCP_NODELAY는 Nagle 알고리즘과 간련이 있다. 이 옵션을 이용해서 Nagle 알고리즘을 해제할 수도 있는데, 그렇다면 어떠한 경우에 한해서 Nagle알고리즘의 해제를 고민해 볼 수 있겠는가? 이를 송수신하는 데이터의 특성과 관련해서 설명해 보자.

Nagle알고리즘을 중단해야 하는 경우
"Nagle 알고리즘의 적용여부에 따른 트래픽의 차이가 크지 않으면서도 Nagle 알고리즘을 적용하는 것보다 데이터의 전송이 빠른경우"_대용량 파일 데이터의 전송의 경우로, 파일데이터를 출력버퍼로 밀어 넣는 작업시간이 얼마 걸리지 않기에 Nagle알고리즘을 적용하지 않아도 출력버퍼를 거의 꽉 채운 상태에서 패킷을 전송하게 되는데, 이 경우 패킷의 수가 크게 증가하지도 않을 뿐더러, ACK를 기다리지 않고 연속해서 데이터를 전송하니 전송속도가 놀랍게 향상된다.
Posted by Triany
2011. 7. 29. 14:44

01. DNS(Domain Name System)에 대한 설명

??????DNS서버는 사실상 라우터를 의미한다? 라우터가 도메인 이름정보를 참조하여 데이터의 진로를 결정하기 때문???
-->진위여부 찾기
???? DNS 서버는 운영체제에 따라서 구분이 된다. 즉 윈도우용 DNS서버와 리눅스용 DNS서버는 구분이 된다?????


02. 생략

03. 웹 브라우저의 주소 창에
www.orentec.co.kr을 입력해서 메인 페이지가 보이기까지의 과정을 정리해 보자. 단 웹 브라우저가 접속한 디폴트 DNS서버에는 www.orentec.co.kr에 대한 IP주소가 등록되어 있지 않다고 가정하자.

가상의 주소(www.orentec.co.kr  도메인 주소)를 실제주소(IP)주소로 변환하기 위한 변환을 담당하는 부분이 바로 DNS서버이다. 웹 브라우저가 접속한 디폴트 DNS서버에 해당 도메인(
www.orentec.co.kr)의 IP주소를 갖고 있지 않는다면, 상위 계층의 DNS서버에 물어봐 알려준다. 이런식으로 계속 올라가다 보면 최상위 DNS서버인 root DNS서버에까지 질의가 전달되는데, Roor DNS서버는 해당 질문을 누구에게 재 전달해야 하는지 알고 있다. 이 결과는 진행된 반대 방향으로 전달되어  질의를 시작한 호스트에게 IP 주소인 211.239.163.22가 전달된다.
DNS는 계층적으로 관리되는 일종의 분산 데이터베이스 시스템이다.

Posted by Triany
2011. 7. 22. 18:50
01. TCP보다 UDP가 빠른 이유는 무엇인가? 그리고 TCP는 데이터 전송을 신뢰할 수 있지만 UDP는 신뢰할 수 없는 이유는 또 무엇인가?
UDP는  TCP에서 ACK와 같은 응답 메시지를 보내는 일도 없고, SEQ와 같이 패킷에 번호를 부여하는 일도 없다.
UDP는 흐름제어가 존재하지 않는다.

[TCP가 UDP에 비해 느린 이유 ]
- 데이터 송수신 이전, 이후에 거치는 연결설정 및 해제 과정
- 데이터 송수신 과정에서 거치는 신뢰성 보장을 위한 흐름 제어

02. 다음 중 UDP의 특성이 아닌 것을 모두 고르면? b
      .. 책에 풀었음...


03. UDP 데이터 그램이 최종 목적지인 상대 호스트의 UDP 소켓에 전달되는데 있어서 IP가 담당하는 부분과 UDP가 담당하는 부분을 구분 지어 설명해 보자.
IP의 역할 : 호스트 B를 떠난 UDP 패킷이 호스트 A에 전달되도록 하는 것.
UDP의 역할 : 호스트로 수신된 UDP 패킷을 PORT 정보를 참조하여 최종 목적지인 UDP 소켓에 전달.

04. UDP는 일반적으로 TCP보다 빠르다. 그러나 송수신하는 데이터의 성격에 따라서 그 차이는 미미할 수도 있고, 반대로 매우 클 수도 있다. 그렇다면 어떠한 상황에서 UDP는 TCP보다 매우 좋은 성능을 보이는지 설명해 보자.
TCP 기반으로 송수신 되야 하는 경우 : 압축파일의 경우(일부 파일이 손상되면 압축 해제의 어려움이 있음)
UDP 기반으로 송수신 되는 것이 좋은 경우 : 인터넷 기반으로 실시간 영상 및 음성을 전송하는 경우(멀티미디어 데이터)



05. 클라이언트의 TCP소켓은 connect 함수를 호출할 때 자동으로 IP와 PORT가 할당된다. 그렇다면 bind 함수를 호출하지 않는 UDP 소켓은 언제 IP와 PORT가 할당되는가?
snedto 함수 호출 시까지 주소정보가 할당되지 않았다면, sendto 함수가 처음 호출되는 시점에 해당 소켓에 IP와 PORT번호가 자동으로 할당된다.

UDP 기반의 데이터 송수신과정에서는 입출력 함수의 호출횟수를 일치시켜야 함..

06. connect 함수의 호출문장은 TCP 클라이언트의 경우 반드시 삽입해야 하는 문장이다. 그러나 UDP의 경우는 선택적으로 삽입이 가능하다. 그렇다면 UDP에서 connect 함수를 호출하면 어떠한 이점이 있는가?
[sendto 함수 호출을 통한 데이터의 전송과정]
1단계. UDP 소켓에 목적지의 IP와 PORT 번호 등록
2단계. 데이터 전송
3단계. UDP 소켓에 등록된 목적지 정보 삭제

명확히 전송될 주소와 포트번호를 안다면, connect를 사용하는 것이 더 유리한데 이는, 전송과정중 1단계와 3단계에서 걸리는 시간을 줄임으로써 성능향상을 기대할 수 있다. 




07. 본문에서 보인 예제 uecho_server.c와 uecho_client.c를 참고해서 서버와 클라이언트 상호간에 한번씩 메시지를 주고받는 형태로 대화를 진행하는 예제를 작성해 보자. 단 주고 받는 대화는 콘솔창에 출력되어야 한다.

 --> 구현함
Posted by Triany
2011. 7. 21. 19:12



01. TCP 소켓의 연결설정 과정인 Three-way handshaking에 대해서 설명해 보자. 특히 총 3회의 데이터 송수신이 이뤄지는데, 각각의 데이터 송수신 과정에서 주고 받는 데이터에 포함된 내용이 무엇인지 설명해보자.


TCP의 내부 동작 원리 1: 상대 소켓과의 연결
TCP 소켓은 연결설정 과정에서 총 세 번의 대화를 주고 받는데, 이를 가리켜 Three-way handshaking 이라 한다.

[Three-way handshaking과정]


 

 

[SYN] SEQ : 8000, ACK : -
처음 연결요청에 사용되는 메시지 이기에 이 메시지를 가리켜 ‘SYN’이라 한다
.
데이터 송수신에 앞서 전송되는 동기화 메시지

[SYN + ACK] SEQ : 15000, ACK : 8001
처음 client가 전송한 패킷에 대한 응답 메시지(ACK 8001)과 함께 호스트 B의 데이터 전송을 위한 동기화 메시지(SEQ 15000)을 함께 묶어서 보낸다. 이런 유형의 메시지를 SYN+ACK라 한다.

[ACK] SEQ : 8000 ACK : 15001
15001 패킷을 전송하길 요청.

 


02. TCP는 데이터의 전송을 보장하는 프로토콜이다. 그러나 인터넷을 통해서 전송되는 데이터는 소멸될 수 있다. 그렇다면 TCP는 어떠한 원리로 중간에 소멸되는 데이터의 전송까지 보장을 하는 것인지 ACK와 SEQ를 대상으로 설명해 보자.

ACK
번호 -> SEQ 번호 A+ 전송된 바이트 크기 + 1
!
중간에 패킷이 소멸되는 경우
= > 데이터 손실에 대한 재전송을 위해서, TCP 소켓은 ACK 응답을 요구하는 패킷 전송 시에 타이머를 동작시킨다. 그리하여 해당 타이머가 Time-Out 되었을 때 패킷을 재전송한다.



03. TCP 소켓을 기반으로 write함수와 read 함수가 호출되었을 때의 데이터 이동을 입력버퍼와 출력버퍼의 상태와 더불어 설명해 보자.

TCP 소켓에 존재하는 입출력 버퍼
TCP 소켓의 데이터 송수신에는 경계가 없다. , 서버가 한번의 write 함수 호출을 통해서 40바이트를 전송해도 클라이언트는 네 번의 read 함수 호출을 통해서 10바이트씩 데이터를 수신하는 것이 가능하다. 이러한 것이 가능하게 해 주는 것이 바로 버퍼이다
.
write 함수가 호출되는 순간 데이터는 출력버퍼로 이동을 하고, read 함수가 호출되는 순간 입력버퍼에 저장된 데이터를 읽어 들이게 된다
.

 

입출력 버퍼의 특성

Posted by Triany
2011. 7. 21. 18:01
01. TCP/IP 프로토콜 스택을 4개의 계층으로 구분해 보자. 그리고 TCP 소켓이 거치는 계층구조와 UDP 소켓이 거치는 계층구조의 차이점을 설명해보자.

                                        [TCP/IP 프로토콜 스택 _ 4계층 표현]



[TCP와 UDP 게층 ] 전송계층(Transport Layer)이라고도 함. IP계층에서 알려준 경로정보를 바탕으로 데이터의 실제 송.수신을 담당. IP의 상위계층에서 호스트 대 호스트의 데이터 송수신 방식을 약속.

TCP 역할 : TCP는 신뢰성있는 데이터의 전송을 담당. TCP가 데이터를 보낼때 기반이 되는 프로토콜이 IP이다. IP는 오로지 하나의 데이터 패킷(데이터 전송의 기본단위)이 전송되는 과정에만 중심을 두고 설계되었다. 이에 데이터를 주고받는 과정에서 TCP는 그 확인절차를 걸쳐서 신뢰성 없는 IP에 신뢰성을 부여한 프로토콜





02. TCP/IP 프로토콜 스택 중에서 LINK 계층과 IP 계층이 담당하는 역할이 무엇인지 설명해보자. 그리고 이 둘의 관계도 함께 설명해보자.

LINK 계층 : 물리적인 영역의 표준화에 대한 결과. 즉, 가장 기본이 되는 영역으로 LAN, WAN, MAN과 같은 네트워크 표준과 관련된 프로토콜을 정의하는 영역.
IP 계층 : 데이터 전송을 위한 경로 검색. 이 계층에서 사용하는 프로토콜이 IP



03. TCP/IP 프로토콜 스택을 4개의 계층(또는 7개의 계층)으로 나누는 이유는 무엇인가? 이를 개방형 시스템에 대한 설명과 함께 답해보자.
프로토콜을 계층화하여 얻게되는 장점이, 표준화 작업을 통한 '개방형 시스템(Open System)'의 설계.
TCP/IP 프로토콜 스택역시 개방형 시스템의 하나로, 라우터, 및 랜 카드 등이 제조사들이 LINK 계층의 표준에 따라 제조하기에, 어느 제조사의 제품이든 쉽게 교체가능(인터페이스, 컴포넌트 화 되어있는. 규격이 맞춰져 있는 장점.)


04. 클라이언트는 connect 함수호출을 통해서 서버로의 연결을 요청한다. 그렇다면 클라이언트는 서버가 어떠한 함수를 호출한 이후부터 connect 함수를 호출할 수 있는가?
listen(연경요청 대기상태) 함수가 호출되어야 클라이언트는 연결요청을 위하여 connect 함수를 호출할 수 있다.

05. 연결요청 대기 큐라는 것이 생성되는 순간이 언제이며, 이것이 어떠한 역할을 하는지 설명해보자. 그리고 accept 함수와의 관계도 함께 설명해보자.
 #include <sys/type.h>

int listen(int sock, int backlog);   //성공시 0, 실패시 -1반환
○sock : 연결요청 대기상태에 두고자 하는 소켓의 파일 디스크립터 전달, 이 함수의 인자로 전달된 디스크립터의 소켓이 서버 소켓(리스닝 소켓)이 된다.
○backlog : 연결요청 대기 큐(Queue)의 크기정보 전달, 5가 전달되면 큐의 크기가 5가 되어 클라이언트의 연결요청을 5개까지 대기시킬 수 있다.

listen 함수가 호출되면, 문지기의 역할을 하는 서버소켓이 만들어 지고, listen함수의 두번째 인자로 전달되는 정수의 크기에 해당하는 대기실이 만들어진다. 이 대기실을 가리켜 '연결 요청 대기 큐'라고 하며, 서버 소켓과 연결요청 대기 큐가 완전히 준비되어서 클라이언트의 연결요청을 받아들일 수 있는 상태를 가리켜 '연결요청 대기 상태'라 한다.


06. 클라이언트 프로그램에서 소켓에 주소정보를 할당하는 bind 함수호출이 불필요한 이유는 무엇인가? 그리고 bind함수를 호출하지 않았을 경우, 언제 어떠한 방식으로 IP주소와 PORT번호가 할당되는가?
네트워크를 통해서 데이터를 송수신하려면 IP와 PORT가 반드시 할당되어야 한다.
언제? connect 함수가 호출될 때,
어디서? 운영체제에서, 보다 정확히 표현하면 커널에서
어떻게? IP는 컴퓨터(호스트)에 할당된 IP로, PORT는 임의로 선택해서!!
: 즉, bind함수를 통하여 소켓에 IP와 PORT를 직접 할당하지 않아도 connect 함수 호출 시 자동으로 소켓에 IP와 PORT 가 할당된다. 따라서 클라이언트 프로그램을 구현할 때에는 bind함수를 명시적으로 호출할 필요가 없다.


07. Capter 01에서 구현한 예제 hello_server.c와 hello_server_win.c를 lterative 모델로 변경하고 제대로 변경이 되었는지 클라이언트와 함께 테스트해보자.
Iterative 서버 : 계속하여 들어오는 클라이언트의 연결 요청을 수락하기 위한 서버.
               ( 현 단계에서는 fork. 즉 프로세스와 스레드에 대한 고려 없이 그저 반복문으로 구현한다.)
Posted by Triany