
OSI 7계층과 TCP/IP 4계층
과거에는 통신용 규약이 표준화 되지 않았고 각 벤더에서 별도로 개발했기 때문에 호환되지 않는 시스템이나 애플리케이션이 많았으며 서로 통신하기에 어려움이 있었다. 이를 ARPANET(미국 국방부 산하 연구소)에서 TCP/IP 4계층으로 정리하고, OSI 7계층으로 세분화 되면서 네트워크의 동작을 나누어 설명하고 있습니다.
네트워크 프로토콜 전체를 개발하는 대신, 계층별로 프로토콜을 개발하여 네트워크 구성 요소들을 모듈처럼 사용할 수 있게 되었습니다.
OSI 7계층은 네트워크를 총 7개의 계층으로 나누며, TCP/IP 4계층의 경우는 이를 크게 4개 계층으로 나누었습니다.
- 물리 계층 : 주로 물리적 연결과 관련된 정보를 정의합니다. 주로 전기 신호를 전달하는데 초점을 두고, 들어온 전기 신호를 그대로 잘 전달하는 것이 목적입니다.
- 데이터 링크 계층 : 물리 계층에서 들어온 전기 신호를 모아 알아 볼 수 있는 데이터 형태로 처리 합니다. 이 계층에서는 주소 정보를 정의하고 출발지와 도착지 주소를 확인한 후, 데이터 처리를 수행합니다.
- 네트워크 계층 : 이 계층에서는 IP주소와 같은 논리적인 주소를 정의합니다. 또한 라우터를 통해 정의한 IP주소를 이해하고, 이를 사용해 최적의 경로를 찾아 패킷을 전송합니다.
- 전송 계층 : 하위 계층에서 신호와 데이터를 올바른 위치로 보내고 신호를 만드는데 집중했다면, 전송 계층에서는 해당 데이터들이 실제로 정상적으로 보내지는지 확인하는 역할을 합니다. 네트워크 계층에서 사용되는 패킷은 유실되거나 순서가 바뀌는 경우가 있는 데, 이를 바로 잡아주는 역할도 담당합니다.
- 세션 계층 : 세션 계층은 양 끝 단의 프로세스가 연결을 성립하도록 도와주고, 작업을 마친 후에는 연결을 끊는 역할을 합니다.
- 프레젠테이션(표현) 계층 : 이 계층에서는 일종의 변역기 같은 역할을 수행합니다. MIME 인코딩이나 암호화, 압축, 코드 변환과 같은 동작이 이 계층에서 이루어집니다.
- 애플리케이션(응용) 계층 : 애플리케이션 프로세스를 정의하고, 애플리케이션 서비스를 수행합니다. 이 계층에서 사용되는 프로토콜은 다양한 종류가 있지만, 대표적인 프로토콜로는 HTTP, FTP, SMTP 등이 있습니다.
Application Layer - HTTP

HTTP의 특징
- 클라이언트의 서버 구조
- 무상태 프로토콜(Stateless), 비연결성(Connectionless)
- HTTP 메세지
- 단순함, 확장 가능성
클라이언트의 서버 구조

요청(Request)과 응답(Response) 구조이며, 클라이언트가 서버에 요청을 보내면 서버는 요청에 대한 결과를 만들어 응답합니다.
무상태 프로토콜 (Stateless)
서버가 클라이언트의 상태를 보존하지않아 서버 확정성이 높지만, 클라이언트가 추가 데이터를 전송해야한다.

예를 들어 상태유지 즉, Stateful일 때, 중간에 점원이 바뀌면 전에 고객이 요청했던 주문을 기억하지못해 다시 처음부터 주문해야하며, 점원이 고객의 주문을 기억하고 있는 것을 상태를 유지한다고 한다.

하지만, 무상태성( Stateless)에서는 고객이 주문 내용을 기억하고있기때문에 중간에 점원이 바뀌어도 주문을 할 수 있으며, 점원을 대거 투입해도 문제가 없다.
즉, 상태 유지는 중간에 서버가 바뀌면 안 되지만 무상태는 응답 서버를 쉽게 바꿀수 있으며 요청이 증가하면 서버를 대거 투입 가능하다.


Stateful 일 때 오류가 나면 처음부터 다시 서버에 요청을 해야하지만, Stateless일 때 오류가 나면 이미 필요한 데이터를 다 포함해 요청하기때문에 다른 서버에 응답을 전달하면 되기 때문에 다시 요청할 필요가 없으며 응답 서버를 쉽게 바꿀 수 있기 때문에 무한한 서버 증설이 가능하다.
하지만 무상태성의 한계도 존재한다.
로그인이 필요 없는 단순한 서비스 소개 화면 같은 경우엔 무상태로 설계할 수 있지만 로그인이 필요한 서비스라면 유저의 상태를 유지해야 되기 때문에 브라우저 쿠키, 서버 세션, 토큰 등을 이용해 상태를 유지합니다.


TCP/IP는 기본적으로 연결을 유지하며, 연결을 유지하는 모델에선 클라이언트가 요청을 보내지않더라도 계속 연결을 유지해야한다.
이러한 경우 연결을 유지하는 서버의 자원은 계속 소모된다.
비연결성을 가지는 HTTP에서는 실제로 요청을 주고받을 때만 연결을 유지하고 응답을 주고 나면 TCP/IP 연결을 끊으며, 이로인해 최소한의 자원으로 서버 유지를 가능하게 한다.
HTTP 1.0 기준으로 비연결성 모델이므로 트래픽이 많지 않고 일반적으로 초단위 이하의 빠른 속도로 응답을 제공할 수 있고 한시간동안 수천명이 이용해도 실제 서버에서는 초당 처리 요청 수십개에 불과하다. 하지만 트래픽이 많고, 큰 규모의 서비스를 운영할 때에는 비연결성은 한계를 보인다.
TCP/IP 연결을 새로 맺여야 하며(3 Way handshake 시간 추가), 웹 브라우저로 사이트를 요청하면 자바스크립트, css, 추가 이미지 등 수많은 자원이 함께 다운로드되는 한계점이 있어 이를 HTTP 지속 연결(Persistent Connections)로 문제를 해결하고 있으며 HTTP/2, HTTP/3에서 더 많은 최적화를 하고있다.
HTTP 지속 연결(Persistent Connections)


HTTP 초기에는 각각 자원의 다운로드를 위해 연결과 종료를 반복해야 했지만, HTTP 지속 연결에서는 연결이 이루어지고 난 뒤 각각의 자원들을 요청하고 모든 자원에 대한 응답이 돌아온 후에 연결을 종료한다.
Network Layer - IP와 IP Packet
복잡한 인터넷망에서 클라이언트와 서버가 잘 통신 할 수 있기 위해 IP(인터넷 프로토콜) 주소를 컴퓨터에 부여하여 통신한다.
IP는 지정한 IP 주소(IP Address)에 패킷(Packet)이라는 통신 단위로 데이터 전달한다.

IP 패킷에서 패킷은 pack과 bucket이 합쳐진 단어로 소포로 비유할 수 있으며, IP 패킷은 이를 데이터 통신에 적용한 것이라고 보면 된다. IP 패킷은 우체국 송장처럼 전송 데이터를 무사히 전송하기 위해 출발지 IP, 목적지 IP와 같은 정보가 포함되어 있다.


위 그림과 같이 패킷 단위로 전송하면 노드(서버 컴퓨터)들이 목적지 IP에 도달하기 위해 서로 데이터를 전송한다. 이를 통해 복잡한 인터넷망에서도 정확한 목적지로 패킷을 전송할 수 있다.
서버 또한 데이터를 무사히 전송받는다면 서버도 응답을 IP패킷을 통해 돌려줘야한다.
정확한 출발지와 목적지를 파악 할 수 있다는 점에서 IP프로토콜은 적절한 통신 방법처럼 보이지만 한계점은 존재한다.

첫번째는 비연결성이다. 패킷을 받을 대상이 없거나 서비스 불능 상태여도 클라이언트는 서버의 상태를 파악할 방법이 없기 때문에 패킷을 그대로 전송한다.


두 번째는 비신뢰성이다. 중간에 있는 서버가 데이터를 전달하던 중 장애가 생겨 패킷이 중간에 소실되더라도 클라이언트는 파악할 방법이 없다. 또한 전달 데이터의 용량이 클 경우 패킷 단위로 나눠 데이터를 전달하게 되는데 이때 패킷들은 중간에 서로 다른 노드를 통해 전달될 수 있으며, 이렇게 되면 클라이언트가 의도하지 않은 순서로 서버에 패킷이 도착할 수도 있다.
Transport Layer - TCP vs UDP
TCP/IP 패킷

TCP 세그먼트에는 IP 패킷의 출발지 IP와 목적지 IP 정보를 보완할 수 있는 출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보 등을 포함한다.
TCP 특징
- 연결지향 - TCP 3 way handshake(가상연결)
- 데이터 전달 보증
- 순서 보장
- 신뢰 가능 프로토콜
TCP는 장치들 사이에 논리적인 접속을 성립하기 위하여 3 way handshake를 사용하는 연결지향형 프로토콜이다.

먼저 클라이언트는 서버에 접속을 요청하는 SYN 패킷을 보내며, 서버는 SYN요청을 받고 클라이언트에게 요청을 수락한다는 ACK 와 SYN가 설정된 패킷을 발송하고 클라이언트가 다시 ACK으로 응답하기를 기다린다. 클라이언트가 서버에게 ACK을 보내면 이 이후로부터 연결이 성립되며 데이터를 전송할 수 있으며 만약 서버가 꺼져있다면 클라이언트가 SYN을 보내고 서버에서 응답이 없기 때문에 데이터를 보내지 않는다. 현재에는 최적화가 이루어져 3번 ACK을 보낼때 데이터를 함께 보내기도 한다.
* SYN은 Synchronize, ACK는 Acknowledgment의 약자
TCP는 데이터 전송이 성공적으로 이루어진다면 이에 대한 응답을 돌려주기 때문에 IP 패킷의 한계인 비연결성을 보완할 수 있습니다.
패킷이 순서대로 도착하지 않는다면 TCP 세그먼트에 있는 정보를 토대로 다시 패킷 전송을 요청할 수 있으며 이를 통해 IP 패킷의 한계인 비신뢰성(순서를 보장하지 않음)을 보완할 수 있다.
UDP(User Datagram Protocol)
IP 프로토콜에 PORT, 체크섬 필드 정보만 추가된 단순한 프로토콜이며 앞서 TCP 특징과 비교해 보면 신뢰성은 낮지만 3 way handshake 방식을 사용하지 않기 때문에 TCP보다 빠른 속도를 보장합니다. HTTP3는 UDP를 사용하며 이미 여러 기능이 구현된 TCP보다는 하얀 도화지처럼 커스터마이징이 가능하다는 장점이 있다.
UDP 특징
- 비연결 지향 -TCP 3 way handshake X
- 데이터 전달 보증 X
- 순서 보장 X
- 단순하고 빠르다.
- 신뢰성보다 연속성이 더 중요한 서비스(실시간 스트리밍)에 주로 사용됨.
TCP와 UDP 비교
| TCP | UDP |
| 연결지향형 프로토콜 | 비 연결지향형 프로토콜 |
| 전송 순서 보장 | 전송 순서 보장 X |
| 데이터 수신 여부 확인 | 데이터 수신 여보 확인X |
| 신뢰성이 높지만 UDP보다 느림 | 신뢰성이 낮지만 TCP보다 빠름 |
Session Layer - Socket(소켓)
소켓(Socket)
프로그램이 네트워크에서 데이터를 송수신 할 수 있도록, "네트워크 환경에서 클라이언트와 서버가 서로 연결할 수 있게 만들어진 연결부"를 의미하며 네트워크 상에서 돌아가는 두 개의 프로세스 간 양방향 통신의 하나의 엔드포인트이며, 여기서 엔드포인트는 IP주소와 포트 번호의 조합을 의미한다.

소켓은 포트 번호에 바인딩되어 전송계층에서 데이터를 주고 받는 어플리케이션을 식별할 수 있게 한다. 즉, 어플리케이션 계층에 존재하는 프로세스들은 데이터를 주고 받기 위해 소켓을 거쳐 전송 계층의 네트워크로 전달함으로써 데이터를 송수신 할 수 있으며, 누가 어디로 보낼지를 정하는 IP주소와 포트 정보가 필요하다. IP 주소는 데이터를 전달받을 호스트의 주소를 가리키고, 포트 번호는 그 데이터를 전달받을 호스트 안에서 원하는 프로세스를 찾는 용도로 사용된다.
그렇기 때문에 소켓 안에는 다음과 같은 정보들이 포함됩니다.
- 프로토콜
- 호스트 IP 주소 (Source IP Address)
- 호스트 Port 번호 (Source Port Nunber)
- 목적지 IP 주소 (Destination IP Address)
- 목적지 Port 번호 (Destination Port Number)
소켓의 특징
데이터를 주고 받는 프로세스 간의 양방향 통신을 목적으로 하기 때문에, 클라이언트와 서버의 구조를 가지며, 서버는 특정 포트 번호에 바인딩하여 작동하고, 소켓을 통해 클라이언트의 요청을 리스닝하며 대기한다. 클라이언트는 이미 리스닝하고 있는 서버의 IP주소 및 포트 번호를 알고 있기 때문에, 이에 해당하는 서버에 연결을 시도하게 되며, 순조롭게 연결이 진행되고 나면, 서버는 같은 포트에 바인딩 된 새로운 소켓을 형성하고, 기존의 연결된 소켓으로는 연결된 클라이언트의 요청을 처리한다. 따라서 같은 포트에 여러 개의 소켓을 생성하여 사용할 수 있다.
위의 과정을 거쳐 소켓을 통해 연결이 완료되면, 데이터를 주고 받은 후 연결이 끊어지는 것이 아니라 양 쪽에서 실시간으로 통신할 수 있으며, 실시간으로 메세지를 송수신 하는 채팅서비스나 스트리밍 서비스에서 주로 사용된다.
Data Link Layer - 데이터 링크 레이어
OSI 7 계층 모델을 기준으로 데이터 링크 계층(2계층)은 전기 신호를 모아 알아볼 수 있는 데이터 형태로 처리한다. 출발지와 도착지 주소를 확인하고 내게 보낸 것이 맞는지 혹은 내가 처리해야 하는지에 대해 검사한 후 데이터 처리를 하는 것이 주된 역할이다.
여기서 주소를 확인한다는 것은 한 명과 통신하는 것이 아니라 동시에 여러 명과 통신할 수 있다는 것이기 때문에 무작정 데이터를 주고 받는 것이 아니라, 받는 사람이 데이터를 받을 수 있는지 확인하는 작업부터 해야하며, 이런 역할을 플로우 컨트롤(flow control)이라고 한다.
2계층에서 동작하는 네트워크 구성 요소는 네트워크 인터페이스 카드와 스위치가 있습니다.


네트워크 인터페이스 카드(Network Interface Card, NIC)
네트워크 인터페이스 카드는 여러 이름을 가지고 있다. 우리는 흔히 랜 카드 라고 부르기도 하고, 네트워크 카드, 네트워크 인터페이스 컨트롤러(Network Interface Controller), 네트워크 어댑터(Network Adapter) 등으로 부르기도 한다. 네트워크 인터페이스 카드는 컴퓨터를 네트워크에 연결하기 위한 하드웨어 장치이며, 노트북과 데스크톱에서는 기본 장착되므로 별로도 추가할 필요가 없습니다.
네트워크 인터페이스 카드의 주요 역할은 다음과 같습니다.
- 직렬화(Serialization) : NIC는 전기적 신호를 데이터 신호 형태로, 혹은 그 역으로 변환해 줍니다. 이러한 상호 변환작업을 직렬화라고 합니다.
- MAC 주소 : NIC는 고유한 MAC 주소를 가지고 있다. 이 MAC 주소는 Media Access Control의 줄임말로, 네트워크에 접속하는 모든 장비는 MAC 주소라는 물리적 주소가 있어야 하고, 변경할 수 없도록 하드웨어에 고정되어 있다. NIC는 입력되는 전기 신호를 데이터 형태로 만들고 데이터에서 도착지 MAC주소를 확인한 후 자신에게 들어오는 전기 신호가 맞는지 확인하며, 자신에게 들어오는 전기 신호가 아니면 버리고, 맞으면 이 데이터를 상위계층에서 처리 할 수 있도록 메모리에 적재합니다. (식별자)
스위치(Switch)
스위치는 여러 장비를 연결하고 통신을 중재하며, 케이블을 한 곳으로 모아주는 역할을 하는 2계층의 장비이며, 주어진 MAC 주소를 보고 어디로 연결되는지, 포트는 어디인지 확인하며 이 데이터를 기반으로 통신할 때 포트를 적절히 필터링 하고 정확한 포트로 포워딩 하는 역할을 한다.
필터링(Filtering)과 포워딩(Forwarding)
패킷이 스위치에 들어온 경우, 도착지 MAC주소를 확인하고 자신이 가진 MAC 테이블과 비교해 맞는 정보가 있으면 매치되는 해당 포트로 패킷을 포워딩 합니다. 이때 다른 포트로는 해당 패킷을 보내지 않으므로 이 동작을 필터링이라고 부른다.
Physical Layer - 네트워크 액세스 계층
물리 계층(1계층)은 용어 그대로 물리적 연결과 관련된 정보를 정의하며, 이 계층에서는 물리적 장비를 통해 전기 신호를 전달하며, 전기 신호를 전달하는데 초점이 맞춰져 있다.

1계층에서 이러한 전기 신호를 전달하기 위해 사용하는 주요 장비로는 허브(Hub), 케이블(Cable), 리피터(Repeater), 트랜시버(Tranceiver) 등이 있다.
- 허브와 리피터 : 네트워크 통신을 중재
- 케이블과 커넥터 : 케이블 본체를 구성하는 요소
- 트랜시버 : 컴퓨터의 랜카드와 케이블을 연결하는 장비로 다양한 외부신호를 컴퓨터 내부 전기신호로 바꾸어주는 역할
따라서 전기 신호가 1계층 장비에 들어오게 되면 이 전기 신호를 재생성하여 내보내며, 이 때 장비가 주소의 개념을 이해할 수 없으므로 전기 신호가 들어온 포트를 제외하고 모든 포트에 같은 전기 신호를 전송한다.
'TIL' 카테고리의 다른 글
| 22일차 발표 (0) | 2022.05.17 |
|---|---|
| 21일차 발표 (0) | 2022.05.16 |
| 15일차 WAS와 Web Server (0) | 2022.05.06 |
| 14일차 REST API (0) | 2022.05.04 |
| 13일차 HTTP (0) | 2022.05.03 |