네트워크를 구성하는 목적은 바로바로 사용자에게 서비스를 제공하기 위해서다.
local site의 user가 remote site computer의 서비스를 제공받으려면 어떻게 해야할까?
인터넷으로 연결된 local computer와 remote computer에서 제공받을/혹은 제공할 프로그램을 실행해야한다!
local machine에서 다른 응용 프로그램에 서비스를 요청하는 컴퓨터를 client, remote machine에서 요청에 응답하는 컴퓨터를 client라고 한다. 다시말해 요청과 응답은 분리되어있다.
one-to-many:서버는 서비스를 요청하는 여러개의 client에게 응답할 수 있다.
서버 프로그램은 적절한 sw만 있으면 어떤 컴퓨터든 가능, 서버는 계속 돌아가야된다.
클라이언트는 언제든 원하는 시간에 서비스를 요청할 수 있지만, 서버는 클라이언트의 요청이 언제 올지 모르기 때문에 매시간 돌아가야된다.
서버의 타입은 다음과 같이 4종류가 있는데,
UDP는 Connectionless iterative,
TCP와 SCTP는 Connection-oriented concurrent 서버다
UDP를 사용하는 서버는 iterative하다.
이 말은 서버는 한번에 하나의 request를 처리한다.
server는 UDP에서 datagram을 받아서, request처리하고, reponse를 UDP를 통해 client에 전송한다.
이 경우 server는 다른 datagram을 신경쓰지 않는다. 다른 datagrams는 큐(queue)에 저장되어 처리되길 기다린다.
server는 하나의 port를 사용한다.
위 그림처럼 모든 datagram은 이 포트에 도착하여 큐에 순서대로 처리되길 기다린다
TCP나 SCTP를 사용하는 서버는 concurrent하다.
이 말은 서버는 한번에 여러 클라이언트를 처리할 수 있다 는 말이다.
client의 request는 byte 단위의 stream 이다.
이 서버는 하나의 port만 사용하면 안된다. 왜냐하면 각각의 클라이언트와의 연결이 port를 필요로 하기 때문에 동시에 여러 포트를 써야한다.
하지만 서버는 well-known port를 써야하는데 이건 하나뿐이다!
이를 해결하기 위해 일단 client가 well-known port로 접근을 요청하면,
임시적인 다른 포트로 할당을 하고 well-known과의 연결을 해제한다.
오른쪽 그림처럼 서버는 여러개의 클라이언트를 상대하기 위해,
부모 프로세스를 카피하여 여러개의 child process를 생성한다.
각 connection별로 queue를 가지고 있으며, client로부터 온 segement는 적절한 큐에 저장된다.
client의 process는 어떻게 server의 process와 통신할까?
하나의 interface는 instructions의 집합이다. 이 instructions는 두개의 entities 사이의 상호작용을 위해 설계되어있다.
몇몇의 interface는 통신을 위해 설계되어있다.
:socket interface, transport layer interface(TLI), Stream
socket interface는 instruction의 집합으로, OS와 application layer사이에 위치해있다.
application과 OS가 통신하기 위해서는 OS가 소켓을 만들어야한다.
OS가 소켓을 생성하고 나면, application은 data를 받기 위해 해당 소켓에 연결한다. 통신을 위해서는 client와 server의 각 OS 소켓이 연결되어야 한다
여러가지 소켓 타입(TCP, UDP, SCTP)
Connectionless iterative communication using UDP
Flow diagram for connection-oriented, concurrent communication
child process가 생성된 후 할 일을 다 하고 destroyed되지 않으면 zombie process가 된다. 얘는 공간을 차지하기 때문에 시스템의 성능에 영향을 줄 수 있다.
TCP를 사용하는 에코 서버를 위한 서버 프로그램을 나타내고있다.
P2P서비스는 두 대의 peer computer가 각각 서비스를 제공하고 받는 것이다. 서버와 클라이언트의 구분이 없다.