네트워크의 계층에 대해 살펴보다 보면 OSI Model (Open Systems Interconnection)처럼 7계층으로 나눈 경우도 있고, TCP/IP Model처럼 4계층 또는 5계층으로 나눈 경우도 있었다.
분류 방식에 있어서는 조금씩 차이가 있지만 결국 통신 과정을 수직적인 관점에서 계층을 나누어 살펴본다는 점에서 동일하다. 각 계층은 특정한 기능과 역할을 수행하고, 상위 계층과 하위 계층은 서로 데이터를 교환하고 협업하며 통신을 가능하게 만든다.
왜 이렇게 계층을 나누어 살펴보는 것일까? 컴퓨터 네트워크는 파고 내려가면 끝도 없이 파고 내려가며 공부해야 할 만큼 복잡한 시스템이라고 한다. 따라서 네트워크를 분류해서 살펴보지 않으면 개발하는 것도 쉽지 않고, 문제가 발생했을 때 대처하는 것도 쉽지 않을 것이다.
OSI Model과 같은 모델에 기반하여 각 계층마다의 역할과 책임을 명확히 나누면, 문제가 발생했을 때 해당 계층만 수정하면 되므로 전체 시스템에 영향을 미치지 않을 수 있다. 또한 각각의 계층마다 통신 규약, 즉 프로토콜을 정의함으로써 네트워크 통신 방법을 표준화할 수 있다는 이점도 있다.
이번 포스팅에서는 TCP/IP Model에 기반하여 application layer, transport layer, network layer, link layer 이렇게 네 가지 계층을 top-down approach로 살펴보고자 한다.
📦 전송 단위: message
💬 대표 프로토콜: HTTP(웹), SMTP(이메일), FTP(파일)
Application Layer는 네트워크 통신의 최상위 계층으로 사용자가 실제로 사용하는 애플리케이션(웹 브라우저, 이메일 클라이언트, 파일 전송 프로그램 등)에 대한 프로토콜을 정의한다. OSI 7계층과 비교해본다면 Application Layer, Presentaion Layer, Session Layer가 이 계층에 해당한다고 볼 수 있다.
모든 네트워크 애플리케이션은 Client-Server Model에 기반한다. 이 모델에서 다수의 클라이언트는 중앙 집중화된 서버에 요청을 보내고, 서버는 해당 요청에 대한 응답을 제공한다. 클라이언트-서버 모델의 작업 단위는 Transaction으로, 클라이언트가 요청을 보내고 서버가 응답하는 하나의 상호작용을 의미한다.
그리고 클라이언트와 서버는 프로세스이고, 머신이나 호스트가 아니라는 것을 아는 것이 중요하다. (프로세스는 실행되고 있는 프로그램의 인스턴스를 의미하고, 호스트는 네트워크에 접근하는 기능이 있는 하드웨어 장치를 의미한다.) 클라이언트 프로세스와 서버 프로세스는 하나의 호스트 내에 존재할 수도 있고, 서로 다른 호스트에 존재할 수도 있다.
Application Layer에 해당되는 대표적인 프로토콜로는 HTTP(Hypertext Transfer Protocol)가 있다. HTTP는 웹 서버와 클라이언트 간의 통신을 위해 사용되는 프로토콜로, TCP 포트 80을 사용하여 통신한다.
HTTP의 주요한 특징 중 하나는 Stateless하다는 점이다. HTTP에서 각각의 요청은 독립적으로 처리되기 때문에 이전 요청과 관련된 정보는 저장하지 않는다.
Socket은 Application layer와 Transport layer 사이에 위치한 인터페이스로, 서로 다른 프로세스가 데이터를 주고받는 데에 사용되는 통로라 볼 수 있다. 소켓의 타입은 통신 방식을 규정하는데, 대표적으로 SOCK_STREAM
은 TCP 통신에 사용되는 소켓이고, SOCK_DGRAM
은 UDP 통신에 사용되는 소켓이다. TCP와 UDP에 대해서는 다음 절에서 살펴볼 수 있고, C에서 Socket Programming을 하는 방법은 다음 포스팅에서 볼 수 있다.
📦 전송 단위: segment
💬 대표 프로토콜: TCP, UDP
Transport Layer는 데이터 전송에 사용되는 계층이다. 데이터 전송 방식과 관련하여 Multipexing과 Demultiplexing 개념을 살펴보고, 대표적인 프로토콜인 TCP와 UDP에 대해 살펴보자.
Transport Layer는 Application Layer로부터 받은 데이터를 segment라는 작은 단위로 분할하여 Network Layer로 보내는데 이를 Multiplexing이라 하고, Network Layer로부터 받은 데이터를 다시 Application Layer로 보낼 때는 segment를 조립하여 복원한 데이터를 보내는데 이를 Demultiplexing이라 한다.
Demultiplexing의 경우 원래 요청이 들어온 소켓을 통해 다시 응답을 보내줘야 할 텐데 이를 어떻게 할 수 있을까? 각각의 segment에는 출발지의 포트와 도착지의 포트가 적혀 있어서 이 정보를 바탕으로 알맞은 곳에 데이터를 전달할 수 있다.
TCP(Transmission Control Protocol)는 연결 지향형 프로토콜로 신뢰성 있는 데이터 전송을 지원한다. TCP의 주요 특징은 아래와 같다.
🔻 연결 지향성
'연결 지향(connection oriented)'이란 어떤 데이터든 교환하기 전에 신뢰성 있는 연결을 맺어야 함을 의미한다. TCP는 이를 위해 three-way handshake 과정을 거친다.
🔻 신뢰성 보장
TCP는 데이터의 정확한 전송을 위해 다양한 메커니즘을 제공한다. 예컨대 TCP는 패킷 손실에 대응하기 위해 데이터의 수신 여부를 확인하는데, 일정 시간 내에 ACK(Acknowledgement) 신호를 받지 못하면 패킷의 손실로 간주하고 재전송을 시도한다. 그리고 데이터의 순서를 유지하고 중복을 방지하기 위해 각각의 segment에 고유한 sequence number를 할당하여 전송한다.
🔻 혼잡도 & 흐름 (congestion & flow) 제어
TCP는 네트워크의 혼잡도를 모니터링해서 네트워크 과부하와 패킷 유실을 방지한다. 그리고 수신하는 쪽이 받을 수 있는 양에 맞춰 흐름을 조절한다.
UDP(User Datagram Protocol)는 TCP와 달리 사전에 연결을 맺는 과정도 없고, 혼잡도와 흐름을 제어하지도 않는다. 신뢰성 있는 데이터 전달을 보장하지 않는 대신, 지연 시간이 짧고 처리량이 크다는 장점이 있다. UDP는 패킷이 몇 개 정도 소실돼도 상관 없는 스트리밍 서비스나 DNS 등에 사용된다.
📦 전송 단위: packet
💬 대표 프로토콜: IP(Internet Protocol)
Network Layer에서는 네트워크 간의 연결과 경로 선택 등을 담당한다. 이를 크게 forwarding과 routing으로 나누어볼 수 있다.
🔻 forwarding
🔻 routing
📦 전송 단위: frame
💬 대표 프로토콜: Wifi, LTE, Ethernet
Link Layer는 데이터를 물리적인 매체를 통해 전송하는 계층이다.
예컨데 이더넷은 가장 일반적으로 사용되는 유선 LAN(Local Area Network) 기술이다. 네트워크에 연결된 각 기기들은 48비트 길이의 고유한 MAC(Media Access Control) 주소를 가지고 있어서, 이더넷은 MAC 주소를 사용하여 네트워크 상에서 장치들을 식별한다.