서버란 무엇인가

김민기·2024년 4월 4일
0

Server

목록 보기
1/2

서버

  • OS가 다루는 프로세스를 서버라고 칭할 수 있다.

  • 서버와 클라이언트간의 연결을 하는 매개체 역할로 소켓이 있는데, 이를 통해 IPC를 수행할 수 있다

IPC(Inter-Process Communication) 란?

  • 프로세스들간에 서로 데이터를 주고 받는 행위, 방법 또는 경로를 의미한다

누구에게 어디로 보낼 것 인가

IP, Port

데이터를 주고 받기 위해서는 어디로에 해당하는 주소가 매우 중요하다
누구에게를 식별하기 위해 사용되는 것이 IP주소와 포트번호이다

원래는 IP주소만으로 사용했지만, 컴퓨터 보급량의 증가로 IP 개수의 한계로 이를 해결하기 위해 포트번호를 도입하게 됐다

현실에 비유를 해보자면,
기존에 한국은 단독주택(IP)으로 잘 생활하고 있었다
하지만 한국의 땅 크기는 고정돼있고, 인구의 증가로 단독주택에서 아파트를 짓고 아파트 내에서 호수(포트번호)를 나누게 되었다

어떤걸 어떻게 보낼 것 인가

위에서 어디로누구에게를 해결했다면, 다음으로는 어떤걸,어떻게를 정해야한다

데이터의 송수신 절차

송신

Application -> Sockets -> 네트워크 스택 -> NIC(랜카드) -> 외부

	  write()
    데이터 전송
    
    

수신

Application <- Sockets <- 네트워크 스택 <- NIC(랜카드) <- 외부

									  Interrupt
									 데이터 수신
                                     
                                    

소켓 Socket

송수신 절차 중간에 껴있는 소켓은 무엇이냐

그림만 봐도 알 수 있듯이, 다양한 시스템 콜이 일어나는 곳으로 os의 제어를 받는다

소켓의 시스템 콜

1. socket()

  • 소켓의 형태를 만드는 시스템 콜

    Input

    domain - 도메인 선택

    * IPv4, Ipv6

    type - 소켓의 종류 선택

    * stream, datagram 

    protocol - 프로토콜 선택

    * tcp, udp

    Output
    파일 디스크립터

파일 디스크립터

  • OS가 파일 디스크립터를 받았을 때, 데이터를 송수신 하기 위한 소켓을 알려주는 역할을 한다

※ 파일 디스크립터를 소켓을 특정해주는 '키'라고 한다면, 그에 대한 '벨류'는 리소스(소켓, 파일)등 에 대한 메타데이터라고 비유할 수 있다

2. bind()

  • 생성한 소켓에 IP주소와 Port를 부여하는 시스템 콜

    Input

    sockfd - 바인딩 할 소켓의 파일 디스크립터
    sockaddr - 바인딩 할 IP, port를 담은 구조체
    socklen_t - 구조체의 메모리 크기

3. listen()

  • 연결지향 네트워크인 TCP에서만 사용하는 시스템 콜

    Input
    sockfd - 소켓의 파일 디스크립터
    backlog - TCP 백로그 큐의 크기

4. accept()

  • 클라이언트의 요청을 보관해둔 백로그 큐에서 연결을 매칭시켜줌

    Input
    sockfd - 클라이언트의 요청을 받을 소켓의 파일 디스크립터
    sockaddr - 백로그 큐에서 빼온 클라이언트의 주소 정보
    socklen_t - 구조체의 메모리 크기

    Output
    소켓

queue의 자료구조 형태를 가진 백로그 큐에서 저장된 다수의 클라이언트 요청을 순차적으로 처리하면 어쩔 수 없이 병목현상이 발생하게됨

이를 해결하기 위해 accept() 시스템 콜을 사용한다

기존에 socket()으로 서버 소켓(클라이언트의 요청을 받을 메인 소켓)을 생성했다면, accept()를 사용해 클라이언트 소켓(서버 소켓의 백 로그 큐에 있는 요청을 처리하는 보조 소켓)을 생성한다.

보조 소켓병렬 처리에 사용하기 위해서 fork()라는 시스템 콜을 사용하여 프로세스를 추가로 생성한다

fork를 통해 추가로 생성한 프로세스와, accept를 통해 생성한 소켓을 매칭시켜줘서 병렬처리할 수 있도록한다.

fork와 accept를 통해 병렬 처리를 함으로써 병목 현상을 해결
하지만 병렬 처리를 함으로써 발생하는 오류인 동시성은 아직 문제이다


소켓의 시스템 콜 정리

1. socket()

  • 소켓의 틀을 결정하고, 파일 디스크립터를 결과값으로 반환

2. bind()

  • 생성된 소켓에 IP와 Port번호를 부여

3. listen()

  • 클라이언트의 요청을 보관해둘 백로그 큐를 생성

4. accept()

  • 소켓이 통신할 준비가 됐다는 것을 알리기 위한 시스템 콜
profile
work0ut

0개의 댓글