웹 서버를 만들기 전에 알아야 할 것들을 정리해봄

Designated Hitter Jack·2023년 9월 16일
0

SW 사관학교 정글

목록 보기
18/44
post-thumbnail

CSAPP 11장을 읽기 전(사실 다 읽었지만 배운것들을 정리하기 전) 이번 주에 알아야 할 개념들로 제시된 단어들은 다음과 같다.
BSD소켓, IP, TCP, HTTP, file descriptor, DNS

OSI 7 Layer

Network Protocol: 통신에 참여하는 사람들 사이에서 약속된 통신 방법
모듈화: 통신을 기능별로 분리해서 구현했음
대표적인 모듈화의 예시로 OSI model, TCP/IP stack이 있고 둘 사이에는 유사점이 많아 어느정도 호환도 가능하다.
각 Layer는 하위 Layer의 기능을 사용하여 자신의 기능을 구현한다.

L7: Application Layer

어플리케이션 목적에 맞는 통신방법을 제공.
HTTP, DNS, SMTP, FTP 등

L6: Presentation Layer

어플리케이션 간 통신에서 메시지 포맷 관리
인코딩 - 디코딩, 암호화 - 복호화, 압축 - 압축풀기 등

L5: Session Layer

어플리케이션 간 통신에서 세션을 관리
RPC

여기까지를 application영역이라고 엄격하게 구분하지 않고 다루는 경우가 많다.
TCP/IP STACK 에서는 어플리케이션 레벨에서 구현/관리되는 영역이며
네트워크 기능을 사용하는데 목적이 있다.


여기서부터는 system 영역이라고 구분되기도 한다.
하드웨어 / 펌웨어, OS 레벨에서 구현하고 관리되는 영역.
네트워크 기능을 지원하는 것이 목적이다.

L4: Transport Layer

어플리케이션 간의 통신을 담당함.
목적지 어플리케이션으로 데이터를 전송.
대표적으로 안정적이고 신뢰할 수 있는 데이터 전송을 보장하는 TCP
데이터 전송에 필수적인 기능만 제공하고 안정적이진 않은 UDP

L3: Network Layer

호스트 간의 통신을 담당함.(IP)
목적지 호스트로 데이터를 전송.
네트워크 간의 최적의 경로를 전송함.
그 외에도 IP address -> Mac address 변환 프로토콜 ARP 등이 있다.

직접 연결된 노드간의 통신담당
Mac address 기반 통신

L1: Physical Layer

bit 단위로 데이터를 전송
유선, 무선인 것은 중요하지 않음

IP(Internet Protocol)

호스트 간의 통신을 지원하기 위해 약속된 프로토콜이다.
한 Host에서 다른 Host로 데이터를 보낼 때 이용되지만 Unreliable하다는 점이 특징이다.(data-loss가 생길 수 있음)

IP address

각 호스트는 IP address라는 주소를 가지고 있으며 이는 비부호형(unsigned) 32bit 정수이다. 네트워크 프로그램에서는 이 주소를 네트워크 바이트 순서(빅 엔디안)로 정의한다. 호스트 바이트가 리틀 엔디안인 경우에는 htonl(Host to Network Long)함수와 ntohl(Network to Host long) 함수를 사용하여 32비트 정수를 각각의 형태로 변환할 수 있다.

사람이 사용할 때에는 빅 엔디안 순서로 나뉘는 각 단위를 16진법에서 10진법으로 환산하고 .으로 분리한 dotted-decimal 스트링으로 제시한다.

0x6BD47ACD를 (빅 엔디안일 때) 앞에서부터 두 숫자씩 10진법으로 변환하고 
사이에 . 을 찍어 구분한다.
즉 6B = 107
D4 = 212
7A = 122
CD = 205 가 되어서 107.212.122.205 가 되는 것이다.

응용 프로그램들은 IP주소와 dotted-decimal string을
inet_pton (presentation -> network 즉, dotted-decimal -> IP),
inet_ntop (network -> presentation, IP -> dotted-decimal)
함수를 사용해 변환할 수 있다.

엔디안이란?

위키피디아
TCP school

TCP

IP로 구현된 기능을 바탕으로 구현된 프로토콜이다. 프로세스 간의 연결을 위하여 만들어진 프로토콜로 안전한 완전 양방향 연결을 지원한다. 인터넷 통신의 기본이 되는 TCP/IP통신은 우선 IP를 이용해 Host와 Host의 연결이 이루어진 후, TCP를 이용하여 각 Host에서 실행중인 프로세스끼리 연결하는 것이다. 이를 위하여 어플리케이션 영역에서 돌아가는 각 프로세스에서는 시스템영역에서 (TCP는 transport layer니까) port를 이용해 프로세스간의 연결을 지원한다.
port는 프로세스와 연결된 data path 또는 data channel이라고 할 수 있다. 각 port 는 port number로 구분된다.

BSD socket

connection

인터넷 클라이언트와 서버는 connection을 통해서 byte stream을 주고 받는 형식으로 통신을 한다.
connection은 프로세스 간의 안정적이고 논리적인 통신 통로로, 3-way handshake 라는 과정을 통해 connection을 열고, 데이터를 주고 받고, 4-way handshake를 통해 connection을 닫는다.
어떤 연결이 이러한 과정을 거친다면 이를 connection oriented라고 할 수 있다.
이러한 connection은 두 개의 프로세스를 연결한다는 점에서 point-to-point 연결이며 동시에 양방향으로 데이터가 흐를 수 있다.(full-duplex)
그리고 바이트 스트림이 보낸 것과 동일한 순서로 수신된다.(reliable)

그렇다면 인터넷상에서 어떻게 port를 unique하게 식별할 수 있을까?
우선 IP address를 통해 각 host는 unique 하게 식별할 수 있다. 이를 바탕으로 각 host 내에서 실행중인 프로세스가 가지고 있는 port번호를 통해 프로세스들 간의 connection이 unique해지는 것이다.
이를 socket이라고 한다.

다시말해 socket은 connection의 종단점이며 IP address와 Port number가 결합되어야 connection의 종단점으로써 unique해진다.
그리고 connection은 socket과 socket의 연결이 되며, 두 개의 socket의 주소를 연결하기 때문에 unique하다고 말할 수 있다.
tuple로 나타내면
(client address : client port, server address : server port)로 표현할 수 있다.

달리 표현하자면 socket이 unique해야 connection이 성립될 수 있기 때문에 IP 주소가 같더라도 포트 번호만 다르다면 connection이 성립될 수 있다.
또한 하나의 socket은 동시에 여러 connection에서 이용될 수 있다.

HTTP

HyperText Transfer Protocol은 웹 클라이언트와 웹 서버가 서로 통신할 때 사용하는 Application Layer의 텍스트기반 프로토콜이다.
클라이언트는 서버에 HTTP request를 보내고 이를 받은 서버는 클라이언트에게 HTTP respond 를 보내는 방식으로 작동한다.

HTTP request

request 는 request line, request header로 나타낼 수 있다.

request line

method URI version

순서로 구성되는데 method는 GET, POST를 대표적으로 여러 method가 있지만 우리가 만들 웹서버는 일단 GET 요청만 처리할 수 있게 만들 예정이다. GET method는 서버에게 URI에 의해 식별되는 내용을 리턴할 것을 지시한다.(다시말해 클라이언트가 서버로부터 데이터를 읽는다.)
URI는 URL의 접미어로 파일이름과 인자들을 옵션으로 가지고 있다.
version은 요청이 준수하는 HTTP 버전을 나타낸다. HTTP/1.1같은 방식으로 쓸 수 있다.

request headers

request header는 서버에 브라우저의 이름이나 브라우저가 이해하는 MIMT 타입 등 추가 정보를 제공한다.

header-name: header-data

형식으로 쓸 수 있다.

request body

여기에는 client에서 server에 전달하고자 하는 정보 자체가 들어간다. 대표적인 예시로, login시 ID와 비밀번호 등이 있다.

HTTP respond

respond line

version status-code status-message

의 형태로 구성된다.

version필드는 respond 가 준수해야 할 HTTP 버전을 서술한다.

status-code는 3비트 양수로, 요청의 특성을 나타낸다.

  • 1XX Informational
  • 2XX 성공
  • 3XX 리디렉션
  • 4XX 클라이언트 오류
  • 5XX Server Error
    "xx"는 00에서 99 사이의 다른 숫자들을 나타낸다.

숫자 '2'로 시작하는 상태 코드는 성공을 나타낸다. 예를 들어 클라이언트가 웹 페이지를 요청한 후 가장 일반적으로 표시되는 응답의 상태 코드는 '200 OK'로, 요청이 제대로 완료되었음을 나타낸다.

응답이 '4' 또는 '5'로 시작하면 오류가 발생했음을 의미하며 웹 페이지가 표시되지 않는다. '4'로 시작하는 상태 코드는 클라이언트 쪽 오류를 나타낸다(URL에 오타가 생길 때 '404 NOT FOUND' 상태 코드가 발생하는 것이 아주 일반적임). '5'로 시작하는 상태 코드는 서버 쪽에서 문제가 발생했음을 의미한다.

상태 메시지는 에러 코드를 영어로 나타낸 것이다.

respond header

respond header 는 respond 에 대한 추가적인 정보를 제공한다.
Content-Type에서는 respond body 내 contents의 MIME 타입을 알려준다.
Content-Length에서는 그 크기를 바이트로 나타내었다.

file descriptor

Unix OS에서 네트워크 소켓과 같은 파일이나 기타 입력/출력 리소스에 액세스하는 데 사용되는 추상표현이다.
즉, 시스템으로 부터 할당받은 파일이나 소켓을 대표하는 정수다.

파일 디스크립터는 음이 아닌 정수(Non-negative Integer)로, 일반적으로 형식 int로 C 프로그래밍 언어로 표현된다(음수 값은 "무값" 또는 오류 조건을 나타내기 위해 예약된다).
FD의 0번에서 2번까지는 고정되어 있다. (unistd.h 헤더파일에 명시)

각 Unix 프로세스는 세 가지 standard streams에 해당하는 고정된 standard POSIX file descriptors를 가진다.

표준입력 및 표준출력도 파일 디스크립터로 표현이 되는데 이들은 프로그램이 시작되면 기본적으로 열리고, 종료 시 자동으로 닫힌다.

표 출처 위키피디아
표준 입력(Standard Input) : File Descriptor 0
표준 출력(Standard Output) : File Descriptor 1
표준 에러 출력(Standard Error) : File Descriptor 2

파일 디스크립터가 단순히 숫자인 이유는 프로세스가 유지하고 있는 file descriptors 테이블의 인덱스이기 때문이다.
파일 오픈 or 소켓생성 시 부여되는 파일 디스크립터는 3부터 시작한다.
프로세스가 실행 중에 파일을 Open 하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값을 할당해 준다.
그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, 파일 디스크립터 값을 이용해 파일을 지칭할 수 있다.

FD의 최대값은 OPEN_MAX라는 값이다.
즉, 하나의 프로세스 당 최대 OPEN_MAX개의 파일을 열 수 있다. OPEN_MAX 값은 플랫폼에 따라 다르다.
최대 파일 갯수는 다음의 방법을 사용하여 알아볼 수 있다.
OPEN_MAX는 단일 프로그램에 허용되는 최대 열린 파일 수를 정의하는 상수다. Unix 시스템에서 C언어의 OPEN_MAX는 limits.h에 정의돼있다.

스토리로 비유하기

전화 한 통만 하면 필요한 논문을 복사해 주는 곳이 있다. 그리고 그곳의 단골손님 영수가 있다. 그런데 이 녀석은 매번 똑같은 논문의 일부분을 복사해 달라고 한다. “아저씨~ ‘고도의 정보화 사회가 되어 가면서, 인간의 삶의 질과 관계된 문제들이 점점 더 그 중요성이 더해짐에 따라 감각, 지각, 사고, 성격, 지능, 적성 등의 인간적 특징들이 고려됐을 때의 인간의 원리에 대한 연구’ 라는 논문 26쪽부터 30쪽까지 복사해 주세요” 이 녀석은 보통 이런 식으로 하루에도 여러 번 주문을 한다. 설상가상으로 말하는 속도도 느린 편이다. 그래서 아저씨가 말씀하시길 “그 논문은 이제부터 너의 18번이다! 그냥 저의 18번 논문 26쪽부터 30쪽까지 복사해 주세요 라고 해라!”영수는 그 이후로도 최소 50자가 넘는 제목의 논문만 복사 주문을 한다. 그 때 마다 아저씨는 논문에 새로운 번호를 할당해 준다(중복되지 않는). 그래야 영수와의 대화 속에서 스트레스를 덜 받을 수 있기 때문이다.
출처

DNS

클라이언트와 서버는 IP주소를 이용하여 서로 통신하지만 사람은 이러한 정수를 기억하고 있기 어렵다. 그렇기 때문에 도메인 네임이라는 사람이 기억하기 쉬운 문자로 된 주소를 IP주소와 연결하여 이를 매핑하는 서비스를 Domain Name System라고 한다.
루프백 주소가 localhost로 매핑된 것이 대표적이다.
다수의 도메인 이름은 다수의 IP주소에 매핑될 수 있다.

profile
Fear always springs from ignorance.

1개의 댓글

comment-user-thumbnail
2023년 9월 17일

정글 탐험이라는 태그를 추가하셨군요 ! 굿쟙

답글 달기

관련 채용 정보