☑️ 네트워크 계층(OSI 7 Layer, TCP/IP Layer)
⭐ OSI 7 Layer
OSI 7 Layer를 이해하기 위해서는 OSI 모델을 알아야 한다. OSI 모델은 네트워크 통신을 위해서 7개의 계층으로 표현된 이론을 의미한다. 하드웨어나 응용 프로그램에 직접 구현된 것이 아니라, 해당 이론을 기반으로 프레임워크를 만들게 된다. 그렇기 때문에 OSI 모델은 OSI 참조 모델(OSI Reference Model)이라고 부르기도 한다.
OSI 7 Layer가 무엇을 의미하는지 알게 되었으니까, 각 계층이 가지는 역할을 보자. 계층마다 역할을 수행하기 위한 방법이 많지만 자세한 내용은 피하고 어떤 역할을 가지는지만 간단하게 보자.
1) 물리(Physical) 계층
- OSI 모델 최하위에 존재하는 계층이다.
- 하드웨어(케이블, 허브, 리피터, 등)를 의미한다.
- 1과 0을 가지고 데이터를 구성하며, 이러한 단위를 비트라고 한다.
2) 데이터 링크(Data Link) 계층
- 물리적으로 이어진 네트워크의 작업을 담당하는 계층이다.
- 같은 네트워크에 위치한 장치 간의 데이터 전송, 흐름 제어 및 오류 제어를 담당한다.
- 프레임 단위로 데이터를 전송한다.
3) 네트워크(Network) 계층
- 물리적으로 이어져 있지 않은 네트워크의 작업을 담당하는 계층이다.
- 데이터 링크 계층과 비슷한 역할을 처리한다. 단, 물리적 연결 여부가 다르다.
- 데이터가 목표에 도달할 수 있도록 하는 라우팅을 지원한다.
- 패킷 단위로 데이터를 전송한다.
4) 전송(Transport) 계층
- 두 네트워크 기기간의 연결 속도가 다를 경우, 적절한 전송 속도를 유지할 수 있도록 결정한다.
- 데이터의 신뢰성과 무결성을 보장할 수 있다.
- UDP는 빠른 속도에 초점을 맞췄기 때문에 신뢰성과 무결성을 보장할 수 없다.
- 주요 프로토콜로는 TCP와 UDP가 존재한다.
- 세그먼트 단위로 데이터를 전송한다.
5) 세션(Session) 계층
- 두 기기 사이의 통신으르 시작하고 종료하는 일을 담당한다.
- 통신이 시작되고 종료까지의 시간을 세션이라고 한다.
- 데이터의 체크포인트를 담당한다.
- 세션에서 지정한 체크포인트는 5MB이며, 10MB의 데이터를 전송받는다고 가정하자.
- 데이터를 6MB까지 전송했을 때, 연결이 끊겼다.
- 다시 연결되면 데이터를 5MB부터 수신받을 수 있도록 처리한다.
- 체크포인트가 없다면 처음부터 다시 시작해야 한다.
6) 표현(Presentation) 계층
- 읽을 수 있는 데이터일 경우, 압축 및 암호화, 등을 담당한다.
- 읽을 수 없는 데이터일 경우, 압축 해제 및 복호화, 등을 담당한다.
7) 응용(Application) 계층
- OSI 모델 최상위에 존재하는 계층이다.
- 사용자와 직접 상호 작용하는 유일한 계층이다.
- 사용자가 요구하는 행동(데이터 전송 및 수신, 등)에 네트워크 프로토콜을 지정하는 행위를 한다.
⭐ TCP/IP Layer
앞서 본 OSI 7 Layer의 설명과 같이, TCP/IP Layer는 TCP/IP 모델의 Layer들을 표현하는 단어다. TCP/IP 모델은 OSI 모델과 다르게 실전에서 사용된다. TCP/IP의 계층은 4개 혹은 5개로 표현된다. 이 둘은 서로 다른 것이 아니라, 4개의 계층을 세분화한 결과가 5개로 표현되고 있다. 둘은 동일하다.
1) 네트워크 접근(Network Interface) 계층
- OSI 모델에서 물리 계층과 데이터 링크 계층에 대응된다.
- 동일한 역할을 담당한다.
2) 네트워크(Network) 계층
- OSI 모델에서 네트워크 계층에 대응된다.
3) 전송(Transport) 계층
- OSI 모델에서 전송 계층에 대응된다.
4) 응용(Application) 계층
- OSI 모델에서 응용 계층과 표현 계층, 세션 계층에 대응된다.
☑️ 클라이언트-서버 모델
⭐ 클라이언트
서비스를 요청하는 주체를 의미한다.
⭐ 서버
요청 받은 서비스를 처리하는 주체를 의미한다.
⭐ 클라이언트와 서버?
- 클라이언트와 서버는 상대적으로 역할을 가진다..
- 클라이언트 A, 서버 A, 서버 B가 있다고 가정하자.
- 클라이언트 A는 서버 A에 요청을 보낸다.
- 서버 A는 요청을 해결하기 위해서 서버 B에 요청을 보낸다..
- 클라이언트 A의 관점 : 서버 A, 서버 B는 서버다.
- 서버 A의 관점 : 클라이언트 A는 클라이언트고, 서버 B는 서버다.
- 서버 B의 관점 : 클라이언트 A와 서버 A는 클라이언트다.
- 서버는 여러 클라이언트의 요청에 응답할 수 있다.
⭐ 클라이언트-서버 모델
- 클라이언트와 서버로 이루어진 네트워크 구조를 의미한다
- 분산 네트워크 구조의 기본 모델이 된다.
☑️ 소켓(Socket, Bind, Listen, Accept, Connect, Close)
⭐ 소켓(Socket)
소켓은 연결의 종단점(Endpoint)을 의미한다. 종단점은 어렵고 예시는 쉽다. 데이터를 서로 주고받을 수 있는 창구의 역할을 하는 것이다. 그렇기 때문에 프로세스 간의 통신을 위한 인터페이스로 사용되며, IP와 Port로 식별할 수 있다.
소켓은 여러 종류로 이루어져 있으며, 각 타입마다 지향하는 목표가 조금씩 다르다.
- TCP 소켓 : 신뢰성 확보 목표
- UDP 소켓 : 속도 효율 목표
- Raw 소켓 : 프로토콜 직접 제어
- 기타 등
⭐ 클라이언트-서버 모델에서 소켓 함수의 사용
⭐ Socket 함수
int socket(int domain, int type, int protocol);
- 소켓 생성에 필요한 리소스를 할당하고 종단점(Endpoint)를 생성한다.
- 반환 값으로 해당 종단점을 참조하는 File Descriptor를 가진다.
- 호출에 성공하면 사용 가능한 낮은 번호의 File Descriptor를 반환한다.
⭐ Bind 함수
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- socket 함수로 생성된 소켓은 주소가 할당되지 않은 상태이다.
- bind 함수를 통해서 소켓에 주소를 할당한다.
⭐ Listen 함수
int listen(int sockfd, int backlog);
- sockfd가 참조하고 있는 소켓을 accept 함수의 연결 요청을 수신받는 소켓으로 변경한다.
- 서버에서 생성된 소켓이 클라이언트의 요청(Accept)을 받을 수 있도록 준비하는 함수
⭐ Accept 함수
int accept(int sockfd, struct sockaddr *_Nullable restrict addr, socklen_t *_Nullable restrict addrlen);
- 연결 기반 소켓에서 사용된다.
- 새로운 연결 소켓을 생성하고 소켓의 File Descriptor를 반환한다.
- 이때, 원래의 소켓에 영향을 끼치지 않는다.
⭐ Connect 함수
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- sockfd가 참조하는 소켓을 addr의 지정된 주소로 연결한다..
- 클라이언트가 서버에 연결할 때 사용된다.
⭐ Close 함수
int close(int fd);
- fd가 참조하고 있는 소켓을 종료한다.
☑️ 파일 디스크립터
Unix 계열의 OS는 '모든 것을 파일'로 관리한다. 이때, 특정 파일을 식별할 수 있는 추상적인 정수 값을 파일 디스크립터(File Descriptor)라고 한다. 파일 디스크립터는 프로세스에 종속되어 사용되며, 열린 상태의 파일 목록을 관리한다. 각각의 파일 디스크립터 값은 파일 디스크립터 테이블에 위치해 있다.
프로세스가 신규 파일을 Open하면, 파일 디스크립터 테이블에서 할당되지 않은 가장 낮은 정수 값을 할당한다. 이후, 해당 값을 통해서 파일을 핸들링 할 수 있다.
⭐ 정의된 파일 디스크립터
파일 디스크립터 테이블에는 편의를 위해서 이미 정의되어 있는 파일 디스크립터가 존재한다.
0 | 표준 입력(Stdin) |
1 | 표준 출력(Stdout) |
2 | 표준 에러(Stderr) |
☑️ Datagram Socket vs Stream Socket
⭐ Datagram Socket
- 데이터그램 소켓은 신뢰성과 무결성을 보장하지 않는 양방향 데이터 흐름을 지원한다.
- 데이터그램은 목적지에 데이터가 도착하지 못할 수 있다.
- Broadcast에 적합하다.
- UDP에서 사용되는 소켓
⭐ Stream Socket
- 스트림 소켓은 연결 지향형이며, 양방향 통신을 지원한다.
- 컴퓨터 A와 컴퓨터 B는 서로 연결되어 있음을 알아야 한다..
- 신뢰성과 무결성을 보장한다.
- 큰 데이터 전송에 적합하다.
- 기본적으로 1 vs 1 통신만 지원한다.
- TCP에서 사용되는 소켓
☑️ CGI / WebServer / MIME Type
⭐ CGI (Common Gateway Interface)
- 초기 인터넷은 정적 컨텐츠만 사용이 가능했음.
- 이후 동적 컨텐츠를 지원하기 위해서 CGI 프로그램이 나타남.
- 동적 컨텐츠 -> 사용자 상호작용, DB 연동, 실시간 데이터 처리, 등
- 웹 서버와 외부 응용 프로그램을 연결하기 위한 프로토콜을 담당함.
- 필요한 경우 CGI 프로그램을 실행
- 프로그래밍 언어에 독립적으로 지정된 스펙만 준수하면 된다.
⭐ Web Server
- 클라이언트에서 요청하는 웹 리소스를 전달하는 서버
⭐ MIME Type (Multipurpose Internet Mail Extensions)
문서, 이미지, 등과 같은 파일의 형식을 나타낸다. 브라우저는 파일 확장자가 아니라, MIME 타입을 기반으로 URL을 처리한다.
MIME 타입은 아래와 같이 이루어져 있다.
types/subtype
types는 Video, Text와 같이 데이터 타입이 속하는 일반 카테고리를 나타내며 subtype은 조금 더 상세한 카테고리를 알려준다.
MIME 타입 (IANA 미디어 타입) - HTTP | MDN
미디어 타입 (Multipurpose Internet Mail Extensions 또는 MIME type로도 알려져 있음)이란 문서, 파일 또는 바이트 집합의 성격과 형식을 나타냅니다. MIME 타입은 IETF의 RFC 6838에 정의 및 표준화되어 있습니다
developer.mozilla.org
☑️ HTTP (요청/응답, 헤더, 메소드, 상태코드, HEAD 메소드)
⭐ HTTP (Hyper Text Transfer Protocol) ?
HTTP는 서버 혹은 클라이언트에서 HTML 문서와 같은 리소스를 가져오기 위한 프로토콜이다. 웹 브라우저를 예시로, 가져오는 컨텐츠들은 무수한 HTTP 요청의 결과를 의미한다.
클라이언트가 보내는 메시지를 요청(Request)이라 하고 서버가 답변으로 보내는 연락을 응답(Response)이라고 한다.
⭐ HTTP 요청(Request)과 응답(Response)
위에서 언급한 내용과 같이 HTTP 메시지는 2가지 유형이 있다. 어떤 리소스를 요청하는 요청 메시지(Request Message)와 요청에 응답하는 응답 메시지(Response Message)다.
두 Message는 유사한 구조를 공유한다.
- 요청 혹은 결과를 설명하는 Start Line
- 요청을 지정하거나 메시지 본문을 설명하는 HTTP 헤더
- 요청에 필요한 메타 데이터가 전송됨을 알리는 Empty Line
- 요청과 관련된 데이터를 포함하는 Body
이때, Body는 Start Line과 HTTP 헤더에 따라서 선택적으로 존재한다.
⭐ HTTP 요청(Request)
요청 메시지는 다음과 같은 구조를 가진다.
Request Line (Start Line)
Request Headers
Empty Line
Body
Example )
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 57
User-Agent: PostmanRuntime/7.29.0
Accept: */*
{
"username": "john_doe",
"email": "john@example.com"
}
- Request Line
[HTTP 메서드] [요청 대상] [HTTP 버전]
ex) GET / HTTP/1.1
HTTP 메서드는 동사 혹은 명사를 통해서 요청하는 작업을 설명한다. 요청 대상은 일반적으로 URL을 전달한다. HTTP는 버전에 따라서 메시지 구조가 다르기 때문에 HTTP 버전을 보냄으로써 메시지 구조를 정의하고 응답에서 처리할 수 있다.
- Header
앞서 설명한 HTTP 헤더의 기본 구조와 동일하다.
- Body
요청을 처리하기 위해서 서버에 필요한 내용이 들어간다.
⭐ HTTP 응답(Response)
HTTP 응답 메시지는 다음과 같은 구조를 가진다.
Status Line (Start Line)
Response Header
Empty Line
Body
Example)
HTTP/1.1 200 OK
Date: Mon, 29 Oct 2024 12:00:00 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Content-Length: 138
Connection: keep-alive
<!DOCTYPE html>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
- Status Line
[HTTP 버전] [Status 코드] [Status 텍스트]
ex) HTTP/1.1 404 Not Found.
HTTP 버전은 1.0 혹은 1.1으로 전송한다. 또, Status 코드는 응답 결과에 따른 상태를 코드로 반환하며, 해당 코드를 읽을 수 있도록 표현한 것이 Status 텍스트다.
- Header
요청에 따라 처리된 내용은 서버에서 클라이언트로 응답 메시지(Response Message)로 보내게 되며, 구조는 다음과 같다.
- Body
응답에 처리되는 컨텐츠를 담아서 전달한다.
⭐ HTTP 메소드
GET / HTTP/1.0
위의 내용에서 'Get'에 해당하는 문자를 나타낸다. 메소드는 여러 종류가 있는데, 자주 사용되는 메소드는 다음과 같다.
GET | 특정 리소스를 불러오는 것을 요청한다. 데이터를 받는다. |
POST | 특정 리소스에 데이터를 전달할 때 사용된다. |
PUT | 특정 리소스를 업데이트할 때 사용된다. |
DELETE | 특정 리소스를 삭제할 때 사용된다. |
HEAD | GET 메서드와 동일한 응답을 요구한다. 단, 응답에 Body가 포함되지 않는다. |
⭐ 상태 코드
HTTP 상태 코드를 통해서 보낸 요청이 어떤 상태인지 알 수 있다. 응답은 총 5개의 그룹으로 나뉜다. 여러 개의 상태 코드가 있으나, 일부만 알아본다. 자세한 것은 아래 링크 참고
HTTP 상태 코드 - HTTP | MDN
HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 알려줍니다. 응답은 5개의 그룹으로 나누어집니다: 정보를 제공하는 응답, 성공적인 응답, 리다이렉트, 클라이언트 에러, 그리고
developer.mozilla.org
1XX | 정보를 제공하는 응답 |
2XX | 성공적인 응답 |
3XX | 리다이렉트 |
4XX | 클라이언트 에러 |
5XX | 서버 에러 |
- 1XX 번대 상태 코드
100 | Continue : 지금까지 상태가 원활하기 때문에 진행할 수 있다. |
101 | Switching Protocol : 서버에서 프로토콜을 변경할 것을 알린다. |
102 | Processing : 서버가 요청을 수진했으나, 아직 진행중에 있음을 알려준다. |
- 2XX 번대 상태 코드
200 | OK : 요청이 성공적으로 완료되었다. |
201 | Created : 요청이 성공되었으며, 새로운 리소스가 생성되었다. |
202 | Accepted : 요청을 수신했지만, 요청에 따른 응답을 처리할 수 없다. |
- 3XX 번대 상태 코드
300 | Multiple Choice : 요청에 대해서 복수의 응답이 가능하다. |
301 | Moved Permanently : 요청한 리소스의 URI가 변경되었음을 알려준다. |
302 | Found : 요청한 리소스의 URI가 일시적으로 변경됨을 알려준다. |
- 4XX 번대 상태 코드
400 | Bad Request : 잘못된 문법으로 서버가 요청을 이해할 수 없다. |
401 | Unauthorized : 인증되지 않은 클라이언트에게 응답을 보낼 경우 |
403 | Forbidden : 해당 컨텐츠에 접근할 권리를 가지고 있지 않다. |
404 | Not Found : 요청 받은 리소스를 찾을 수 없을 때 나타난다. |
- 5XX 번대 상태 코드
500 | Internal Server Error : 서버가 처리 방법을 모르는 경우 발생한다. |
501 | Not Implemented : 서버에서 지원되지 않은 요청을 처리할 때 발생한다. |
502 | Bad Gateway : 서버가 요청을 처리하는데 필요한 응답을 얻기 위해서 게이트웨이로 작업하는 동안 잘못된 응답을 수신했음을 나타낸다. |
☑️ Proxy
프록시는 클라이언트와 서버 사이에 게이트웨이를 제공하는 시스템 혹은 라우터를 의미한다. 클라이언트가 온라인에서 방문하는 웹 페이지 사이를 오가기 때문에 중개자라고도 불린다. 이로 인해서 해커가 개인 네트워크에 침입하는 것을 방지할 수 있다.
또, 반대로 프록시는 서버를 보호하기 위해서 사용될 수 도 있다. 프록시 서버가 존재하는 위치에 따라서 프록시 서버의 종류가 달라진다..
'활동 > 크래프톤 정글' 카테고리의 다른 글
[크래프톤 정글/Week 08] 키워드 정리 (3) | 2024.11.05 |
---|---|
[크래프톤 정글/Week 08/PintOS] Alarm Clock ( Busy-Waiting을 Sleep/Wakeup으로 바꿔보자 ) (8) | 2024.11.04 |
[TIL/크래프톤 정글] Day 40 ~ 42 (4) | 2024.10.12 |
[TIL/크래프톤 정글] Day 39 (8) | 2024.10.09 |
[TIL/크래프톤 정글] Day 38 (0) | 2024.10.08 |