네트워크란 무엇인가
네트워크를 노드와 링크로 보고 그 목적과 장비의 역할을 정리한 뒤, 범위에 따른 분류와 토폴로지를 살펴보고 링크와 노드의 고장이 미치는 범위를 모델로 확인합니다. 클라이언트-서버와 P2P를 비교하고, 개발자가 장애를 계층별로 나누어 진단해야 하는 이유를 다룹니다.
개발을 하다 보면 API를 호출하고, 서버에 배포하고, 브라우저에서 결과를 확인합니다. 이 모든 일 뒤에서는 네트워크가 데이터를 실어 나르고 있습니다. 평소에는 의식하지 않아도 되지만, API가 가끔 응답하지 않거나 특정 지역에서만 접속이 안 될 때는 네트워크를 모르면 어디서부터 찾아봐야 할지조차 알기 어렵습니다.
이 글에서는 네트워크가 무엇이고 어떤 요소로 이루어지는지, 어떻게 분류하고 연결하는지, 그리고 개발자가 왜 네트워크를 알아야 하는지 살펴봅니다.
네트워크는 무엇을 위해 있나
네트워크(network)는 둘 이상의 장치가 데이터를 주고받도록 연결된 시스템입니다. 여기서 장치는 컴퓨터, 서버, 스마트폰, IoT 기기처럼 통신할 수 있는 모든 것을 말합니다. 장치를 연결하는 목적은 크게 세 가지입니다.
첫째는 자원 공유입니다. 프린터, 파일 서버, 데이터베이스를 여러 사람이 함께 쓰면 사람마다 따로 갖출 필요가 없습니다. 둘째는 통신으로, 이메일과 메신저, 영상 통화로 멀리 있는 사람과도 바로 대화할 수 있습니다. 셋째는 분산 처리로, 한 대로는 감당하기 어려운 데이터 분석이나 기계 학습을 여러 컴퓨터에 나누어 처리합니다. 네트워크가 없다면 데이터는 USB 같은 물리 매체로만 옮겨야 했을 것이고, 스트리밍이나 클라우드 서비스도 없었을 것입니다.
노드와 링크
네트워크를 이루는 가장 기본적인 요소는 노드(node)와 링크(link)입니다. 노드는 네트워크에 연결된 장치로, 노트북과 서버뿐 아니라 중간에서 데이터를 전달하는 라우터와 스위치도 노드입니다. 링크는 노드와 노드를 잇는 통신 경로로, 이더넷 케이블이나 광섬유 같은 유선일 수도, Wi-Fi나 블루투스 같은 무선일 수도 있습니다. 지도 위의 도시와 도로처럼, 인터넷이라는 거대한 시스템도 수많은 노드와 링크가 그물처럼 얽힌 것입니다.
노드는 하는 일에 따라 이름이 다릅니다.
| 장비 | 하는 일 |
|---|---|
| 허브 | 받은 신호를 다른 모든 포트로 그대로 되풀이해 내보낸다 |
| 스위치 | 학습한 MAC 주소를 보고 프레임을 해당 포트로만 보낸다. 모르는 주소나 브로드캐스트는 같은 VLAN의 다른 포트로 모두 보낸다 |
| 라우터 | IP 주소와 라우팅 표를 보고 패킷을 다음 라우터로 보낸다 |
| 방화벽 | 정해 둔 규칙에 따라 트래픽을 통과시키거나 막는다 |
| 로드 밸런서 | 들어온 요청을 여러 서버에 나누어 보낸다 |
| 무선 AP | 무선 단말과 유선 LAN 사이에서 프레임을 이어 준다 |
허브는 모든 포트가 하나의 매체를 나누어 써서 충돌이 잦고, 다른 장치의 신호까지 모든 포트로 흘러가므로 지금의 이더넷 LAN에서는 거의 쓰지 않고 스위치를 씁니다. 장비와 역할도 구분해야 합니다. 노트북은 서버에 파일을 요청할 때는 클라이언트이지만, 파일 공유를 켜면 다른 장치에 대해 서버가 되기도 합니다. 라우터처럼 중간에서 전달하는 노드는 서비스의 서버가 아닙니다.
범위에 따른 분류
네트워크는 연결하는 범위에 따라 나눕니다.
| 분류 | 범위 | 예 |
|---|---|---|
| PAN(personal area network) | 한 사람 주변의 몇 미터 | 블루투스 이어폰과 스마트폰 |
| LAN(local area network) | 집, 사무실, 건물 하나 | 공유기에 연결된 집 안의 기기, 회사의 사내망 |
| MAN(metropolitan area network) | 도시나 캠퍼스 | 여러 캠퍼스를 잇는 대학의 망 |
| WAN(wide area network) | 국가나 대륙 | 통신 사업자의 백본망, 인터넷 |
LAN은 범위가 좁아 관리하기 쉽고, 유선 LAN이라면 1Gbps 이상도 흔합니다. 여러 LAN을 넓은 지역에 걸쳐 잇는 것이 WAN이며, 인터넷은 인터넷 서비스 사업자(ISP)들의 회선으로 전 세계의 LAN을 이은 가장 큰 WAN입니다. LAN과 MAN, WAN을 가르는 정해진 거리는 없으며, 실제로는 거리보다 누가 그 망을 소유하고 관리하느냐로 구분하는 경우가 많습니다.
토폴로지: 연결하는 모양
토폴로지(topology)는 노드와 링크가 어떤 모양으로 연결되어 있는지를 말합니다.
LINK TOPOLOGY · CONNECTIVITY / FAILURE SCOPE
연결 모양을 읽고 장애가 영향을 주는 범위를 구분한다
스타의 중앙, 링의 닫힌 고리, 부분 메시의 추가 경로, 트리의 상위 연결을 비교합니다. 선은 링크를 뜻하며 패킷 흐름 방향·자동 우회·토큰 접근 제어를 보장하지 않습니다.
선은 데이터 흐름의 방향이나 자동 우회를 뜻하지 않습니다.
청록색 강조: 스타의 공유 중앙과 메시의 추가 연결. 중앙 장애는 여러 연결에 영향을 줄 수 있고, 메시의 대체 경로는 사용 가능하며 라우팅이 수렴해야 우회에 쓰입니다.
버스(bus)는 하나의 케이블에 모든 노드를 매다는 모양으로, 싸게 만들 수 있지만 그 케이블이 끊기면 전체가 멈추며 초기의 이더넷이 이랬습니다. 스타(star)는 중앙의 장비에 모든 노드를 하나씩 잇는 모양으로, 관리가 쉽고 케이블 하나가 끊겨도 그 노드만 영향을 받지만 중앙 장비가 고장 나면 모두 통신을 잃습니다. 링(ring)은 노드들을 고리처럼 잇고, 메시(mesh)는 노드 사이에 여러 경로를 두어 링크 하나가 끊겨도 돌아갈 길을 남기며, 트리(tree)는 스타를 계층으로 쌓은 모양입니다. 지금의 LAN은 대부분 스위치를 중심으로 한 스타이고, 인터넷 백본과 데이터센터는 메시에 가깝습니다.
같은 고장이라도 링크가 끊긴 것인지 여러 노드가 함께 쓰는 노드가 멈춘 것인지에 따라 영향의 범위가 다릅니다. 다음 코드는 시작 노드에서 가까운 노드부터 차례로 방문하는 너비 우선 탐색으로, 살아 있는 링크만 따라가며 어떤 노드에 닿을 수 있는지 셉니다.
def reachable(links, start, down=()):
"""살아 있는 링크만 따라가며 start에서 닿는 노드를 찾는다(너비 우선 탐색)."""
graph = {}
for a, b in links:
if a in down or b in down:
continue # 꺼진 노드에 붙은 링크는 쓸 수 없다
graph.setdefault(a, set()).add(b)
graph.setdefault(b, set()).add(a)
seen, queue = {start}, [start]
while queue:
node = queue.pop(0)
for nxt in sorted(graph.get(node, ())):
if nxt not in seen:
seen.add(nxt)
queue.append(nxt)
return sorted(seen - {start})
star = [("SW", "A"), ("SW", "B"), ("SW", "C"), ("SW", "D")]
mesh = [("A", "B"), ("B", "C"), ("C", "A"), ("C", "D")]
print("스타, 평소 A에서:", reachable(star, "A"))
print("스타, A의 케이블이 끊긴 뒤 B에서:", reachable([l for l in star if l != ("SW", "A")], "B"))
print("스타, 스위치가 꺼진 뒤 A에서:", reachable(star, "A", down={"SW"}))
print("메시, A-B 링크가 끊긴 뒤 A에서:", reachable([l for l in mesh if l != ("A", "B")], "A"))스타, 평소 A에서: ['B', 'C', 'D', 'SW']
스타, A의 케이블이 끊긴 뒤 B에서: ['C', 'D', 'SW']
스타, 스위치가 꺼진 뒤 A에서: []
메시, A-B 링크가 끊긴 뒤 A에서: ['B', 'C', 'D']스타에서 A의 케이블이 끊기면 A만 빠지고 나머지는 계속 통신하지만, 중앙의 스위치가 꺼지면 아무도 서로에게 닿지 못합니다. 메시에서는 A와 B를 잇는 링크가 끊겨도 C를 거쳐 B에 닿을 수 있습니다. 실제 네트워크에서 대체 경로가 있다고 곧바로 우회가 되는 것은 아니며, 라우팅이 그 경로를 찾아 쓰도록 바뀌어야 합니다.
클라이언트-서버와 P2P
네트워크의 장치들이 데이터를 주고받는 구조는 크게 두 가지로 나뉩니다. 클라이언트-서버 모델(client-server model)에서는 서비스를 제공하는 서버와 서비스를 요청하는 클라이언트의 역할이 나뉘며, 웹 브라우저가 웹 서버에 페이지를 요청하는 것이 전형적인 예입니다. 관리와 보안 정책을 서버 쪽에 모으기 쉽고, 서버는 역할을 뜻하므로 실제로는 여러 대로 복제하고 나누어 둘 수 있습니다.
P2P 모델(peer-to-peer model)에서는 참여자가 자원을 받으면서 동시에 자기가 가진 자원을 다른 참여자에게 내줍니다. BitTorrent는 파일을 내려받으면서 이미 받은 조각을 다른 사용자에게 올려 주고, 화상 통화에 쓰는 WebRTC도 단말끼리 직접 데이터를 주고받습니다.
NETWORK ROLES · REQUEST DIRECTION
서버는 제공 역할, 피어는 요청과 제공을 함께 맡는다
화살표는 요청 방향입니다. 서버 역할은 여러 장비로 복제할 수 있으며 P2P에서도 자원 복제·연결 상태가 있어야 장애에 대응할 수 있습니다.
P2P 그림은 두 참여자의 역할 예시이며 모든 피어가 서로 직접 연결된다는 뜻은 아닙니다.
위쪽은 클라이언트 A와 B가 같은 서버 역할에 각각 요청합니다. 아래쪽의 피어 A와 B는 서로 반대 방향으로 요청할 수 있습니다. 응답·모든 피어의 연결망은 생략한 역할 예시입니다.
클라이언트-서버는 사용자가 늘면 서버를 늘려야 하고, 서버 하나에만 기대면 그 서버의 고장이 서비스 전체의 중단이 됩니다. P2P는 참여자가 늘수록 자원도 늘어나지만, 참여자들의 업로드 속도와 필요한 조각을 가진 참여자가 남아 있는지에 따라 성능이 크게 달라지고, 믿을 수 없는 참여자를 다루기도 어렵습니다. 실무의 시스템은 대부분 클라이언트-서버를 바탕으로 만들고, 화상 통화나 대용량 배포처럼 일부에만 P2P를 섞습니다.
개발자가 네트워크를 알아야 하는 이유
프레임워크는 네트워크의 복잡함을 잘 숨겨 줍니다. fetch()를 부르면 응답이 오고, 웹 프레임워크로 API를 만들면 서버가 알아서 요청을 받습니다. 네트워크 지식이 필요한 순간은 대개 문제가 생겼을 때입니다.
| 증상 | 의심해 볼 네트워크 원인 |
|---|---|
| API가 가끔 타임아웃된다 | TCP 재전송, 혼잡, MTU 문제 |
| 특정 지역에서만 접속이 안 된다 | DNS, 라우팅, 방화벽 |
| Docker 컨테이너끼리 통신이 끊긴다 | 브리지 네트워크, 방화벽 규칙 |
| 브라우저에서 CORS 오류가 난다 | HTTP 응답 헤더, 프록시 설정 |
| HTTPS 접속에 인증서 경고가 뜬다 | 인증서 만료, TLS 설정 |
| WebSocket 연결이 일정 시간마다 끊긴다 | 프록시의 유휴 연결 제한 시간 |
이런 문제는 코드를 아무리 들여다봐도 답이 나오지 않습니다. 원인이 코드 밖, 네트워크의 어느 계층에 있기 때문입니다. 그래서 문제를 계층별로 나누어 차례로 확인합니다.
nslookup api.example.com # 이름이 IP 주소로 바뀌는가
ping -c 4 api.example.com # ICMP로 상대에게 닿는가
nc -zv api.example.com 443 # TCP 443번 포트로 연결되는가
traceroute api.example.com # 어떤 라우터들을 거쳐 가는가
curl -v https://api.example.com/health # HTTP 요청과 응답이 올바른가api.example.com은 예로 든 이름이므로 실제 대상으로 바꾸어 실행합니다. Windows에서는 nslookup을 그대로 쓰고, ping은 보낼 횟수를 -c 4 대신 -n 4로 정합니다. traceroute 대신 tracert를 쓰고, nc 대신 PowerShell의 Test-NetConnection api.example.com -Port 443을 씁니다. 대상 이름을 빼면 Microsoft의 기본 시험 서버를 확인하므로 이름을 꼭 적어야 합니다. Windows PowerShell 5.1에서는 curl이 Invoke-WebRequest의 별칭이므로, Windows에 들어 있는 curl 프로그램을 쓰려면 curl.exe -v https://api.example.com/health처럼 curl.exe로 부릅니다.
결과를 읽을 때는 각 명령이 무엇을 확인하는지 구분해야 합니다. 예를 들어 이름은 잘 풀리고 ping은 응답이 없는데 443번 포트 연결과 HTTPS 요청은 성공한다면, 대상이 ICMP를 막아 두었을 뿐 서비스는 정상일 가능성이 큽니다. ping의 실패를 곧 서버의 장애로 읽으면 엉뚱한 곳을 고치게 됩니다.
DNS의 문제인지, TCP 연결의 문제인지, HTTP 헤더의 문제인지를 가려내는 것만으로도 문제를 푸는 속도가 크게 달라집니다. 이 교재 전체의 목표도 용어를 외우는 것이 아니라, 이렇게 문제를 계층별로 나누어 생각하는 능력을 기르는 것입니다.
정리
- 네트워크는 장치들이 데이터를 주고받도록 연결된 시스템으로, 자원 공유, 통신, 분산 처리를 위해 씁니다.
- 네트워크는 노드와 링크로 이루어지며, 허브, 스위치, 라우터, 방화벽, 로드 밸런서는 각자 다른 일을 하는 노드입니다.
- 범위에 따라 PAN, LAN, MAN, WAN으로 나누며, 인터넷은 가장 큰 WAN입니다.
- 토폴로지에 따라 고장의 영향이 달라서, 스타는 중앙 장비가, 메시는 대체 경로를 쓰도록 바꾸는 라우팅이 중요합니다.
- 클라이언트-서버는 역할을 나누어 관리가 쉽고, P2P는 참여자가 자원을 함께 내놓습니다.
- 네트워크 문제는 DNS, 연결, 전송, HTTP처럼 계층별로 나누어 확인해야 빨리 풀립니다.
연습 문제
1. 스타에서 끊긴 것은 링크인가 노드인가
A, B, C, D 네 장치가 스위치 하나에 각각 케이블 하나로 연결되어 있습니다. B의 케이블만 끊겼을 때 A와 C, B와 C는 각각 통신할 수 있나요? 이번에는 스위치 자체가 꺼졌다면, 케이블을 모두 새것으로 바꾸면 통신이 돌아오나요?
해설 보기
B의 케이블만 끊겼다면 A와 C는 각자의 케이블과 스위치가 살아 있으므로 통신할 수 있고, B는 유일한 링크가 끊겼으므로 C와 통신할 수 없습니다. 스위치가 꺼진 경우에는 모든 장치가 그 스위치를 거쳐야만 서로에게 닿으므로, 케이블을 아무리 바꿔도 스위치를 되살리기 전에는 통신이 돌아오지 않습니다. 고장을 찾을 때는 링크가 살아 있는지와 여러 노드가 함께 쓰는 중앙 노드가 살아 있는지를 나누어 확인해야 합니다.
2. 서버 하나와 P2P
인기 있는 대용량 파일을 서버 한 대로 배포하던 서비스가 사용자가 열 배로 늘자 느려졌습니다. 서버를 늘리는 방법과 P2P로 배포하는 방법을 비교하고, P2P가 잘 동작하려면 어떤 조건이 필요한지 설명하세요.
해설 보기
서버를 늘리면 처리할 수 있는 양이 서버 수에 비례해 늘지만, 그만큼 장비와 회선 비용이 듭니다. P2P로 배포하면 파일을 받은 사용자가 다른 사용자에게 조각을 올려 주므로, 사용자가 늘수록 배포할 수 있는 양도 함께 늘어납니다. 다만 사용자들이 업로드를 충분히 해 주고, 필요한 조각을 가진 사용자가 늘 어딘가에 남아 있어야 하며, 받은 조각이 위조되지 않았는지 해시로 확인하는 장치가 있어야 합니다. 그래서 실제로는 처음 배포하는 서버를 두고, 그 위에 P2P를 더해 서버의 부담을 줄이는 방식이 흔합니다.
3. ping은 실패하는데
어떤 웹 서비스에 대해 nslookup은 주소를 돌려주고, ping은 모두 응답이 없지만, nc -zv로 443번 포트에는 연결되고 curl로 받은 응답도 정상입니다. 서비스에 장애가 있다고 할 수 있나요? 무엇을 근거로 판단해야 하나요?
해설 보기
장애라고 할 수 없습니다. 사용자가 실제로 쓰는 것은 TCP 443번 포트의 HTTPS인데, 연결과 응답이 모두 정상입니다. ping은 ICMP라는 별도의 프로토콜을 쓰며, 많은 서버와 방화벽이 보안상 ICMP 응답을 막거나 제한하므로 ping이 실패해도 서비스는 멀쩡할 수 있습니다. 판단은 사용자가 쓰는 것과 같은 프로토콜과 포트로 한 확인을 근거로 해야 하며, 여러 명령의 결과가 서로 무엇을 확인한 것인지 구분해 읽어야 합니다.
다음 글 인터넷의 구조에서는 수많은 네트워크가 어떻게 연결되어 하나의 인터넷을 이루는지, ISP와 인터넷 교환 지점, 해저 케이블로 어떻게 이어져 있는지 살펴봅니다.