🌍 네트워크

Bandwidth

대역폭

네트워크가 전송할 수 있는 최대 데이터량. Mbps, Gbps로 측정.

📖 상세 설명

대역폭(Bandwidth)은 네트워크 연결이 일정 시간 동안 전송할 수 있는 최대 데이터량을 의미합니다. 흔히 "고속도로의 차선 수"에 비유됩니다. 차선이 많을수록(대역폭이 클수록) 더 많은 차량(데이터)이 동시에 통과할 수 있습니다. 단위로는 bps(bits per second), Mbps(Megabits per second), Gbps(Gigabits per second)를 사용합니다.

대역폭과 자주 혼동되는 개념이 처리량(Throughput)입니다. 대역폭이 "이론적 최대 전송 용량"이라면, 처리량은 "실제로 전송된 데이터량"입니다. 100Mbps 회선이라도 네트워크 혼잡, 패킷 손실, 프로토콜 오버헤드 등으로 실제 처리량은 70~80Mbps 정도가 일반적입니다. 대역폭은 파이프의 굵기, 처리량은 실제로 흐르는 물의 양이라고 생각하면 됩니다.

네트워크 병목(Bottleneck)은 전체 시스템의 대역폭이 특정 구간의 제한된 대역폭에 의해 좌우되는 현상입니다. 예를 들어, 1Gbps 서버와 1Gbps 클라이언트가 있어도 중간 라우터가 100Mbps만 지원하면 전체 전송 속도는 100Mbps로 제한됩니다. 네트워크 최적화의 핵심은 이런 병목 구간을 찾아 해결하는 것입니다.

현대 클라우드 환경에서 대역폭 모니터링은 필수입니다. AWS CloudWatch, Grafana, Prometheus 등을 통해 실시간으로 대역폭 사용량을 추적하고, 병목 현상을 조기에 감지합니다. 특히 AI/ML 워크로드에서 대용량 데이터셋 전송, 분산 학습 시 GPU 간 통신 등에서 대역폭이 성능의 핵심 요소가 됩니다.

📊 Bandwidth vs Throughput 비교

구분 Bandwidth (대역폭) Throughput (처리량)
정의 이론적 최대 전송 용량 실제로 전송된 데이터량
비유 파이프의 굵기 / 고속도로 차선 수 실제로 흐르는 물의 양 / 통과하는 차량 수
측정 시점 네트워크 설계 시 고정값 실시간으로 변동
영향 요소 물리적 회선, 장비 스펙 혼잡도, 패킷 손실, 지연, 프로토콜 오버헤드
예시 1Gbps 이더넷 회선 실제 전송 속도 850Mbps

💻 코드 예제

import psutil
import time
import speedtest  # pip install speedtest-cli

# 실시간 네트워크 대역폭 모니터링
def monitor_bandwidth(interval=1):
    """초당 네트워크 사용량 모니터링"""
    old_value = psutil.net_io_counters()

    while True:
        time.sleep(interval)
        new_value = psutil.net_io_counters()

        # 초당 전송량 계산 (bytes → Mbps)
        sent_mbps = (new_value.bytes_sent - old_value.bytes_sent) * 8 / 1_000_000
        recv_mbps = (new_value.bytes_recv - old_value.bytes_recv) * 8 / 1_000_000

        print(f"↑ Upload: {sent_mbps:.2f} Mbps | ↓ Download: {recv_mbps:.2f} Mbps")
        old_value = new_value

# 인터넷 속도 테스트 (대역폭 측정)
def test_bandwidth():
    """speedtest.net으로 실제 대역폭 측정"""
    st = speedtest.Speedtest()
    st.get_best_server()

    download_speed = st.download() / 1_000_000  # Mbps
    upload_speed = st.upload() / 1_000_000      # Mbps
    ping = st.results.ping

    print(f"Download: {download_speed:.2f} Mbps")
    print(f"Upload: {upload_speed:.2f} Mbps")
    print(f"Ping: {ping:.2f} ms")
    return download_speed, upload_speed

# 대역폭 단위 변환
def convert_bandwidth(value, from_unit, to_unit):
    """대역폭 단위 변환 (bps, Kbps, Mbps, Gbps)"""
    units = {'bps': 1, 'Kbps': 1e3, 'Mbps': 1e6, 'Gbps': 1e9}
    bps = value * units[from_unit]
    return bps / units[to_unit]

# 사용 예시
print(f"1 Gbps = {convert_bandwidth(1, 'Gbps', 'Mbps')} Mbps")
print(f"100 Mbps = {convert_bandwidth(100, 'Mbps', 'Kbps')} Kbps")
# iperf3 - 네트워크 대역폭 측정 (서버-클라이언트)
# 서버 측에서 실행
iperf3 -s

# 클라이언트에서 테스트
iperf3 -c 192.168.1.100              # TCP 테스트 (기본)
iperf3 -c 192.168.1.100 -u -b 1G     # UDP 1Gbps 테스트
iperf3 -c 192.168.1.100 -P 4         # 4개 병렬 스트림
iperf3 -c 192.168.1.100 -R           # 역방향 테스트 (다운로드)

# speedtest-cli - 인터넷 속도 테스트
speedtest-cli
speedtest-cli --simple              # 간단 출력
speedtest-cli --json                # JSON 형식 출력

# nload - 실시간 대역폭 모니터링
nload eth0                          # 특정 인터페이스 모니터링

# vnstat - 대역폭 사용량 통계
vnstat                              # 일별 통계
vnstat -h                           # 시간별 통계
vnstat -l                           # 실시간 모니터링

# iftop - 연결별 대역폭 사용량
sudo iftop -i eth0                  # 인터페이스별 트래픽 확인

# 네트워크 인터페이스 대역폭 확인
ethtool eth0 | grep Speed           # 링크 속도 확인
cat /sys/class/net/eth0/speed       # 현재 대역폭 (Mbps)

# tc (traffic control) - 대역폭 제한 테스트
# 대역폭을 1Mbps로 제한
sudo tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
# 제한 해제
sudo tc qdisc del dev eth0 root
// 브라우저에서 대역폭 측정 (Network Information API)
if ('connection' in navigator) {
    const conn = navigator.connection;
    console.log(`예상 대역폭: ${conn.downlink} Mbps`);
    console.log(`연결 타입: ${conn.effectiveType}`);  // 4g, 3g, 2g, slow-2g
    console.log(`RTT: ${conn.rtt} ms`);

    // 연결 변경 감지
    conn.addEventListener('change', () => {
        console.log(`대역폭 변경: ${conn.downlink} Mbps`);
    });
}

// 파일 다운로드로 실제 대역폭 측정
async function measureBandwidth(testUrl, fileSizeBytes) {
    const startTime = performance.now();

    const response = await fetch(testUrl, { cache: 'no-store' });
    await response.blob();

    const endTime = performance.now();
    const durationSeconds = (endTime - startTime) / 1000;

    // bits per second → Mbps
    const bps = (fileSizeBytes * 8) / durationSeconds;
    const mbps = bps / 1_000_000;

    console.log(`측정된 대역폭: ${mbps.toFixed(2)} Mbps`);
    return mbps;
}

// Node.js - 서버 대역폭 모니터링
const os = require('os');

function getNetworkStats() {
    const interfaces = os.networkInterfaces();
    const stats = {};

    for (const [name, addrs] of Object.entries(interfaces)) {
        stats[name] = addrs.filter(a => a.family === 'IPv4');
    }
    return stats;
}

// 데이터 전송량 단위 변환
function formatBandwidth(bps) {
    if (bps >= 1e9) return `${(bps / 1e9).toFixed(2)} Gbps`;
    if (bps >= 1e6) return `${(bps / 1e6).toFixed(2)} Mbps`;
    if (bps >= 1e3) return `${(bps / 1e3).toFixed(2)} Kbps`;
    return `${bps.toFixed(2)} bps`;
}

console.log(formatBandwidth(1500000000));  // 1.50 Gbps

🗣️ 실무에서 이렇게 말하세요

💬 성능 이슈 미팅에서
"데이터베이스 복제 지연이 발생하는데, 네트워크 대역폭이 병목인 것 같습니다. 현재 1Gbps 회선인데 실제 처리량이 900Mbps 가까이 나오고 있어요. 10Gbps로 업그레이드하거나, 복제 데이터를 압축해서 전송하는 방안을 검토해봐야 할 것 같습니다."
💬 인프라 설계 회의에서
"AI 학습 클러스터의 GPU 간 통신에는 최소 25Gbps 이상의 대역폭이 필요합니다. 일반 이더넷으로는 분산 학습 시 대역폭 병목으로 GPU 활용률이 50% 이하로 떨어집니다. InfiniBand나 100Gbps NIC를 고려해야 합니다."
💬 면접에서
"대역폭과 처리량의 차이를 설명하면, 대역폭은 이론적 최대치이고 처리량은 실제 전송량입니다. 예를 들어 1Gbps 회선이라도 TCP 오버헤드, 혼잡 제어, 패킷 손실 등으로 실제 처리량은 약 940Mbps 정도가 현실적입니다. 모니터링 시에는 대역폭 사용률이 80%를 넘으면 확장을 고려합니다."

⚠️ 흔한 실수 & 주의사항

Mbps와 MBps 혼동

Mbps(Megabits per second)와 MBps(MegaBytes per second)는 8배 차이납니다. 100Mbps 회선의 실제 다운로드 속도는 약 12.5MB/s입니다. ISP는 Mbps를, 파일 전송은 MBps를 사용하므로 주의하세요.

대역폭만 보고 성능 판단

대역폭이 충분해도 지연(Latency)이 높으면 체감 성능이 나쁩니다. 특히 실시간 서비스(게임, 화상회의)는 대역폭보다 지연이 더 중요합니다. 둘 다 모니터링해야 합니다.

피크 트래픽 대비 미흡

평균 대역폭 사용률이 30%라도 피크 시간대에 100%에 도달하면 서비스가 지연됩니다. 버스트 트래픽을 고려해 여유분을 확보하고, 95th percentile 기준으로 용량을 계획하세요.

올바른 대역폭 관리 방법

대역폭 사용률 80% 이상 시 경고 알림 설정. Prometheus + Grafana로 실시간 모니터링. QoS(Quality of Service)로 중요 트래픽 우선순위 부여. 정기적으로 iperf3 등으로 실제 처리량 테스트.

🔗 관련 용어

📚 더 배우기