"매 host 를 매 low-D Euclidean space 의 point 로 embed — 매 distance 가 매 network latency 의 predictor". Ng & Zhang (SIGCOMM 2002) 의 GNP — 매 landmark 기반 절대 좌표 — 가 매 idea 의 시초. 매 후속작 Vivaldi (Dabek 2004) 가 매 decentralized 형태로 매 P2P / overlay network 에 광범위하게 사용. 매 2026 의 application 은 매 CDN edge selection, DHT routing, server placement.
매 핵심
매 GNP (centralized) 의 idea
Landmark hosts (예: 15-20개) 가 매 Internet 곳곳에 배치.
매 RTT 측정 후 landmark 들의 매 좌표를 매 fixed point 로 fitting (multidim scaling).
매 new host 는 매 landmark 들에 ping → 매 자기 좌표 solve.
매 두 host 간 RTT ≈ Euclidean distance.
매 Vivaldi (decentralized) 의 차이
Landmark X — 매 모든 peer 가 random subset 와 매 RTT 교환.
매 spring relaxation: 매 over/under-estimated 매 vector 만큼 push/pull.
매 height augmentation (extra non-Euclidean dim) 으로 매 access link 의 last-mile 표현.
매 dynamic — peer churn 에 자동 적응.
매 application
CDN routing: 매 client 좌표 → 매 nearest edge.
DHT optimization: 매 finger table 을 매 latency-aware 로 선택.
Server selection: 매 mirror / replica 중 가장 가까운 매 fetch.
Network tomography: 매 latency map 시각화.
P2P overlays: BitTorrent, Skype 가 매 사용 (legacy).
💻 패턴
GNP-style landmark fitting (NumPy)
importnumpyasnpfromscipy.optimizeimportminimizedeffit_landmarks(rtt_matrix,dim=4):"""rtt_matrix[i][j] = measured RTT between landmark i,j (ms)."""n=rtt_matrix.shape[0]x0=np.random.rand(n*dim)*50defstress(x):coords=x.reshape(n,dim)err=0.0foriinrange(n):forjinrange(i+1,n):d=np.linalg.norm(coords[i]-coords[j])err+=((d-rtt_matrix[i,j])/rtt_matrix[i,j])**2returnerrres=minimize(stress,x0,method='L-BFGS-B')returnres.x.reshape(n,dim)defposition_new_host(rtts_to_landmarks,landmark_coords,dim=4):defstress(x):returnsum(((np.linalg.norm(x-landmark_coords[i])-rtts_to_landmarks[i])/rtts_to_landmarks[i])**2foriinrange(len(rtts_to_landmarks)))res=minimize(stress,np.zeros(dim),method='L-BFGS-B')returnres.x
Vivaldi spring relaxation step (Go)
typeCoordstruct{Vec[]float64// Euclidean dimsHeightfloat64// last-mileErrfloat64// local error estimate}const(Ce=0.25// error sensitivityCc=0.25// coord change sensitivity)// Update local coord after measuring rtt to peer with peerCoordfunc(c*Coord)Update(rttfloat64,peerCoordCoord){w:=c.Err/(c.Err+peerCoord.Err)predicted:=dist(c.Vec,peerCoord.Vec)+c.Height+peerCoord.Heightes:=math.Abs(predicted-rtt)/rttc.Err=es*Ce*w+c.Err*(1-Ce*w)delta:=Cc*wdirection:=unit(sub(c.Vec,peerCoord.Vec))force:=(rtt-predicted)*deltafori:=rangec.Vec{c.Vec[i]+=direction[i]*force}c.Height=math.Max(0,c.Height+(rtt-predicted)*delta*0.5)}
defroute(client_ip):# Try anycast result first (BGP picks PoP)pop=anycast_lookup(client_ip)ifpopandrecent_health(pop):returnpop# Fallback: use GNP coords from RIPE Atlas / Cedexiscoord=lookup_client_coord(client_ip)returnmin(EDGES,key=lambdae:euclid(coord,e.coord)+e.height+coord.height)