CS/Network

[CS Network] 서버와 클라이언트의 동작 차이 주요 용어 정리

반응형

참고서적 : 성공과 실패를 결정하는 1%의 네트워크 원리

개념적 차이

  • 클라이언트: 서버에게 서비스를 요청하고, 받은 응답을 사용자에게 표현하는 시스템
  • 서버 : 클라이언트의 요청에대한 서비스(응답)을 제공하는 컴퓨터 시스템

구조적 차이

  • 클라이언트 : 한 번에 하나의 서버에 요청을 보낸다.
  • 서버 : 동시에 다수의 클라이언트 PC에 응답하는 구조
  • 이러한 차이로 인해 소켓의 접속 동작에서 차이를 보인다.
    • 클라이언트는 소켓 접속동작을 하고, 서버는 접속대기 역할을 한다.
    • 더 구체적으로는 Socket 라이브러리를 호출하는 과정에 차이가 있다.
    • bind : 소켓에 포트번호 기록(클라이언트에서 지정한 서버측 소켓에 할당할 포트번호)
    • listen: 접속 대기상태라는 제어 정보를 기록하는 용도
    • accept: 접속 접수(실제 접속 기다리는 상태)

서버 애플리케이션의 구조

  • 서버 애플리케이션과 클라이언트의 1:1 매칭

    하나의 프로그램으로 여러 클라이언트와 대화 할 경우, 어느 클라이언트와 어디까지 대화가 진행되고 있는지 파악하기 어려우므로, 클라이언트가 접속할 때마다 새로 서버 프로그램을 작동. 서버 애플리케이션이 클라이언트와 1:1로 매칭되게 한다.

  • 서버 프로그램을 만드는 방법

    • 서버 프로그램 → 접속을 기다리는 부분 + 클라이언트와 대화하는 부분
    • 서버 프로그램 작동 후 초기화 동작을 마쳤을 때 접속을 기다리는 부분을 실행.
      • 접속을 기다리는 부분이 소켓을 작성하고, 소켓을 '클라이언트에서의 접속 동작을 기다리는 상태'로 만든 뒤 쉬는 상태가 됨
      • 이후 클라이언트가 접속하면 다시 작동해서 접속을 기다림.
    • 클라이언트와 대화하는 부분을 작동시켜 그곳에 접속이 끝난 소켓을 건네주고, 동작을 계속하면 클라이언트와 대화하는 부분은 접속이 끝난 소켓을 사용하여 클라이언트와 대화하기 시작
    • 대화가 끝나면 연결을 끊고 이 부분을 종료
  • 클라이언트와 대화하는 부분은 새 클라이언트가 접속할 때마다 기동 → 1:1로 대응

  • 서버 OS는 멀티태스크멀티스레드 라는 기능을 이용해 다수의 프로그램을 동시에 작동하는데, 이를 이용한 것.

  • 클라이언트가 접속했을 때 새로 프로그램을 기동하는 부분에서 시간이 걸리고 응답 시간이 추가 소요된다는 단점이 있다.

    • 해결: 미리 클라이언트와 대화하는 몇 개의 부분을 작동시켜두고, 클라이언트가 접속했을 때 비어있는 것을 찾아 접속한 소켓을 건네주는 방법도 있다.

멀티태스크 & 멀티쓰레드

  • 접속 패킷이 동작했을 때 새 소켓을 복사하여 접속한다.
  • 원래 소켓은 계속 접속 대기상태로 두어 동시에 다수의 클라이언트와 접속할 수 있게 된다.
  • 멀티태스크와 멀티쓰레드는 동시에 복수의 액세스를 병행하여 처리하는 OS의 기능을 말한다.
  • 태스크는 하나하나 별도의 프로그램을 의미하며, 쓰레드는 한 개의 프로그램을 몇 개의 부분으로 나눈 것으로 취급된다.

좌우 대칭의 통신 프로토콜

  • 클라리언트와 서버를 고정시켜 나누기보다는 좌우 대칭으로 어디서나 자유롭게 데이터를 송신할 수 있도록 하는 것이 좋다. (TCP의 배경에 이 개념이 있다.)
  • 하지만 어떻게 해도 좌우 대칭이 되지 않는 부분 → 접속 동작
  • 접속하는 측이 클라이언트, 기다리는 측이 서버

새 소켓을 만들 때의 포트 번호를 어떻게 해야 할까

  1. 복사하는 포트번호를 다르게 한다면?

    • 클라이언트에서 지정한 포트 번호로 소켓을 보냈을 때 돌아오는 소켓의 포트 번호는 다르게 된다. -> 회답이 올바른 상대로부터 왔는지, 다른 상대로부터 왔는 지 알 수 없게 된다.
  2. 복사하는 포트번호를 같게 한다면?

    • 같은 포트번호를 가진 소켓이 여러 개 존재해서 포트번호로 소켓을 식별할 수 없게 된다.

    • 이 문제를 해결하기 위해 추가로 네 가지의 정보를 더 사용하여 소켓을 식별한다.

      1. 클라이언트측 IP주소
      2. 클라이언트측 포트 번호
      3. 서버측 IP주소
      4. 서버측 포트 번호

      ❓ 그럼 디스크립터는 왜 필요하지?

    • 접속 대기 상태의 소켓에는 아직 클라이언트 측의 IP주소와 포트번호가 기록되어 있지 않기 때문이다.

    • 따라서 접속 대기 이전 상태에서는 디스크립터가 필요하며 한 가지 정보만으로 식별할 수 있다는 간편함도 있다.

반응형