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