#!/bin/bash
# 실습 #11 ① — iperf3 기본 (서버 -s / 클라이언트 -c / TCP / UDP / 양방향)
# VM 2대 또는 같은 호스트 두 셸로 진행. 한쪽은 서버, 한쪽은 클라이언트.
set -e

echo "=== 0) 도구 설치 ==="
sudo apt update
sudo apt install -y iperf3 jq

WORK=/tmp/lab11_iperf
mkdir -p "$WORK"

# ────────────────────────────────────────────────────────────────
# 사용법 안내
# ────────────────────────────────────────────────────────────────
cat <<'USAGE'

  ▶ 사용 시나리오
    Terminal A (서버):
        iperf3 -s
        # 5201/tcp 리스닝

    Terminal B (클라이언트, SERVER_IP 에 서버 IP 또는 127.0.0.1):
        SERVER_IP=10.20.0.10 bash setup_01_basic_tcp_udp.sh client

  ▶ 인자
    server  : 서버 모드로 실행 (포그라운드)
    client  : 클라이언트 6개 패턴 차례로 실행
    (없음)  : 안내만

USAGE

ROLE="${1:-}"
SERVER_IP="${SERVER_IP:-127.0.0.1}"

# ────────────────────────────────────────────────────────────────
# 서버 모드
# ────────────────────────────────────────────────────────────────
if [ "$ROLE" = "server" ]; then
    echo "▶ 서버 모드 — iperf3 -s  (5201/tcp 리스닝, Ctrl-C 로 종료)"
    # 방화벽 (ufw 활성화된 경우)
    if sudo ufw status 2>/dev/null | grep -q "Status: active"; then
        sudo ufw allow 5201/tcp comment 'iperf3' || true
        sudo ufw allow 5201/udp comment 'iperf3' || true
    fi
    exec iperf3 -s
fi

# ────────────────────────────────────────────────────────────────
# 클라이언트 모드 — 6개 패턴 차례 실행
# ────────────────────────────────────────────────────────────────
if [ "$ROLE" = "client" ]; then
    echo "▶ 클라이언트 → $SERVER_IP"

    echo
    echo "▶ [1] 기본 TCP 10초"
    iperf3 -c "$SERVER_IP" -t 10 || true

    echo
    echo "▶ [2] -t 30  (30초 측정)"
    iperf3 -c "$SERVER_IP" -t 30 -i 5 || true

    echo
    echo "▶ [3] -P 4   (4 병렬 스트림 — 단일 TCP 흐름 한계 우회)"
    iperf3 -c "$SERVER_IP" -t 15 -P 4 || true

    echo
    echo "▶ [4] -R     (Reverse — 서버→클라이언트, 다운로드 측정)"
    iperf3 -c "$SERVER_IP" -t 10 -R || true

    echo
    echo "▶ [5] --bidir (동시 양방향)"
    iperf3 -c "$SERVER_IP" -t 10 --bidir || true

    echo
    echo "▶ [6] UDP 100 Mbps (패킷 손실 + 지터 측정용)"
    iperf3 -c "$SERVER_IP" -u -b 100M -t 10 || true

    echo
    echo "▶ [7] --json → $WORK/result.json  (jq 후처리)"
    iperf3 -c "$SERVER_IP" -t 5 --json > "$WORK/result.json" || true
    jq '.end.sum_received | {bps: .bits_per_second, retransmits: .retransmits, secs: .seconds}' \
       "$WORK/result.json" 2>/dev/null || true
fi

# ────────────────────────────────────────────────────────────────
# 결과 해석
# ────────────────────────────────────────────────────────────────
cat <<'INTERP'

  ▶ 출력 컬럼 해석
    Bitrate     : 측정된 처리량 (bps / Mbps / Gbps)
    Retr        : TCP 재전송 횟수 (높으면 손실·혼잡)
    Cwnd        : TCP 혼잡 윈도우 크기
    Jitter      : UDP 지터 (ms, 낮을수록 좋음)
    Lost/Total  : UDP 손실 패킷 / 전체 패킷
    --bidir     : 양방향 동시. 절반-듀플렉스 회선에선 절반씩 분할됨

  ▶ TCP vs UDP 권장 사용
    TCP : 응용에 가까운 실제 처리량 (혼잡 제어 영향)
    UDP : 회선 자체의 한계 / 손실율 (혼잡 제어 없음)

INTERP
