
흔히 네트워크, 그러니까 서버와 클라이언트 간 통신을 설명하면 다음 위와 같이 간단하게 그림을 그려 설명하는 경우가 많다. 클라이언트에서 요청을 하면 서버에서 응답을 준다.. 이런 식.
하지만, 실제로 위 그림과 같이로만 통신이 작용하려면 서버와 컴퓨터 딱 두 대와 케이블 하나만 있어야 할 것이다. 만약 컴퓨터가 2대 이상으로 늘어나거나, 서버가 다른 장소에 있다면, 데이터를 정확한 클라이언트 기기에 전달하기 위해서 일종의 탐색을 해야 하기 때문이다.
현실에서 네트워크는 이보다 훨씬 복잡하다. 당장 국내 5천만 인구가 개인 스마트폰으로 요청을 보낼 것이고, 위치가 서울이라면, 서울의 10만개의 기지국 중 하나가 이를 캐치, 그리고 소위 백본망이라고 부르는 전국의 라우터들이 최적경로를 찾아 어느 데이터 센터(서버)에 보내질 것이다.
이 과정에 대해서, 하나하나 풀어서 설명을 해보자 한다.
데이터는 패킷(Packet)으로 쪼개져 전송된다
만약 대량의 이미지나 동영상을 한 번에 전송을 하게 된다면 어떻게 될까? 전송 시간동안 한 전송경로를 유지하기 위해 많은 비용을 소모해야 하고, 만약 중간에 실수로 놓친 파트라도 발생한다면 일이 꼬이게 된다. 따라서, 일반적으로 데이터는 패킷(Packet)으로 쪼개어 전송이 된다.
쪼개진 패킷은 시시각각 효율적인 경로로 보내지며, 이를 통해 네트워크 혼잡도를 완화시키는 이점을 누릴 수 있다. 또한 특정 패킷이 전송이 잘못되었다고 해도, 그 부분만 다시 보내면 된다.
그럼 패킷은 어떻게 만들어질까? 아마, 공부를 하시고 계신 분이라면 TCP/IP 4계층에 대해 들어보셨을 것이다. 하부 계층으로 데이터가 갈 수록, 전송하기에 적합하게 데이터는 포장(?)이 된다.

위의 그림과 같이, 순수 raw 데이터는, 앞뒤로 프레임 헤더와 트레일러, IP헤더, TCP/UDP헤더가 붙어, 전송하기에 적합해진 패킷이 된다. 여기서 오늘 중요하게 다룰 것은 IP 헤더, IP 헤더에는 발신자와 수신자의 IP 정보(주소)가 들어있어, 패킷이 어디로 보내져야 할 지 알려주는 일종의 길잡이 역할을 한다.
사설IP, 공인IP 그리고 IPv4
흐름이 끊길 수 있지만, 여기서 중요한 NAT(Network Address Translation)을 잠시 다루고자 한다. 우리가 사용하는 IP 주소는 IPv4가 여전히 많다. IPv4는 총 32비트로 구성된 인터넷 주소이며, 주소의 총 갯수는 2의 32승을 하여 약 43억개가 된다.
문제는 현재 모든 컴퓨터의 주소를 총 43억개의 주소로만 커버할 수 없다는 것이다. 당장 세계 총 인구만 해도 80억이 넘고 이 인구가 개개인 스마트폰만 가지고 있어도 80억개의 주소가 필요하다. 무엇보다, 한 명이 한 개만의 네트워크 가능 디바이스를 가지진 않는다.
이를 극복하기 위해 IPv6라는 주소가 고안되었지만, 여전히 IPv4가 많이 사용되고 있는 상황이다. 그리고 IPv4 주소는 공유기의 NAT, 즉 네트워크 주소 변환 기능을 사용하여 극복하고 있다.

위의 이미지를 보자. A, B, C 세 대의 개인 컴퓨터가 있다. 이는 모두 개개인 고유의 IP 주소를 가지고 있으나, 43억개 밖에(?) 안 되는 IPv4 주소를 모두 할당할 수 없다. 따라서 IPv4 주소는 공유기, 단 한 대에게만 할당을 하고, 이 공유기가 인터넷을 통해 서버와 통신한다.
그럼 서버에서 전송한 데이터를 공유기가 받아서, 어떻게 개개인 A, B, C 컴퓨터에 전송해야 할까? 여기서 네트워크 주소 변환 기능, NAT가 중요 역할을 한다.
서버에서 전송된 각 패킷의 IP 헤더에는 수신자(공유기의 IPv4)와 발신자(서버의 IPv4)가 들어있다. 이 IP헤더는 위의 그림에서의 인터넷, 공유기-서버 간의 망에서는 잘 탐색을 하여 찾아왔지만, 개인 컴퓨터에 맞는 주소는 없으니 찾아갈 수 없다. 따라서 공유기에서 패킷의 IP헤더의 공인 IPv4 수신자 주소를 사설 IP주소로 바꾸어 각 컴퓨터에 맞게 보내준다. 여기서 그 바꾸는 기능을 NAT라고 한다.
인터넷 망에서 패킷은 어떻게 경로를 탐색하나?
공유기에서 나온 패킷은 IP헤더 내 도착지 주소를 통해 서버로 간다. 하지만, 가기 위해서는 마찬가지로 다양한 과정을 거친다.

네트워크는 위의 그림과 같이 각각 Node가 상호간에 연결된 거대한 망구조로 되어있다. 그리고 이러한 Node는 라우터(Router)라고 불린다. 이러한 라우터는 흔히 가정에서 사용하는 간단한 장비가 아니라, 아래 그림과 같이 거대한 장비이다.

장비가 거대한 이유는, 그 만큼 처리량과 연산을 필요로 하기 때문이다. 예를 들어 특정 패킷이 가장 가까운 라우터에 도착하였다고 가정해보자. 그럼 해당 라우터는 패킷의 IP헤더를 통해 어디로 가야하는 지 파악하고, 다음 Node로 전송, 즉 건네주어야 한다. 이렇게 다음 노드로 전송하는 것을 홉(Hop)이라고 한다.

그럼, 이러한 홉을 어떻게 라우터가 작용하냐.. 설명하자면, 각 라우터는 특정 권역에 한정해서 라우팅 테이블(Routing Table)을 가지고 있다. 즉 특정 권역을 커버하는 라우터의 정보 리스트이다. 여기서 라우터는 해당 패킷을 위한 최적 경로를 탐색한 다음, 다음 라우터로 패킷을 넘겨주게 된다. 그리고 이 과정을 반복하여, 최종적으로 서버로, 서버에서 클라이언트로 전송과정이 이뤄진다.
왜 특정 권역이라고 말한 이유는, 만약 커버해야 할 라우터의 수가 엄청나게 많아지면, 라우터는 최적 경로를 찾기 위해 막대한 연산을 해야 하기 때문이다. 생각해보자, 몇 억개의 라우터가 상호간에 연결되어 있는데, 여기서 최적 경로를 찾기 위해, 그 막대한 라우터의 정보를 조회하고 계산해야 한다면, 시간이나 비용 면에서 엄창난 낭비이지 않을까?
그렇기 때문에, 라우터는 권역이 나눠져 있다. 해당 권역 내 한정해서는 연산을 하여 최적 경로를 찾고, 다음 권역으로 넘겨주는 방식으로 이해하면 좋겠다.
그럼 그 권역 내에서는 어떻게 경로 탐색을 할까? 탐색 하는 방법, 즉 프로토콜을 다양하지만, 대표적으로 OSPF가 있다. OSPF에서, 권역 내 라우터 정보를 교환하면서 라우팅 테이블을 만들고, 최단경로를 Dijkstra(다익스트라) 알고리즘을 사용하여 계산한다.
다익스트라 알고리즘이 무엇인지 모르겠다고..? 하실 분들이 계실 것이다. 사실.. 처음 진입하기에는 난이도가 있는 알고리즘이다. 다만, 코딩테스트를 열심히 연습하시는 분이라면, 한번 접해보셨을 터이니, 여기서 설명은 생략하고자 한다.
끝!
'컴퓨터 과학' 카테고리의 다른 글
| 메모리에도 서열이 있다? 메모리 계층 정리 (2) | 2025.08.30 |
|---|---|
| OS(운영체제)에 대해 알아보기: System Call이란? (15) | 2025.03.12 |
| Http의 역사를 알아보자: Http/2을 중심으로 (2) | 2025.03.10 |
| MySQL과 MongoDB와의 차이점: MongoDB를 사용하는 이유 (0) | 2025.03.09 |
| Docker(도커) vs Virtual Machine(가상머신), 왜 도커를 사용하나? (8) | 2025.03.08 |