옛날 옛적에는 컴퓨터 간 데이터 통신을 어떻게 했을까? 패킷 통신이 등장하기 전 통신은 '회선 교환 (Circuit Switching)'이라는 방식을 사용했다. 회선 교환 방식은, 통신하고자 하는 두 호스트가 데이터를 전송하기 전에 미리 데이터 이동 경로를 하나 설정해두는 방식이다. 따라서 미리 설정해준 경로는 두 호스트만을 위한 전용 경로가 되고, 이 경로를 통해 통신의 처음부터 끝까지 모든 데이터가 왔다갔다 한다.
아래의 사진을 예로 들자면, 호스트 A 와 D 가 통신하기 위해 설정한 경로인 '1-4-7' 을 따라서 모든 데이터가 이동하게 되는 것이다.
하지만, 이는 회선의 트래픽이나 이동 효율을 전혀 고려하지 않은 채 미리 정하는 방식이다. 보통의 통신이라 함은 데이터를 전송하는 시점의 트래픽, 혼잡도 등의 요인에 따라 효율이 달라지게 되는데, 회선 교환 방식은 데이터 전송 전에 이들을 고려하지 않고 이동 경로를 단정지어버리기 때문에 데이터 전송 시 효율적이지 못한 경우가 발생하곤 한다.
그리고, 회선 교환 방식을 사용한다면 이미 설정된 이동 경로는 할당 해제될 때까지 다른 호스트들이 사용할 수 없게 된다. 말 그대로 독점하는 것이며, 실제로 데이터를 전송하고 있지 않아도 연결 설정이 끊어지지 않는 이상 다른 호스트들은 사용할 수 없다.
또한 단절에 매우 취약하다. 두 호스트간의 연결이 끊어지면 이동 경로를 다시 연결해줘야 하고, 그 사이 다른 호스트가 차지해버리면 해당 경로가 릴리즈 될 때까지 기다려야 한다. 이러한 측면에서도 비효율성이 발생한다.
따라서, 이러한 비효율성 및 단점들을 개선하기 위해 새로운 통신 방식이 등장했다.
'패킷 교환 (Packet Switching)' 방식은 미리 이동 경로를 정하지 않고, 데이터를 패킷 (Packet) 이라는 작은 단위로 나누어 다중 노드로 구성된 네트워크를 통해 전송하는 개념이다. 전송될 데이터는 네트워크를 통해 전송되기 전에 패킷으로 쪼개어지고, 각 패킷에는 고유 번호가 지정되어 있어서 네트워크를 거쳐 최종 수신지에 도착했을 때에 번호 순서대로 결합되어 원래 데이터로 완성되는 방식이다.
각 패킷은 전송 당시 가장 효율적인 경로를 설정하여 최종 목적지까지 이동하게 된다. 회선 교환 방식과 다르게 그때 그때 상황에 따라 매번 다른 경로로 갈 수 있도록 하여 효율성을 강조했다. 그런데 애초에 이게 가능하려면, 출발지부터 목적지까지 가는 과정에서 거치는 모든 중간 노드들이 그때 그때 상황에 따라 이동 경로를 안내해줄 수 있어야 하지 않을까?
즉, 패킷을 수신한 중간 노드가 패킷의 최종 목적지 (수신지) 를 확인하고, 목적지까지 가는 다양한 경로 중 딱 그 상황에서 가장 최적이라고 판단되는 경로를 따라 패킷을 이동시키는 '라우팅' 을 해줘야 한다. 이러한 라우팅을 수행해주는 중간 노드가 어디서 많이 들어본 '라우터'인 것이다.
데이터를 송신하는 호스트에서는 해당 네트워크가 사용하는 프로토콜을 기반으로 데이터를 작은 단위로 분할하고, 분할된 데이터들 각각의 앞에 패킷 번호, 송신지 및 수신지 정보 등 다양한 정보를 담은 패킷 헤더를 붙여 최종적으로 '패킷'이라는 형태로 변환하여 데이터를 전송하게 된다. 데이터들이 잘게 쪼개어져 패킷이라는 단위로 변환되는 과정을 '캡슐화'라고 한다.
패킷 각각의 라우팅은 중간 노드들의 혼잡도, 역량에 따르기 때문에, 패킷이 순서대로 수신 호스트에 도착한다는 보장은 전혀 없다. 따라서, 수신 호스트에서는 송신 호스트가 전송한 패킷이 모두 도착했음을 인지했을 때, 해당 네트워크의 프로토콜에 의거하여 패킷 헤더를 쭉 읽고, 패킷들의 순서를 정리해서 원래 데이터 형태로 정립하게 된다.
이러한 패킷 전송 방식을 사용하게 되면, 중간 노드 각각에서 다른 노드로 이동할 때마다 최적의 경로를 통해 이동하기 때문에 전송 효율이 매우 높고, 노드들 간의 경로를 어느 한 패킷이 독점하는 것이 아닌 공유하는 형태이기 때문에 회선 교환 방식보다 훨씬 효율적이다.
현 시대에는 거의 모든 통신이 패킷 전송 방식을 사용하고 있다. 효율성이 입증됐기 때문이다. 따라서 현대의 정보통신 네트워크에서 데이터는 패킷으로 분할되어 라우터를 거쳐 전송되는 것이 기본 원리로 작용된다.
📦 실생활에 빗대어 보기
택배 보낼때 운송장 붙이는 행위도 캡슐화의 일종이라고 볼 수 있다. 해당 택배의 최종 목적지 정보 (주소) 가 담겨있기 때문이다. 그리고 중간중간 거치는 택배 물류 Hub 의 경우에는 네트워크를 이루는 라우터라고 할 수 있겠다, 왜냐하면 각 Hub 에서는 가장 빠른 경로로 택배를 운송하기 위해 적절한 트럭에 상차시키는 행위 (간선 상차) 를 하기 때문이다. 이는 라우팅에 빗댈 수 있다.
TCP/IP 는 TCP 프로토콜과 IP 프로토콜을 아울러 지칭하는 용어이다. TCP 프로토콜은 신뢰성 있고 무결성을 보장하는 연결을 통해 데이터를 안전하게 전달해주는 전송 프로토콜이고, IP 프로토콜은 패킷들을 가장 효율적인 방법으로 최종 목적지로 전송하기 위해 필요한 프로토콜이다.
위에서 패킷 교환 방식을 설명할 때, 네트워크가 사용하는 프로토콜에 의거하여 데이터를 캡슐화한다고 했는데, 이 때 TCP/IP 는 '프로토콜' 에 해당하게 된다. TCP/IP 가 제시하는대로 데이터를 캡슐화하는것이다. TCP/IP 말고도 지금까지 많은 프로토콜이 제시되어 왔겠지만, 가장 이상적이고 효율적인 프로토콜이어서 그런지 거의 표준화된 것 같다.
TCP/IP 프로토콜을 따르는 네트워크 통신이라면, 송신 호스트에서 전송할 데이터를 TCP/IP 4계층이라는 계층 구조에 따라 순차적으로 캡슐화를 하여 네트워크에 전송하게 된다. 그리고 데이터를 수신하는 호스트에서도 이 계층 구조에 따라 캡슐화된 패킷을 역순으로 포장을 뜯어가며 원래 데이터를 확인해볼 수 있게 되는 것이다.
TCP/IP 는 총 4개의 계층으로 이루어져 있고, 각 계층이 하는 역할이 명확히 구분되어 있다.
송신 호스트에서 데이터를 보내기 위해서는 4계층으로부터 1계층 까지 순차적으로 거쳐가며 데이터를 캡슐화해야 하고, 최하 계층인 네트워크 인터페이스 계층은 이름에서 알 수 있듯 직접적으로 네트워크에 전기적 신호로 패킷을 전송하기 위한 액세스 계층이다. 따라서 네트워크 액세스 계층이라고도 부른다.
그리고 수신 호스트에서 이를 수신받아 1계층부터 4계층까지 순차적으로 거쳐가며 데이터를 역캡슐화해가며 최상 계층인 응용 계층에서 데이터를 수신받아 적절히 활용하게 된다.
이 과정을 도식화하면 아래와 같은 그림이 나오게 된다.
계층 하나를 거칠 때마다 헤더가 하나씩 늘어나는 것을 확인할 수 있다. 각 헤더는 무의미하게 늘어만 가는 데이터가 아닌, 각 계층에서 주입하는 유의미한 정보이다. 이는 해당 패킷을 수신 호스트까지 효율적으로 전송하기 위한 정보들을 담고 있다.
송신 호스트 입장에서 설명하자면 오른쪽 끝에서 왼쪽 끝으로 캡슐화를 진행하는 것이다. 응용 계층에서부터 네트워크 인터페이스 계층까지 이동하면서 추가되는 헤더는 다음과 같다. (위 사진에도 표현되어 있다)
응용 계층 : 어플리케이션 헤더
전송 계층 : TCP 헤더 송신지 포트번호 + 수신지 포트번호)
인터넷 계층 : IP 헤더 (송신지 IP 주소 + 수신지 IP 주소)
네트워크 인터페이스 계층 : 이더넷 헤더 (송신지 MAC 주소 + 수신지 MAC주소)
응용 계층은 TCP/IP 를 사용하는 애플리케이션이 사용하는 프로토콜에 필요한 정보를 헤더로 담는다. 예를 들어 HTTP 통신이면 HTTP 헤더를 붙이게 되는 것이다.
전송 계층은 해당 패킷의 송신지, 수신지 각각의 포트번호 정보를 담게 되어 수신 호스트에 도착했을 때 어떤 소켓에 데이터를 갖다줄 지에 대한 정보를 담게 된다. (여기서 전송 프로토콜로 UDP를 사용할 수도 있다. 이에 관해선 이 포스팅에서 다루지 않겠다.)
인터넷 계층은 해당 패킷의 송신지, 수신지 각각의 IP 주소 정보를 담게 되어 네트워크의 모든 라우터들이 이를 참조하여 가장 효율적인 경로로 패킷을 라우팅해주게 된다.
네트워크 인터페이스 계층은 비교적 물리적인 정보를 담게 된다. 송신지 및 수신지의 MAC 주소를 담아 이더넷 카드를 통해 해당 패킷을 내보낸다.
송신 호스트에서 캡슐화를 한 순서 그대로 역순으로 역캡슐화하면서 올라가보면 된다.
수신 호스트의 네트워크 인터페이스 계층에 패킷이 도착하게 되면, 이를 인터넷 계층으로 올려보낸다.
인터넷 계층은 해당 패킷의 IP 헤더를 뜯어봤을 때 발신지를 확인하고, 수신지가 자기 자신이라면 해당 패킷을 전송 계층으로 올려보낸다.
전송 계층은 해당 패킷의 TCP 헤더를 뜯어봤을 때 발신 및 수신 포트번호를 확인하여 응용 계층으로 패킷을 올려보낸다. 이 때 TCP 프로토콜을 사용했다면, 누락된 메세지가 있는지 검사하여 만약 누락된 게 있다면 재요청한다. 모든 패킷이 도착했다면, 순서를 정렬하여 원래 데이터 형태로 정립하여 수신 포트번호에 해당하는 프로세스 (소켓) 에 보낼 것이다.
응용 계층은 해당 패킷의 애플리케이션 헤더를 뜯어보고, 도착한 데이터를 통해 적절한 조치를 취한다. (HTTP 통신이었다면 웹페이지를 읽어들이는 작업을 할 것이다)
이번 포스팅에선 패킷 교환 방식 네트워킹의 등장 배경과, 패킷 교환 방식을 대표하는 통신 규약인 TCP/IP 에 대해 알아보았다. 다음 포스팅에선, 이번 포스팅에서 담지 못한 대표적인 두 개의 전송 프로토콜인 TCP 와 UDP 에 대해 자세히 알아보고자 한다.
이미 ksh-code
선생님께서 잘 말씀해주셨는데 제가 굳이 출처를 들어 설명 드리자면 아래와 같습니다.
The original TCP/IP protocol suite was defined as
four software layers built upon the hardware. Today, however, TCP/IP is thought of as a
five-layer model.
출처) Data Communications And Network 5/E, 75pg.
forouzan
선생님께서 쓰신 Data Communications And Network
(McGraw-Hill
출판사) 는 나름대로 검증된 책이니 한번쯤 읽어보시는 것을 추천 드립니다. 원서지만 삽화도 많고 워낙 쉽게 잘 쓰여 있어서 볼만 합니다. 최근에는 6판까지 나왔네요.
저는 Data Communications and Networking책을 통해 5 layer로 배웠어서 차이점을 찾아보니, 아래와 같은 내용이 있군요.
TCP/IP protocol suite이 옛날에 RFC문서, Cisco문서에 4 layer로 소개되어 4 layer로 설명하는 경우가 있는데,
RFC문서는 OSI모델과 밀접하게 고려하지 않은 내용이라서 잘 신뢰하지 않는 분위기이고
Cisco의 경우는 비교적 최근 cisco press에서 발행한 내용을 보니 5 layer로 소개하네요.
network interface를 data link layer와 physical layer로 분리하는게 트렌드에 맞는거 같습니다.