Tuesday, July 20, 2010

chapter 4 (TCP 기반 서버/ 클라이언트 1)

앞서 소켓의 생성과 생성된 소켓에 주소 할당을 알아보았다. 이번에는 연결지향형 소켓을 중심으로 데이터 송수신방법에 대해 살펴보도록 한다.

-TCP와 UDP에 대한 이해-
TCP 소켓 : 프로토콜 체계는 IPv4인 PF_INET 이고 데이터 전송 방식은 연결지향형인 SOCK_STREAM인 유일한 소켓.

TCP/IP 프로토콜 스택 : 오른쪽 그림에서와 같이 4개의 계층으로 나뉘다. 이는 '인터넷 기반의 효율적인 데이터 전송' 이라는 문제를 하나의 큰프로토콜로 해결하려는 것이 아니라 작은 문제로 나눠서 효율적으로 풀기 위한것으로 표준화 작업을 통한 개방형 시스템 설계의 장점을 가진다.

LINK 계층 : 물리적 영역의 표준화로 LAN과 같은 네트워크 표준과 관련된 프로토콜을 정의하는 영역

IP 계층 : 목적지로 데이터를 전송하기 위해서 어떤 경로를 거쳐갈지를 해결하는 것이 IP 계층이고 이 계층에서 사용하는 프로토콜이 IP(internet protocol) 이다. 비연결지향적이며 데이터 손실이 있을 수 있어 신뢰할만한 프로토콜이 아니다.

TCP/UDP 계층 : IP계층에서 데이터 전송을 위한 경로를 알려주면 이를 바탕으로 실제 데이터 송수신을 담당하는 것이 TCP/UDP 경로이고 TCP가 상대적으로 복잡하다. IP 자체는 신뢰할만하지 않기 때문에 TCP 를 통해서 데이터 전송의 성공 확인을 하면서 안정적인 데이터 전송이 가능해 진다.

APPLICATION 계층 : 위의 과정은 소켓이라는 것 하나에 감춰져 있기에 프로그래머들이 자유로워 지는데 이러한 소켓이라는 도구를 사용하여 프로그램의 성격에 데이터 송수신에 대한 규칙을 APPLICATION 프로토콜이라 한다.


-TCP기반 서버, 클라이언트 구현-

TCP 서버에서의 기본적인 함수호출 순서 : socket(소켓 생성) -> bind(소켓 주소 할당) -> listen(연결 요청 대기 상태) -> accept(연결허용) -> read/write(데이터 송수신) -> close(연결종료)

함수의 매개변수와 return 형은 그림 참조

연결요청 대기상태로의 진입 : listen 함수가 호출되어야 클라이언트에 connect 함수가 호출될 수 있다.
매개인자 sock 은 '연결요청 대기상태'(클라이언트가 연결요청을 했을 때 연결 수락까지 요청을 대시시킬수 있는 상태)에 두고자 하는 소켓의 파일 디스크립터, backlog는 '연결 요청 대기 queue'의 크기 정보로 backlog를 5로 하였으면 클라이언트의 연결요청을 5개까지 대기 시킬수 있게 된다.

정리하자면 socket 함수로 생성된 소켓이 listen함수에 의해 문지기 소켓(서버 소켓)이 되어 banklog 만큼의 크기로 대기실을 만들고 이러한 상태가 되면 이를 '연결 요청 대기 상태'라고 한다.

클라이언트의 연결요청 수락 : socket 함수에 의해 만들어진 소켓은 listen함수에 의해 서버소켓이 되고 클라이언트의 연결요청을 대기시킨다. 이러한 대기중인 클라이언트와 데이터를 주고 받을 소켓이 하나 더 필요하다. 이는 accept 함수를 호출함으로서 소켓이 만들어 지고 이 소켓은 대기중인 클라이언트 소켓과 자동으로 연결된다.
 accept 함수의 매개변수는 bind 함수와 같으나 주소정보인 addr 은 bind에서 서버 자신의 주소아지만 accept에서는 연결요청 한 클라이언트의 주소정보이다. 또한 마지막 매개변수인 addrlen은 주소의 변수의 크기를 다른 변수에 저장한 뒤  그 변수의 주소 값을 전달해야 한다.

TCP 클라이언트의 기본적인 함수호출 순서 : 다음은 클라이언트의 구현 순서이다. socket(소켓생성) - > connect(연결요청) -> read/write(데이터 송수신) -> close(연결종료)

connect의 매개변수 중 sockdf 는 클라이언 소켓의 파일 디스크립터, servaddr은 연결요청을 하고자하는 서버의 주소 정보, addrlen은 주소의 변수 길이로 크기 정보를 변수에 저장한다음 그 변수의 주소를 넘겨야 한다.
connect함수의 return은 서버의 listen함수에 의해 대기 큐에 등록되거나 오류에 의한 연결중단이 되었을때 반환된다.
서버구현시 bind를 통해 소켓에 자기 자신의 IP와 PORT를 할당하였는데 클라이언트 구현시 이점이 생략되어 있다. 이는 connect 함수가 호출될때 운영체제(커널)에 의해 자신에게 할당된 IP와 임의의 PORT를 할당해서 생략되어지는 것이다.


-Iterative 기반의 서버, 클라이언트 구현-
에코서버와 에코 클라이언트를 구현하고자 한다. 에코 서버는 클라이언트가 전송하는 문자열 데이터를 그대로 재전송하는 서버이다.

Iterative 서버의 구현 : 오른쪽 그림과 같은 서버의 형식이 iterative 서버이며 이는 한번에 하나의 클라이언트에게만 서비스가 가능하다. 동시에 여러 클라이언트를 상대하기 위해서는 프로세스쓰레드의 개념을 알아야 한다.

이부분은 코드 위주이므로 책을 참조한다.