네트워크와 인터넷 1강. 중앙 서버가 없는 네트워크
인터넷에는 전체를 지휘하는 관제탑이 없습니다. 그런데도 여러분의 데이터는 지구 반대편까지 정확히 도착합니다.
풀고 시작
폭탄이 떨어져도 남는 통신
1960년대 초 랜드연구소의 폴 배런(Paul Baran)은 곤란한 질문을 받았습니다. 통신망의 상당 부분이 파괴돼도 남은 부분끼리 통신할 수 있는 망을 설계할 수 있는가. 당시 표준이던 전화망은 회선 교환(circuit switching) 방식이었습니다. 통화가 시작되는 순간 두 사람을 잇는 경로 하나가 통째로 예약되고, 끝날 때까지 그 길만 씁니다. 품질은 안정적이지만 중간의 한 마디만 끊겨도 통화 전체가 죽고, 두 사람이 침묵하는 동안에도 회선은 놀면서 점유돼 있죠.
배런의 답은 망을 중심 없는 그물로 짜고, 메시지를 작은 블록으로 쪼개 각 블록이 알아서 살아 있는 길을 찾게 하자는 것이었습니다. 비슷한 시기에 영국의 도널드 데이비스(Donald Davies)가 독립적으로 같은 발상에 도달했고, 그 조각에 패킷(packet)이라는 이름을 붙였습니다. 여기서 흔한 오해를 하나 정리해 둡시다. 배런의 동기가 살아남는 지휘통신망이었던 것은 맞지만, 1969년 가동된 아파넷(ARPANET)의 직접 목적은 값비싼 컴퓨터를 나눠 쓰는 것이었습니다. 인터넷이 핵전쟁 대비로 만들어졌다는 말은 절반만 맞는 셈이죠. 참고로 아파넷의 첫 전송은 LOGIN을 치다가 L과 O에서 시스템이 죽는 것으로 끝났습니다.
봉투 안의 봉투
패킷이 알아서 길을 찾으려면 자기 목적지를 어딘가에 적고 다녀야 합니다. 인터넷은 이 일을 계층(layer)으로 나눠 처리합니다. 애플리케이션이 만든 데이터에 전송 계층이 자기 머리말을 붙이고, 그 결과에 인터넷 계층이 다시 머리말을 붙이고, 마지막으로 링크 계층이 한 겹 더 감싸 케이블이나 전파로 내보냅니다. 편지를 봉투에 넣고 그 봉투를 더 큰 봉투에 넣는 셈인데, 이것을 캡슐화(encapsulation)라 부릅니다. 받는 쪽은 정확히 역순으로 겉봉부터 벗겨 나가죠. 이 구조 덕분에 유선 랜을 와이파이로 바꿔도 브라우저는 한 줄도 고칠 필요가 없습니다. 아래 계층은 위 계층의 내용물을 알 필요가 없고, 위 계층은 아래가 구리선인지 광섬유인지 알 필요가 없기 때문입니다.
주소를 읽고 다음 한 걸음만 정합니다
인터넷 계층의 주인공은 IP 주소입니다. IPv4는 32비트라 약 43억 개뿐이어서 이미 고갈됐고, 그래서 여러 기기가 하나의 공인 주소를 나눠 쓰는 주소 변환(NAT)과 128비트짜리 IPv6가 함께 쓰입니다. 진짜 놀라운 부분은 라우터의 무지입니다. 라우터는 목적지까지의 전체 경로를 모른 채, 자기 라우팅 표를 보고 이 패킷을 어느 이웃에게 넘길지 딱 다음 한 걸음만 결정합니다. 그 판단이 수십 번 이어져 패킷이 대륙을 건너죠. 통신사 같은 자율 시스템들은 서로 어떤 주소 대역에 닿는지를 경로 정보 교환 규약(BGP)으로 알려 주며 이 표를 채웁니다. 대신 IP는 아무것도 약속하지 않습니다. 도착도 순서도 보장하지 않는 최선 노력(best-effort) 전달이죠. 그럼 우리가 매일 쓰는 신뢰성은 어디서 올까요.
신뢰성은 망이 아니라 양 끝에서 만들어집니다
TCP가 그 일을 합니다. 보내는 쪽은 조각마다 순서 번호를 붙이고, 받는 쪽은 잘 받았다는 확인 응답을 돌려줍니다. 정해진 시간 안에 확인이 오지 않으면 그 조각만 다시 보냅니다. 순서가 뒤엉켜 도착하면 번호를 보고 재정렬하고, 한 번에 보낼 양을 창(window) 크기로 조절하며, 손실을 회선이 막혔다는 신호로 읽고 속도를 스스로 낮춥니다. 즉 신뢰성은 케이블이 착해져서 생기는 것이 아니라, 양 끝 컴퓨터의 소프트웨어가 실패를 세어 가며 복구해 만들어 내는 성질입니다. 1974년 빈트 서프(Vint Cerf)와 밥 칸(Bob Kahn)의 설계가 신뢰성을 양 끝에 두는 이 배치를 정했고, 1981년 솔처(Saltzer)와 리드(Reed), 클라크(Clark)가 여기에 종단 간 원칙(end-to-end principle)이라는 이름을 붙였습니다. 망 한가운데가 단순해진 덕분에 누구든 망을 개조하지 않고 새 서비스를 얹을 수 있게 됐죠. 물론 신뢰성이 늘 이득은 아닙니다. 실시간 통화나 게임은 늦게 도착한 재전송이 쓸모없어서, 확인과 재전송을 생략한 UDP를 씁니다.
이름을 주소로 바꾸는 거대한 전화번호부
주소가 숫자라면 사람은 어떻게 기억할까요. 초기 인터넷은 모든 호스트의 이름과 주소를 적은 파일 하나를 각자 복사해 썼습니다. 호스트가 늘자 이 방식이 무너졌고, 1983년 폴 모카페트리스(Paul Mockapetris)가 계층적이고 분산된 이름 체계인 DNS를 설계했습니다. 리졸버는 이름을 오른쪽부터 훑어 루트 서버에게 최상위 도메인 담당자를 묻고, 그 담당자에게 권한 서버를 묻고, 마지막으로 권한 서버에게 실제 IP 주소를 받습니다. 한 번 받은 답은 유효 기간 동안 캐시에 보관해 같은 질문을 반복하지 않죠.
여기까지 오면 인터넷의 정체가 드러납니다. 인터넷은 하나의 망이 아니라 주인이 서로 다른 수만 개의 망이 공통 규약으로 연결된 네트워크의 네트워크입니다. 규약은 IETF에서 문서로 공개되고 누구나 구현할 수 있습니다. 데이비드 클라크가 남긴 "우리는 왕도 대통령도 투표도 거부한다, 우리는 대략적 합의와 돌아가는 코드를 믿는다"는 문장이 이 문화를 요약하죠. 다만 완전히 평평하다고 말하면 과장입니다. 주소와 도메인 배분은 ICANN과 지역 등록기관이 조정하고, 실제 트래픽은 소수의 대형 통신사와 콘텐츠 전송망에 크게 몰려 있습니다. 다음 강에서는 이 인터넷 위에 얹힌 서비스 하나인 웹을 다룹니다.
인출 문제
생각해볼 질문 (정답 없음)
- 인터넷은 소유자가 없도록 설계됐지만 실제 트래픽은 소수 사업자에 몰려 있습니다. 설계의 분산성과 운영의 집중성 중 무엇이 인터넷의 진짜 성격을 말해 줄까요.
이전: 프로그래밍의 세계 4강 · 다음: 네트워크와 인터넷 2강