택배를 보내면 목적지에 도착할 때까지 어떤 과정을 거치게 될까요? 단계별로 생각하면 아래와 같을 것입니다.
이 과정을 잘 분석해 보면, 아래 이미지와 같이 3단계의 계층으로 나누어 생각할 수 있습니다.
택배를 보낼 때에는 상위 → 중간 → 하위 계층을 거치고, 받을 땐 하위 → 중간 → 상위 계층을 거치는 것을 볼 수 있습니다. 각 계층에서 맡은 바를 잘 수행하면 택배가 목적지에 잘 도착하게 되는 것이죠.
우리가 네트워크망을 통해서 데이터를 보내고 받을 때에도 비슷한 과정을 거칩니다. 이때 데이터가 거쳐 가는 계층들을 정리한 모델에는 TCP/IP 4계층 모델, OSI 7계층 모델이 있습니다.
TCP/IP 4계층은 OSI 7계층보다 먼저 개발되었고, 실무에 더 가까운 모델입니다. OSI 7계층은 실무보다는 이론에 더 가까운 모델입니다. 각각의 모델이 어떻게 구성되어 있는지 살펴보도록 합시다.
TCP/IP 4계층 모델은 그림과 같이 응용 계층, 전송 계층, 인터넷 계층, 네트워크 접속 계층으로 이루어져 있습니다.
TCP/IP 4계층보다 좀 더 세분화된 모델인 OSI 7계층을 살펴보면서 각 계층의 역할을 좀 더 자세히 알아봅시다.
OSI 7계층 모델은 ISO(International Organization for Standardization)라고 하는 국제표준화기구에서 1984년에 제정한 표준 규격으로, 네트워크를 이루고 있는 구성 요소들을 7단계로 나누고, 각 계층의 표준을 정하였습니다.
TCP/IP 4계층보다 계층이 더 세분화되어 있기 때문에 네트워크 문제가 발생했을 때 범위를 좁혀 문제를 쉽게 파악할 수 있게 도와줍니다. 각 계층은 다음과 같이 구분됩니다.
1계층 - 물리 계층: OSI 모델의 맨 밑에 있는 계층으로서, 시스템 간의 물리적인 연결과 전기 신호를 변환 및 제어하는 계층입니다. 주로 물리적 연결과 관련된 정보를 정의합니다. 주로 전기 신호를 전달하는 데 초점을 두고, 들어온 전기 신호를 그대로 잘 전달하는 것이 목적입니다.
2계층 - 데이터링크 계층: 네트워크 기기 간의 데이터 전송 및 물리 주소(e.g. MAC 주소)를 결정하는 계층입니다. 물리 계층에서 들어온 전기 신호를 모아 알아볼 수 있는 데이터 형태로 처리합니다. 이 계층에서는 주소 정보를 정의하고 출발지와 도착지 주소를 확인한 후, 데이터 처리를 수행합니다.
3계층 - 네트워크 계층: OSI 7계층에서 가장 복잡한 계층 중 하나로서 실제 네트워크 간에 데이터 라우팅을 담당합니다. 이때 라우팅이란 어떤 네트워크 안에서 통신 데이터를 짜인 알고리즘에 의해 최대한 빠르게 보낼 최적의 경로를 선택하는 과정을 라우팅이라고 합니다.
4계층 - 전송 계층: 컴퓨터 간 신뢰성 있는 데이터를 서로 주고받을 수 있도록 하는 서비스를 제공하는 계층입니다. 하위 계층에서 신호와 데이터를 올바른 위치로 보내고 신호를 만드는 데 집중했다면, 전송 계층에서는 해당 데이터들이 실제로 정상적으로 보내지는지 확인하는 역할을 합니다. 네트워크 계층에서 사용되는 패킷은 유실되거나 순서가 바뀌는 경우가 있는데, 이를 바로 잡아주는 역할도 담당합니다.
5계층 - 세션 계층: 세션 연결의 설정과 해제, 세션 메시지 전송 등의 기능을 수행하는 계층입니다. 즉, 컴퓨터 간의 통신 방식에 대해 결정하는 계층이라고 할 수 있습니다. 쉽게 말해, 양 끝 단의 프로세스가 연결을 성립하도록 도와주고, 작업을 마친 후에는 연결을 끊는 역할을 합니다.
6계층 - 표현 계층: 응용 계층으로 전달하거나 전달받는 데이터를 인코딩 또는 디코딩하는 계층입니다. 일종의 번역기 같은 역할을 수행하는 계층이라고 볼 수 있습니다.
7계층 - 응용 계층: 최종적으로 사용자와의 인터페이스를 제공하는 계층으로 사용자가 실행하는 응용 프로그램(e.g. Google Chrome)들이 해당 계층에 속합니다.
응용 계층은 네트워크 모델의 최상위 계층으로 최종적으로 사용자와의 인터페이스를 제공하는 계층입니다. 쉽게 말해 사용자가 웹 서핑을 할 때에는 웹 브라우저를 사용하고 메일을 주고받을 때는 Outlook과 같은 메일 프로그램을 사용하는 것을 예시로 들 수 있습니다.
이렇게 응용 계층은 이메일, 파일 전송, 웹 사이트 조회 등 애플리케이션에 대한 서비스를 사용자에게 제공하는 계층입니다.
이때 애플리케이션은 서비스를 요청하는 측(사용자 측)에서 사용하는 애플리케이션과 서비스를 제공하는 측의 애플리케이션으로 분류됩니다.
일반적으로 서비스를 요청하는 측을 클라이언트, 서비스를 제공하는 측을 서버라고 합니다.
웹 브라우저(e.g. Google Chrome)나 메일 프로그램(e.g. Outlook)은 사용자 측에서 사용하는 애플리케이션이니 클라이언트에 속하지만, 서비스를 제공하는 측인 서버에는 웹 서버 프로그램과 메일 서버 프로그램 등이 있습니다. 클라이언트와 서버 모두 응용 계층에서 동작합니다.
컴퓨터 네트워크로 데이터가 전송될 때에는 캡슐화, 수신할 때에는 역캡슐화라는 과정을 거칩니다. 각 과정의 의미는 다음과 같습니다.
캡슐화(Encapsulation): 데이터를 전달할 때, 데이터를 네트워크 상위 계층에서 하위 계층으로 전송하면서 각 계층에서 헤더를 추가하며 데이터를 포장하는 과정
역캡슐화(Decaptulation): 캡슐화와는 반대로 데이터를 수신할 때, 데이터를 네트워크 하위 계층에서 상위 계층으로 전송하면서 각 계층에서 헤더를 제거하면서 데이터를 추출하는 과정을 의미합니다.
캡슐화와 역캡슐화는 OSI 7계층 모델과 TCP/IP 4계층 모델 둘 다 진행되지만, 보통 OSI 7계층 모델을 기반으로 진행됩니다. OSI 7계층 모델이 표준화와 계층화를 거친 모델이기 때문입니다.
표준화: OSI 7계층 모델은 국제표준화기구(ISO)에 의해 정의된 표준 모델입니다. 따라서 네트워크 제조업체들은 이 표준을 따름으로써 다른 기업과의 상호 운용성을 보장받을 수 있습니다. 그렇기 때문에 데이터 캡슐화와 역캡슐화를 OSI 7계층 모델을 기반으로 수행하는 것이 네트워크 호환성과 효율성을 높입니다.
계층화: OSI 7계층 모델은 계층화된 구조로 설계되어 있어 각 계층이 독립적으로 동작하며, 특정 계층이 변경되더라도 다른 계층에 영향을 주지 않습니다. 데이터 캡슐화와 역캡슐화는 각 계층에서 처리되기 때문에 계층별로 필요에 따라 기능을 추가하거나 수정할 수 있습니다. 이렇게 모듈화된 구조는 네트워크의 확장성과 유지보수를 용이하게 만듭니다.
OSI 7계층 모델은 송신 측의 7계층과 수신 측의 7계층을 통해 데이터를 주고받습니다. 각 계층은 독립적이므로 데이터가 전달되는 동안에 다른 계층의 영향을 받지 않습니다.
데이터를 전송하는 쪽은 데이터를 보내기 위해서 상위 계층에서 하위 계층으로 데이터를 전달합니다. 이때 각 계층에서 필요한 정보를 데이터에 추가하는데 이 정보를 헤더(데이터링크 계층에서는 트레일러도 추가로 붙입니다)라고 합니다. 그리고 이렇게 헤더를 붙여나가는 것을 캡슐화라고 합니다.
OSI 7계층 중 표현 계층, 세션 계층은 헤더를 따로 붙이지는 않습니다. 표현 계층은 표현 형식을 변환하거나 암호화, 압축 등을 수행하는 계층으로 데이터를 가공하는 역할을 하며, 세션 계층은 통신 동안의 연결 상태를 관리하는 계층으로 세션 관리를 위해 세션 정보를 내부적으로 유지하는 역할을 합니다.
이렇게 하위 계층으로 계속 전달 되다가 마지막 물리 계층에 도달하면 데이터링크 계층에서 만들어진 데이터가 전기 신호로 변환되어 수신 측에 전송됩니다.
데이터를 받는 쪽은 하위 계층에서 상위 계층으로 각 계층을 통해 전달된 데이터를 받게 됩니다. 이때 상위 계층으로 데이터를 전달하며 각 계층에서 헤더(데이터링크 계층에서는 트레일러도)를 제거하며 역캡슐화를 진행합니다. 역캡슐화를 거쳐 마지막 응용 계층에 도달하면 드디어 전달하고자 했던 원본 데이터만 남게 됩니다.
이렇게 캡슐화, 역캡슐화를 할 때 계층마다 전송 단위가 달라집니다. 응용/표현/세션 계층에서는 데이터, 전송 계층에서는 세그먼트, 네트워크 계층에서는 패킷, 데이터 링크 계층에서는 프레임, 물리 계층에서는 비트 단위로 데이터를 전송하게 됩니다.
네트워크의 탄생 배경을 살펴보고 패킷교환 방식을 이용한 IP 통신과 이를 보안하기 위한 TCP/UDP에 대해 학습합니다.
옛 모습을 배경으로 하는 영화 혹은 드라마에서 아래와 같은 장면을 보신 적 있나요? 이 사진의 여성분은 회선교환 중간에서 발신자와 수신자를 연결해 주는 전화교환원, 즉 오퍼레이터입니다.
회선 교환 방식은 발신자와 수신자 사이에 데이터를 전송할 전용선을 미리 할당하고 둘을 연결합니다. 우리가 전화를 하는 방식과 동일하다고 생각하시면 됩니다.
그래서 내가 연결하고 싶은 상대가 다른 상대와 연결 중이라면, 상대방은 이미 다른 상대와의 전용선과 연결되어 있기 때문에 그 연결이 끊어지고 나서야 상대방과 연결할 수 있습니다. 또한 특정 회선이 끊어지는 경우에는 처음부터 다시 연결을 성립해야 합니다.
1969년, 냉전 시대에 핵전쟁을 대비하기 위한 통신망 구축을 위해 추진되었던 미 국방성의 아르파넷(ARPANET) 프로젝트에서는 패킷 교환 방식의 네트워크를 고안했습니다. 회선이 사용 중이라면 마냥 기다려야 하는 기존의 회선 교환 방식의 단점을 해결하기 위함이었습니다.
패킷 교환 방식은 패킷이라는 단위로 데이터를 잘게 나누어 전송하는 방식입니다. 마치 소포를 보내듯이요! 그래서 각 패킷에는 출발지와 목적지 정보가 있고 이에 따라 패킷이 목적지를 향해 가장 효율적인 방식으로 이동할 수 있습니다. 이를 이용하면 특정 회선이 전용선으로 할당되지 않기 때문에 빠르고 효율적으로 데이터를 전송할 수 있습니다.
그래서 인터넷 프로토콜, 줄여서 IP는 출발지와 목적지의 정보를 IP 주소라는 특정한 숫자 값으로 표기하고 패킷 단위로 데이터를 전송하게 되었습니다.
택배를 받으려면 이름, 전화번호, 주소와 같은 정보가 필요합니다. 이때, 이름과 전화번호는 내 고유한 정보라면, 주소는 내가 있는 위치에 따라서 달라질 수 있습니다.
따라서 내가 집에서 택배를 받아야 한다면 집 주소를, 회사에서 받아야 한다면 회사 주소를 입력해야 택배를 잘 받을 수 있을 겁니다.
데이터는 어떨까요? 데이터 역시 복잡한 네트워크망에서 내 컴퓨터가 있는 위치까지 전달되려면, 찾아올 수 있는 주소가 있어야 합니다. 이때 사용되는 것이 IP 주소입니다.
IP 주소는 네트워크망 상에서 내 컴퓨터가 어디에 있는지에 따라서 바뀝니다. 택배를 받을 주소처럼요! 집에서 인터넷을 사용한다면 집에서 쓰는 IP 주소를, 회사에서 인터넷을 사용한다면 회사의 IP 주소를 사용해서 데이터를 받게 됩니다.
IP 주소 표기법은 IP 버전에 따라 두 가지가 존재합니다.
IPv4(Internet Protocol version 4): 현재까지 가장 널리 사용되는 IP 버전으로, 0~255까지의 숫자 4개를 점으로 구분하는 형태입니다. 약 43억 개의 주소를 표현할 수 있는데, 인터넷에 접속하는 기기 개수의 증가로 주소가 점점 부족해지는 현상이 있습니다.
IPv6(Internet Protocol version 6): IPv4의 주소 부족과 해결하기 위해 만들어진 IP 버전으로, 보안 및 기능적으로도 더 개선된 기능을 제공합니다. 16비트를 4자리로 그룹화하여 16진법으로 표현하는 콜론(:)으로 구분하는 형태이며, 아직 많이 사용되고 있지 않지만, 점진적으로 도입되고 있습니다.
IP 패킷은 전송할 데이터에 IP 헤더를 붙인 형태를 하고 있습니다. 이때, 헤더에는 여러 가지 정보가 들어있지만 가장 중요한 정보로는 출발지와 목적지의 IP 주소가 담겨있습니다.
패킷 단위로 전송하면 노드들은 목적지까지 패킷을 보내기 위해 서로 데이터를 전달합니다. 여기서 노드는 인터넷망에 연결된 컴퓨터를 말합니다.
이때, 노드들의 연결 상태, 네트워크 부하 등을 고려하여 그때그때 최적의 경로를 찾아서 패킷을 전달하게 됩니다. 이를 통해 복잡한 인터넷망 사이에서도 정확한 목적지로 빠르게 패킷을 전송할 수 있습니다.
정확한 출발지와 목적지를 파악할 수 있다는 점, 최적의 경로로 패킷을 전달한다는 점에서 인터넷 프로토콜은 적절한 통신 방법으로 보이지만 이러한 IP에도 한계점이 존재합니다.
만약 목적지에서 패킷을 받을 수 있는 상황이 아니거나 아예 존재하지 않는 목적지여도 출발지에서 이를 파악할 방법이 없기 때문에 일단은 패킷을 전송하게 됩니다.
패킷이 전달되는 동안 서로 다른 경로로 이동하면서 패킷의 순서가 바뀌어서 도착하는 경우가 생기기도 하고, 아예 전달 과정에서 문제가 생겨서 목적지에 도착하지 못하는 패킷이 생기기도 합니다. 인터넷 프로토콜의 목적은 데이터 전송 그 자체이므로 패킷의 순서 제어나 분실된 패킷에 대한 처리를 하지는 않습니다.
IP의 한계점인 비연결성, 비신뢰성을 한 단계 상위에 있는 계층인 전송 계층의 TCP 프로토콜이 보완해 주게 됩니다.
인터넷 프로토콜의 한계로 인해 패킷의 순서가 바뀌거나 일부 패킷이 유실될 경우 수신자는 깨진 형태의 데이터를 받게 될 수 있습니다. 데이터의 신뢰성이 중요한 프로그램의 경우에는 발생해서는 안 되는 일이겠죠.
아래 그림은 채팅 프로그램에서 데이터 신뢰성이 보장되지 않는 경우 발생할 수 있는 상황의 예시입니다.
송신자가 Hello World! 라는 채팅 메시지를 4명에게 보냈는데, 패킷 단위로 나누어 전송되는 과정에서 패킷의 순서가 바뀌거나 일부 유실되면서 수신자는 Hell!, doH!, Hold!, !oWo와 같이 완전히 깨진 형태의 메시지를 받게 된 것을 볼 수 있습니다.
이런 상황을 막아줄 수 있는 것이 바로 전송 계층의 TCP입니다. TCP는 다음과 같은 방식으로 IP의 비연결성과 비신뢰성을 보완해 줍니다.
TCP는 연결지향형 프로토콜입니다. 목적지와의 연결이 성립하고 나서 데이터를 전달한다는 의미입니다. TCP는 연결을 성립시키기 위해서 3-Way Handshake라는 방식을 사용합니다.
TCP의 3-Way Handshake에는 SYN(Synchronize) 패킷과 ACK(Acknowledgment) 패킷이라는 용어가 등장합니다. SYN은 상대방이 있는지 확인하는 것, ACK는 내가 있음을 알리는 것이라고 이해하시면 됩니다.
클라이언트는 서버에 연결 요청을 보내기 위해 SYN 패킷을 보냅니다. 데이터를 보낼 서버가 실제로 있는지 확인하는 것입니다.
서버는 클라이언트로부터 SYN 패킷을 수신하면 SYN-ACK 패킷을 보냅니다. 서버가 통신할 준비가 된 상태임을 알리고, 클라이언트의 존재를 다시 확인하는 것입니다.
클라이언트는 SYN-ACK 패킷을 수신하면 서버로 ACK 패킷을 보냅니다. 클라이언트도 통신할 준비가 되었음을 알리는 것입니다.
이렇게 3번의 악수(Handshake)와 같은 과정을 거친 후에 클라이언트와 서버의 연결이 성립되면서 데이터를 주고받을 준비가 완료됩니다. 또한 연결이 성립된 후 데이터를 주고받을 때, 데이터 전송이 잘 이루어졌다면 이에 대한 응답도 돌려주기 때문에 IP의 한계인 비연결성을 보완할 수 있게 됩니다.
전송 계층의 프로토콜인 TCP는 응용 계층에서 전달받은 원본 데이터를 쪼개고, 여기에 TCP 헤더를 붙여서 TCP 세그먼트를 생성합니다.
TCP 세그먼트는 이후 네트워크 계층으로 전달되고, 여기에 IP 헤더를 추가하면 IP 패킷이 만들어집니다. 이후 하위 계층으로 계속 전달되며 물리 계층에서 전기 신호로 변환되어 네트워크망을 통해 전송됩니다.
이때 TCP 헤더에는 출발지와 목적지의 포트 번호, 데이터의 전송 순서, 데이터를 검증하기 위한 정보 등의 내용이 들어있습니다.
IP 패킷의 비신뢰성으로 인해서 패킷이 유실되거나 순서가 바뀌어서 도착할 경우, 이를 보완하기 위해서 사용되는 정보들입니다.
이 정보를 활용해서 패킷의 순서를 맞추어 재조립하거나, 유실된 패킷의 재전송을 요청하는 등의 방법을 통해 TCP는 패킷의 순서를 보장하고 데이터의 신뢰성을 확보합니다.
이때 패킷의 재전송을 요청하는 방법으로는 순서가 잘못 들어온 패킷부터 모든 패킷의 재전송을 요청하는 Go-Back-N 방식, 그리고 빠진 패킷만 재전송 요청하는 Selective Repeat 방식이 있습니다.
UDP는 TCP에 비해 데이터의 신뢰성은 떨어지지만 전송 속도가 빠르다는 장점을 가집니다. 따라서 영상 스트리밍, 실시간 통신, 온라인 게임 등 빠른 전송 속도가 중요한 서비스에서 주로 사용됩니다.
다소 과장되었지만, 아래 예시는 영상 스트리밍 서비스에서 속도를 중시했을 때와 신뢰성을 중시했을 때 결과물의 차이를 보여줍니다. 속도를 중시하여 일부 패킷의 손실이나 순서 변경으로 인한 화질 저하 및 깨짐이 발생하더라도, 데이터 신뢰성 확보를 위한 느린 전송 속도로 끊김이 발생하는 것보다는 상대적으로 더 매끄러운 경험을 제공할 수 있습니다.
TCP에서 3-Way Handshake를 통해 송신자와 수신자의 연결을 성립한 후에 데이터를 보내던 것과 달리, UDP는 일방적으로 데이터를 전달합니다. 연결을 성립하는 것, 수신자 측에서 데이터를 받은 후 응답을 보내는 것 모두 추가로 시간을 소모하는 일이기 때문에 속도를 중시하는 UDP에서는 이러한 과정을 거치지 않습니다.
TCP에서는 데이터를 쪼개어 세그먼트로 만드는 과정이 있었던 것과 달리, UDP에서는 응용 계층에서 전달받은 원본 데이터에 바로 UDP 헤더를 붙여 User Datagram을 만듭니다.
인터넷망을 통해 지나갈 수 있는 데이터 크기에는 제한이 있고, UDP는 패킷 손실이나 순서 변경에 대해 보장하지 않으므로, UDP를 사용해서 데이터를 주고받는 응용 프로그램은 데이터를 쪼개서 보내고 받아서 재조립하는 기능을 직접 만들어야 합니다.
이처럼 UDP는 TCP처럼 IP의 비연결성과 비신뢰성을 보완해 주기에는 적합하지 않지만, 데이터 전송 속도가 빠르다는 점, TCP보다 비교적 가벼운 프로토콜이기 때문에 시스템 자원을 덜 사용한다는 점, 그리고 커스터마이징이 자유롭다는 장점을 가집니다. UDP를 커스터마이징한 대표적인 예시로는 QUIC 프로토콜이 있습니다.
QUIC(Quick UDP Internet Connections)은 구글에서는 UDP를 커스터마이징하여 만든 프로토콜입니다.
QUIC은 기본 UDP에 덧붙여 연결 설정, 신뢰성 보장, 보안 및 암호화 등의 추가 기능을 지원합니다. 또한 HTTP 3버전의 기본 프로토콜로 쓰이고 있어, 빠른 전송 속도가 필요한 서비스에서 실제로 사용되고 있는 것을 어렵지 않게 찾아볼 수 있습니다.