개발자가 알면 좋은 네트워크 기초 — DNS부터 TCP까지
DNS 캐시 때문에 배포 후 30분 동안 옛 버전이 나왔다. 네트워크의 기초를 모르면 이런 디버깅을 못한다. 이 글에서는 개발자가 알아야 할 네트워크 기초를 설명한다.
DNS 해석 과정
브라우저가 example.com을 방문하면, 다음의 과정이 일어난다.
1. 로컬 캐시 확인 (브라우저 캐시)
2. OS 캐시 확인
3. Recursive Resolver 질문 (ISP DNS)
4. Root Nameserver 질문
5. TLD Nameserver 질문 (.com을 담당하는 서버)
6. Authoritative Nameserver 질문 (example.com 담당)
7. 응답이 역순으로 돌아옴
8. 각 단계에서 캐싱됨
실제 과정 추적
# DNS 해석 추적
dig example.com
# 출력 분석:
; <<>> DiG 9.10.6 <<>> example.com
;; Query time: 45 msec # 쿼리 시간
;; SERVER: 8.8.8.8#53(8.8.8.8) # 사용한 네임서버
# 상세 추적
dig +trace example.com # 전체 경로 표시
nslookup example.com # 간단한 버전
TTL 이해
TTL (Time To Live)은 DNS 응답을 얼마나 오래 캐시할 것인지를 지시한다.
# TTL 확인
dig example.com | grep example.com
# 출력:
example.com. 3600 IN A 93.184.216.34
↑
TTL: 3600초 (1시간)
배포 전에 TTL을 낮추면, 변경이 빠르게 반영된다.
# TTL을 300초(5분)로 설정
# DNS 레코드 설정에서:
example.com. 300 IN A 93.184.216.34
# 또는 프로그래밍으로
import dns.resolver
answers = dns.resolver.resolve('example.com', 'A', lifetime=5)
TCP 3-Way Handshake
TCP 연결은 3개의 패킷 교환으로 시작된다.
클라이언트 서버
| |
|--- SYN (seq=100) ---->|
| | (SYN 수신)
|<-- SYN-ACK (seq=300, ack=101) --|
| (SYN-ACK 수신) |
|--- ACK (seq=101, ack=301) ---->|
| | (ACK 수신)
| 연결 확립! |
각 단계:
- SYN: 클라이언트가 시퀀스 번호를 보냄
- SYN-ACK: 서버가 수신했음을 확인하고 자신의 시퀀스 번호를 보냄
- ACK: 클라이언트가 서버의 시퀀스 번호를 확인
RTT (Round Trip Time) 측정
# ping으로 RTT 확인
ping example.com
# 또는 curl로
curl -w 'Connect time: %{time_connect}s
' example.com
# HTTP/2 연결 시간 분석
curl -w '@-' -o /dev/null -s << 'EOF'
time_namelookup: %{time_namelookup}
time_connect: %{time_connect}
time_appconnect: %{time_appconnect}
time_pretransfer: %{time_pretransfer}
time_starttransfer: %{time_starttransfer}
time_total: %{time_total}
EOF
HTTP/2 멀티플렉싱
HTTP/1.1에서는 한 번에 하나의 요청만 처리한다. HTTP/2는 여러 요청을 동시에 처리한다.
HTTP/1.1:
요청1 -----> [처리] -----> 응답1
요청2 -----> [처리] -----> 응답2
요청3 -----> [처리] -----> 응답3
HTTP/2 (멀티플렉싱):
요청1 요청2 |-----> [처리] -----> 응답1,2,3
요청3 / (동시 처리)
HTTP/2 사용 확인
# HTTP/2 지원 확인
curl -I --http2 https://example.com
# 또는 curl -v로 상세 확인
curl -v --http2 https://example.com
# HTTP/2.0 200 이 보이면 HTTP/2 사용 중
HTTP/3 QUIC
HTTP/3는 QUIC 프로토콜을 사용한다. TCP 대신 UDP 기반이다.
| 프로토콜 | 기반 | 0-RTT | 멀티플렉싱 | 연결 마이그레이션 |
|---|---|---|---|---|
| HTTP/1.1 | TCP | ❌ | ❌ | ❌ |
| HTTP/2 | TCP | ❌ | ✅ | ❌ |
| HTTP/3 | QUIC | ✅ | ✅ | ✅ |
0-RTT는 캐시된 세션으로 첫 패킷부터 데이터를 보낼 수 있다는 뜻이다. 매우 빠르다.
TLS 1.3 Handshake
TLS도 핸드셰이크 과정이 있다. TLS 1.3은 1.2보다 빠르다.
TLS 1.2 (2 Round Trips):
클라이언트 -----> ClientHello
<----- ServerHello, Cert, ServerKeyExchange, ServerHelloDone
-----> ClientKeyExchange, ChangeCipherSpec, Finished
<----- ChangeCipherSpec, Finished
(이제야 암호화된 통신 가능)
TLS 1.3 (1 Round Trip):
클라이언트 -----> ClientHello + (예상하는 키 교환)
<----- ServerHello + Cert + Finished (암호화됨)
-----> Finished
(바로 암호화된 통신 시작)
TLS 버전 확인
# OpenSSL로 확인
openssl s_client -connect example.com:443
# Protocol 줄을 보면 버전이 표시됨
# TLSv1.3이면 최신
CDN과 엣지 캐싱
CDN은 콘텐츠를 전 세계 여러 위치에 캐시한다.
# CDN 확인
curl -I https://example.com | grep -i "via\|server\|cache"
# 또는 nslookup으로 IP의 위치 추적
nslookup example.com
# 여러 IP가 반환되면 CDN 사용 중
캐시 헤더 설정
// Express.js에서
app.get('/static/*', (req, res) => {
res.set('Cache-Control', 'public, max-age=31536000'); // 1년
res.sendFile(req.path);
});
app.get('/api/*', (req, res) => {
res.set('Cache-Control', 'no-cache, no-store'); // 캐시 없음
// ...
});
app.get('/dynamic/*', (req, res) => {
res.set('Cache-Control', 'public, max-age=3600, s-maxage=86400');
// 브라우저: 1시간, CDN: 1일
// ...
});
네트워크 디버깅 도구
curl 심화
# 상세 정보 출력
curl -v https://example.com
# 성능 측정
curl -w '@-' -o /dev/null -s << 'EOF'
time_namelookup: %{time_namelookup}s
time_connect: %{time_connect}s
time_appconnect: %{time_appconnect}s
time_starttransfer: %{time_starttransfer}s
time_total: %{time_total}s
EOF
# Headers만 확인
curl -I https://example.com
# HTTP/1.1 강제
curl --http1.1 https://example.com
# HTTP/2 강제
curl --http2 https://example.com
traceroute - 경로 추적
# 패킷의 경로 추적
traceroute example.com
# 또는 mtr (더 상세)
mtr example.com
Network tab in DevTools
브라우저의 Network 탭은 가장 강력한 도구다.
- 각 요청의 상세 정보
- 응답 헤더 및 바디
- 캐시 상태
- 연결 시간 분석
실전 디버깅 사례
DNS 캐시 문제
배포 후 옛 버전이 계속 나오는 경우:
# 1. 로컬 DNS 캐시 확인
nslookup example.com
# 2. 글로벌 DNS 캐시 사이트로 확인
# whatsmydns.net에서 여러 네임서버의 응답 확인
# 3. TTL이 높으면 낮춤
# DNS 제공자에서 TTL을 300초로 낮추기
# 4. 강제 갱신
# Windows: ipconfig /flushdns
# Mac: sudo dscacheutil -flushcache
# Linux: sudo systemctl restart systemd-resolved
느린 연결 문제
# 1. RTT 측정
ping example.com
# 2. 해석 시간 확인
dig example.com
# 3. DNS 서버 변경
# /etc/resolv.conf (Linux)
nameserver 8.8.8.8
nameserver 8.8.4.4
# 4. 성능 재측정
curl -w 'Total time: %{time_total}s
' example.com
정리
네트워크 기초의 핵심:
- DNS: 도메인 이름을 IP로 변환 (캐시가 중요)
- TCP: 신뢰할 수 있는 연결 (3-way handshake)
- TLS: 암호화된 통신 (1.3이 더 빠름)
- HTTP: 애플리케이션 프로토콜 (버전이 성능에 영향)
- CDN: 콘텐츠 배포 네트워크 (캐시 설정이 중요)
이 기础를 이해하면, 네트워크 문제를 빠르게 진단하고 해결할 수 있다.