서버란 무엇일까요?
서버는 os에 의해 동작하는 프로세스이며, 클라이언트의 역할을 하는 프로세스와 소켓을 통해 IPC를 수행하는 것이라고 표현할 수 있습니다
시스템 콜
운영체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다
ex) open()의 호출

프로세스
실행중에 있는 프로그램이다. 즉 메모리에 올라와 실행되고 있는 프로그램의 인스턴스를 말한다.
프로세스 내부에는 최소 하나의 스레드(thread)를 가지고 있는데, 실제로는 스레드 단위로 스케쥴링을 한다
OSI 7계층
네트워크 통신의 과정을 7단계의 계층으로 나눈 설계를 의미한다. 이렇게 계층을 나누어 놓으면, 계층별 해야할 일이 명확해지게 된다.

- 계층7 (응용 계층)
- 웹 서비스의 UI부분, 사용자의 입출력(I/O)를 담당한다
- 보통 개발하는 프론트엔드, 백엔드 서버가 바로 이 레이어 위에서 동작한다
- 계층6 (표현 계층)
- 응용 계층과 네트워크 계층을 위해 계층 간 데이터를 적절히 표현하는 부분을 담당한다 (ex. 이미지 압축, 데이터 암호화 등)
- 계층 5 (세션 계층)
- 통신은 실제로 '세션'이라는 단위 위에서 이루어진다
- 계층 4 (전송 계층)
- 컴퓨터로 들어온 네트워크 데이터를 어느 포트(어느 프로세스)로 보낼지 담당한다
- 예를 들어, 하나의 컴퓨터에 프론트엔드 애플리케이션은 80포트를, 백엔드 애플리케이션은 8080포트에 배포할 수 있다
- 계층 3 (네트워크 계층)
- IP주소를 사용하여 네트워크 데이터를 어느 컴퓨터로 보낼지 담당한다
- 흔히 말하는 '라우터'라는 기계가 이런 역할을 해준다
- 계층 2 (데이터 링크 계층)
- 네트워크 카드의 MAC주소를 사용해 네트워크 데이터를 어느 컴퓨터로 보낼지 담당한다
- MAC주소는 랜카드당 하나가 존재한다. 즉, IP주소와 다르게 변하지 않으며 하드웨터 자체에 포함되는 개념이다
- 계층 1 (물리 계층)
- 디지털 데이터를 아날로그적인 전기신호로 변환하여 네트워크 전선에 흘려보낸다
- 반대로 아날로그 신호를 디지털 신호로 바꾸는 역할도 한다
TCP/IP 4계층 모델
OSI 7계층 모델은 계층을 나누어 통신하도록 설계하자는 국제표준화기구의 제안일뿐, 실제로 인터넷 통신이 이렇게 동작하지는 않는다. 실제 대부분의 인터넷 통신은 IP와 TCP에 기반한 TCP/IP 통신을 사용한다.
OSI 계층과 유사하지만, 아래 그림처럼 4계층으로 간소화 되어있다.

- 계층 4 (응용 계층)
- HTTP, Talent, SSH, FTP와 같은 프로토콜이 여기에서 사용된다
- 계층 3 (전송계층)
- TCP, UDP와 같은 프로토콜이 여기에서 사용된다
- 계층 2 (인터넷 계층)
- 컴퓨터간 라우팅을 담당한다
- 계층 1 (네트워크 인터페이스 계층)
- 네트워크 통신의 물리적인 부분들을 주로 포함한다
HTTP vs HTTPS
먼저 HTTP는 Hyper Text Transfer Protocol의 약자로, 텍스트 문서를 주고 받기 위해 만들어진 프로토콜이다. 우리가 일상에서 사용하는 웹브라우저와 서버가 바로 이 HTTP를 사용하여 정보를 주고 받는다.
HTTP는 보안에 취약하기에 통신과정에서 응용 계층의 데이터를 암호화할 필요성이 느껴졌는데, 이로인해 보안을 위한 레이어 SSL(현재는 TLS라는 명칭도 사용)가 생기게 된다. 이 레이어는 응용 계층과 전송 계층사이에 존재하게 된다. 이렇게 보안의 역할을 하는 SSL 계층을 기반으로 하는 HTTP 통신을 HTTPS라고 한다.
TCP vs UDP
두 프로토콜 모두 패킷을 한 컴퓨터에서 다른 컴퓨터로 전달해주는 IP프로토콜을 기반으로 구현되어 있지만, 서로 다른 특징을 가지고 있다. 상호적인 TCP와 달리 UDP는 일방적인 송신 과정을 거친다는 점이다.
따라서 신뢰성이 요구되는 애플리케이션에서는 TCP를 사용하고, 간단한 데이터를 빠른 속도로 전송하고자 하는 애플리케이션에서는 UDP를 사용한다.
IP주소와 포트번호
컴퓨터가 네트워크 상에서 통신을 하기 위해서는 자신이 누구인지 유일하게 식별이 가능한 수단이 있어야하는데, 이때 사용되는 것이 IP주소입니다.
IP주소를 통해 컴퓨터를 식별했다면, 해당 컴퓨터에서 어떤 프로세스에게 데이터를 보내야하는지 알아야 하는데, 이때 사용되는 식별 값이 포트번호입니다.
즉, " 203.230.7.2:80 " 의 뜻은 203.230.7.2의 IP주소를 가진 컴퓨터의 80번 포트의 프로세스를 말합니다.
데이터의 송신, 수신 과정
- 송신
- 서버 프로세스가 운영체제의 write 시스템 콜을 통해 소켓에 데이터를 보내게 되고 이후 TCP/UDP 계층과 IP 계층 그리고 대표적으로 Ethernet을 거쳐 흐름제어, 라우팅 등의 작업을 하게 됩니다. 이후 마지막으로 NIC(랜 카드)를 통해 외부로 데이터를 보냅니다.
- 수신
- 데이터 수신 시에는 반대로 NIC에서 데이터를 수신 하고, 인터럽트를 통해 Driver로 데이터를 옮기고 이후 네트워크 스택에서 데이터가 이동하며 소켓에 데이터가 담기고, 최종적으로 수신 대상이 되는 프로세스에 데이터가 도달하게 됩니다.
1. socket() 시스템 콜
소켓을 만드는 시스템 콜입니다 (= 미리 형태를 잡아두는 것)
: socket(domain, type, protocol ); 의 형태
- domain : IPv4, IPv6중 무엇을 사용할지 결정
- type : stream, datagram 소켓 중 선택
- protocol : 0, 6, 17 중 0을 넣으면 시스템이 프로토콜을 선택하며, 6이면 tcp, 17이면 udp
2. bind() 시스템 콜
생성한 소켓에 실제 아이피 주소와 포트번호를 부여하는 시스템 콜입니다.
OS에게 어떤 소켓에 아이피 주소와 포트번호를 부여할지 알려주기 위해 파라미터에 소켓의 파일 디스크립터를 포함하며, 클라이언트는 통신 시 포트번호가 자동으로 부여되기에 bind 시스템 콜은 서버에서만 사용합니다.
: bind(sockfd, sockaddr, socklen_t) 의 형태
- sockfd: 바인딩을 할 소켓의 파일 디스크립터
- sockaddr: 소켓에 바인딩 할 아이피 주소, 포트번호를 담은 구조체
- socklen_t : 위 구조체의 메모리 크기
3. listen() 시스템 콜 (only for TCP)
listen() 시스템콜은 연결지향인 TCP에서만 사용하며, 파라미터로 받은 파일 디스크립터에 해당하는 소켓을 클라이언트의 연결요청을 받아들이도록 하며 최대로 받아주는 크기를 backlog로 설정합니다.
이 listen() 시스템 콜에서 설정하는 backlog가 TCP에서의 backlog queue의 크기입니다.
: listen(sockfd, backlog)의 형태
- sockfd : 소켓의 파일 디스크립터
- backlog : 연결요청을 받아줄 크기 = TCP의 백로그 큐의 크기
4. accept() 시스템 콜
accept 시스템 콜은 backlog queue에서 syn을 보내와 대기 중인 요청을 선입선출로 하나씩 연결에 대한 수립을 해줍니다.
: int accept(sockfd, sockaddr , socklen_t); 의 형태
- sockfd : 백로그 큐의 요청을 받아들이기 위한 소켓의 파일 디스크립터
- sockaddr : 선입선출로 빼온 연결 요청에서 알아낸 클라이언트의 주소 정보
- socklen_t : 위 구조체의 메모리 크기
'Node j.s > UMC' 카테고리의 다른 글
[chap 6] API URL의 설계 & 프로젝트 세팅 (0) | 2024.05.12 |
---|---|
[Chap3] Web Server & Web Application Server(WAS), Reverse Proxy (0) | 2024.04.29 |
[Chap2] AWS (VPC & Internet Gateway & EC2) (0) | 2024.04.16 |