KR_Net_Packet_Analysis - somaz94/DevOps-Engineer GitHub Wiki

넀튞워크 팚킷 분석 & 튞러랔슈팅 (Q19-Q23)

팚킷 분석 & 튞러랔슈팅 (19~25번)


Q19. Ethernet Frame, IP Packet, TCP Segment의 헀더 구조륌 섀명하고 싀제 팚킷 분석 방법은?

계잵별 캡슐화 구조:

┌─────────────────────────────────────────────────────────┐
│ Ethernet Frame (Layer 2)                                │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ IP Packet (Layer 3)                                 │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ TCP Segment (Layer 4)                           │ │ │
│ │ │ ┌─────────────────────────────────────────────┐ │ │ │
│ │ │ │ Application Data (Layer 7)                  │ │ │ │
│ │ │ └─────────────────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘

Ethernet Frame 구조 (쎝 최소 64 bytes ~ 최대 1518 bytes):

┌──────────┬─────┬──────────┬──────────┬──────┬─────────┬─────┐
│ Preamble │ SFD │ Dst MAC  │ Src MAC  │ Type │ Payload │ FCS │
│ 7 bytes  │1 byte│ 6 bytes │ 6 bytes  │2 bytes│46-1500 │4 bytes│
└──────────┮─────┮──────────┮──────────┮──────┮─────────┮─────┘

Preamble: 10101010... (동Ʞ화 신혞)
SFD:      10101011 (Start Frame Delimiter)
Dst MAC:  목적지 MAC 죌소 (예: aa:bb:cc:dd:ee:ff)
Src MAC:  출발지 MAC 죌소
Type:     0x0800 (IPv4), 0x0806 (ARP), 0x86DD (IPv6)
Payload:  상위 계잵 데읎터 (최소 46 bytes - 팚딩 포핚)
FCS:      CRC-32 였류 검출 (Frame Check Sequence)

IP Packet 구조 (IPv4, 최소 20 bytes):

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
┌───────┬───────┬───────────────┬───────────────────────────────┐
│Version│  IHL  │   TOS/DSCP    │         Total Length          │
│ (4)   │ (4)   │   (8 bits)    │         (16 bits)             │
├───────────────────────────────┌───┬────────────────────────────
│        Identification         │Flg│    Fragment Offset        │
│         (16 bits)             │(3)│       (13 bits)           │
├───────────────┬───────────────┌────────────────────────────────
│      TTL      │   Protocol    │      Header Checksum          │
│   (8 bits)    │   (8 bits)    │         (16 bits)             │
├───────────────┎───────────────┎────────────────────────────────
│                    Source IP Address                          │
│                      (32 bits)                                │
├────────────────────────────────────────────────────────────────
│                 Destination IP Address                        │
│                      (32 bits)                                │
├────────────────────────────────────────────────────────────────
│                Options (if IHL > 5)                           │
└───────────────────────────────────────────────────────────────┘

Version:    4 (IPv4)
IHL:        Header Length (5 = 20 bytes, 최대 15 = 60 bytes)
TOS/DSCP:   Quality of Service (우선순위)
Total Len:  헀더 + 데읎터 전첎 Ꞟ읎
ID:         당펾화 시 팚킷 식별
Flags:      bit 0: Reserved (0)
            bit 1: DF (Don't Fragment)
            bit 2: MF (More Fragments)
TTL:        팚킷 수명 (홉마닀 1 감소, 0읎 되멎 폐Ʞ)
Protocol:   6 (TCP), 17 (UDP), 1 (ICMP)
Checksum:   IP 헀더 였류 검출

TCP Segment 구조 (최소 20 bytes):

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
┌───────────────────────────────┬───────────────────────────────┐
│         Source Port           │      Destination Port         │
│         (16 bits)             │         (16 bits)             │
├───────────────────────────────┎────────────────────────────────
│                      Sequence Number                          │
│                        (32 bits)                              │
├────────────────────────────────────────────────────────────────
│                  Acknowledgment Number                        │
│                        (32 bits)                              │
├───────┬───────┬─┬─┬─┬─┬─┬─┬─┬─┬────────────────────────────────
│ Offset│ Res.  │C│E│U│A│P│R│S│F│        Window Size            │
│ (4)   │ (3)   │W│C│R│C│S│S│Y│I│         (16 bits)             │
│       │       │R│E│G│K│H│T│N│N│                               │
├───────┎───────┎─┎─┎─┎─┎─┎─┎─┎─┎────────────────────────────────
│           Checksum            │      Urgent Pointer           │
│         (16 bits)             │         (16 bits)             │
├───────────────────────────────┎────────────────────────────────
│                    Options (if Offset > 5)                    │
│                       (variable)                              │
└───────────────────────────────────────────────────────────────┘

Seq Number:   데읎터의 첫 바읎튞 위치
Ack Number:   닀음에 받을 데읎터의 위치
Flags:
  - CWR (Congestion Window Reduced): 혌잡 윈도우 감소
  - ECE (ECN-Echo): 혌잡 알늌
  - URG (Urgent): ꞎ꞉ 데읎터
  - ACK (Acknowledgment): 확읞 응답
  - PSH (Push): 슉시 전달
  - RST (Reset): 연결 강제 종료
  - SYN (Synchronize): 연결 시작
  - FIN (Finish): 연결 종료
Window Size: 수신 버퍌 크Ʞ (Flow Control)

싀제 팚킷 분석 (tcpdump):

# HTTP GET 요청 캡처
sudo tcpdump -i eth0 -nn -X 'tcp port 80 and host example.com'

출력:
14:30:15.123456 IP 192.168.1.10.54321 > 93.184.216.34.80: Flags [S], seq 1234567890
        0x0000:  4500 003c 1c46 4000 4006 b1e6 c0a8 010a  E..<.F@.@.......
        0x0010:  5db8 d822 d431 0050 499d 162a 0000 0000  ]..".1.PI..*....
        0x0020:  a002 7210 e32d 0000 0204 05b4 0402 080a  ..r..-..........
        
분석:
0x4500: Version=4, IHL=5, TOS=00
0x003c: Total Length = 60 bytes
0x1c46: Identification
0x4000: Flags=DF (Don't Fragment)
0x40:   TTL = 64
0x06:   Protocol = TCP (6)
0xc0a8010a: Source IP = 192.168.1.10
0x5db8d822: Dest IP = 93.184.216.34
0xd431: Source Port = 54321
0x0050: Dest Port = 80
0xa002: Flags = SYN, Window Size = 7210

Wireshark 디슀플레읎 필터:

TCP 3-Way Handshake:
tcp.flags.syn==1 && tcp.flags.ack==0    # SYN
tcp.flags.syn==1 && tcp.flags.ack==1    # SYN-ACK
tcp.flags.syn==0 && tcp.flags.ack==1 && tcp.seq==1  # ACK

HTTP 요청:
http.request.method == "GET"
http.response.code == 200

재전송 팚킷:
tcp.analysis.retransmission

느며 응답:
tcp.time_delta > 0.1

팚킷 손싀:
tcp.analysis.lost_segment

Q20. MTU/MSS 불음치로 읞한 팚킷 당펾화 묞제와 PMTUD 동작 원늬는?

MTU vs MSS:

MTU (Maximum Transmission Unit):
┌─────────────────────────────────────────────┐
│ Ethernet Header (14) │ IP Packet (1500) │ FCS (4) │
└─────────────────────────────────────────────┘
                        ↑
                   MTU = 1500 bytes

MSS (Maximum Segment Size):
┌──────────────────────────────────────────────────────┐
│ IP Header (20) │ TCP Header (20) │ TCP Data (1460) │
└──────────────────────────────────────────────────────┘
                                    ↑
                               MSS = 1460 bytes

공식: MSS = MTU - IP Header(20) - TCP Header(20)

음반적읞 MTU 값:

Ethernet:           1500 bytes
802.1Q VLAN:        1504 bytes (VLAN tag 4 bytes)
PPPoE:              1492 bytes (PPPoE header 8 bytes)
VPN (IPsec):        1400 bytes (암혞화 였버헀드 앜 100 bytes)
GRE Tunnel:         1476 bytes (GRE header 24 bytes)
VXLAN:              1450 bytes (VXLAN header 50 bytes)
Jumbo Frame:        9000 bytes (데읎터섌터)

팚킷 당펾화 묞제:

시나늬였: Client MTU=1500, 쀑간 겜로 MTU=1400

Client → Router1 (MTU 1500) → Router2 (MTU 1400) → Server

1. Client: 1500 bytes 팚킷 전송
2. Router2: MTU 쎈곌, 당펾화 필요
   
DF Flag = 0 (당펾화 허용):
   Original: [IP Header | 1480 bytes data]
   Fragment1: [IP Header | 1380 bytes | MF=1]
   Fragment2: [IP Header | 100 bytes | MF=0]
   
DF Flag = 1 (당펾화 ꞈ지):
   Router2: ICMP "Fragmentation Needed" 전송
   팚킷 폐Ʞ

PMTUD (Path MTU Discovery) 동작:

1. Client: DF 플래귞 섀정하여 1500 bytes 팚킷 전송
   
2. MTU 1400 띌우터 도달:
   → ICMP Type 3 Code 4 (Fragmentation Needed and DF set) 응답
   → Next-Hop MTU: 1400
   
3. Client: MTU륌 1400윌로 조정
   → 1400 bytes 팚킷 재전송
   
4. 겜로상 몚든 구간 통곌 성공
   → Path MTU = 1400 확정
   
5. TCP Connection에 MSS 조정:
   MSS = 1400 - 20(IP) - 20(TCP) = 1360 bytes

PMTUD 싀습:

# Ping윌로 MTU 테슀튞
ping -M do -s 1472 8.8.8.8
# -M do: DF 플래귞 섀정
# -s 1472: 1472 bytes 데읎터 (1500 - 20 IP - 8 ICMP)

성공: 1472 bytes 전송 가능 → MTU 1500
싀팚: ICMP "Frag needed" → MTU < 1500

# Binary Search로 Path MTU ì°Ÿêž°
ping -M do -s 1400 8.8.8.8  # 성공
ping -M do -s 1450 8.8.8.8  # 성공
ping -M do -s 1470 8.8.8.8  # 싀팚
ping -M do -s 1460 8.8.8.8  # 성공
→ Path MTU = 1488 (1460 + 20 IP + 8 ICMP)

PMTUD Black Hole 묞제:

묞제: 방화벜읎 ICMP "Fragmentation Needed" 찚닚
      
Client ─── Router (MTU 1400, ICMP 찚닚) ─── Server
  │                                           │
  └──── 1500 bytes (DF=1) ────X (폐Ʞ)       │
  │                                           │
  └──── ICMP 응답 Ʞ닀늌 ────X (타임아웃)    │
  │                                           │
  └──── 재전송 ────X (반복)                  │

결곌: 연결 불가 또는 극도로 느늌

핎결 방법:

1. TCP MSS Clamping (권장):

# iptables로 MSS 강제 조정
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
         -j TCPMSS --set-mss 1360

# Cisco 띌우터
interface GigabitEthernet0/0
 ip tcp adjust-mss 1360

원늬:
SYN 팚킷의 MSS 옵션을 강제로 낮춀
→ 양쪜 몚두 작은 섞귞뚌튞 사용
→ 당펾화 발생 안 핹

2. MTU 수동 조정:

# Linux
ip link set dev eth0 mtu 1400

# Windows
netsh interface ipv4 set subinterface "Ethernet" mtu=1400

# 영구 섀정 (Linux /etc/network/interfaces)
auto eth0
iface eth0 inet dhcp
    mtu 1400

3. PLPMTUD (Packetization Layer PMTUD):

TCP의 자첎 PMTUD (RFC 4821):
- ICMP에 의졎하지 않음
- Probe 팚킷윌로 MTU 탐색
- 더 안정적읎지만 느늌

VPN 환겜 MSS 계산:

IPsec VPN:
Physical MTU:     1500
IPsec Overhead:   ~100 (ESP header, IV, Padding, Auth)
Effective MTU:    1400
TCP MSS:          1400 - 20(IP) - 20(TCP) = 1360

VXLAN:
Physical MTU:     1500
VXLAN Overhead:   50 (Outer Ethernet 14 + Outer IP 20 + Outer UDP 8 + VXLAN 8)
Effective MTU:    1450
TCP MSS:          1450 - 20 - 20 = 1410

몚니터링:

# 당펾화된 팚킷 확읞
tcpdump -i eth0 'ip[6:2] & 0x3fff != 0'

# Path MTU 확읞 (Linux)
ip route get 8.8.8.8 | grep mtu

# TCP MSS 확읞 (Wireshark)
tcp.options.mss

Q21. tcpdump와 Wireshark륌 활용한 넀튞워크 튞러랔슈팅 싀전 시나늬였는?

시나늬였 1: 느며 웹사읎튞 응답

슝상: 웹페읎지 로딩읎 5쎈 읎상 소요

tcpdump 캡처:

# 80 포튞 HTTP 튞래픜 캡처, 타임슀탬프 마읎크로쎈 닚위
sudo tcpdump -i eth0 -nn -tttt -s 65535 'tcp port 80' -w slow-web.pcap

# 싀시간 분석 (타임슀탬프 포핚)
sudo tcpdump -i eth0 -nn -tttt 'host example.com and tcp port 80'

출력:
2024-01-15 14:30:00.123456 IP 192.168.1.10.54321 > 93.184.216.34.80: Flags [S]
2024-01-15 14:30:00.323456 IP 93.184.216.34.80 > 192.168.1.10.54321: Flags [S.]
                           ↑ 200ms 지연 (SYN-ACK)
2024-01-15 14:30:00.323789 IP 192.168.1.10.54321 > 93.184.216.34.80: Flags [.]
2024-01-15 14:30:00.324567 IP 192.168.1.10.54321 > 93.184.216.34.80: ... HTTP GET
2024-01-15 14:30:05.123456 IP 93.184.216.34.80 > 192.168.1.10.54321: ... HTTP 200
                           ↑ 4.8쎈 지연 (서버 응답)

Wireshark 분석:

1. Statistics → Conversations → TCP
   → Duration 4.8쎈, Bytes 확읞

2. Statistics → I/O Graph
   → 시간대별 튞래픜 시각화
   → 응답 대Ʞ 구간 확읞

3. Display Filter:
   tcp.time_delta > 1.0
   → 1쎈 읎상 지연 팚킷만 필터링

4. Expert Info (Analyze → Expert Information)
   → "TCP Window Full" 겜고 확읞
   → 서버 윈도우 크Ʞ 부족 (수신 버퍌 작음)

원읞: 서버 TCP Window Size 부족 (16KB) 핎결: 서버 수신 버퍌 슝가

sysctl -w net.ipv4.tcp_rmem='4096 87380 6291456'

시나늬였 2: 간헐적읞 팚킷 손싀

슝상: VoIP 통화 품질 저하, 끊김 현상

tcpdump 캡처:

# RTP 튞래픜 캡처 (음반적윌로 UDP 10000-20000 포튞)
sudo tcpdump -i eth0 -nn -s 65535 'udp portrange 10000-20000' -w voip.pcap

# Packet Loss 계산
sudo tcpdump -i eth0 -nn 'udp port 10000' | \
  awk '{print $NF}' | \
  awk -F. '{if (prev && $1-prev!=1) print "Lost:", prev+1, "to", $1-1; prev=$1}'

Wireshark 분석:

1. Telephony → RTP → RTP Streams
   → Packet Loss: 3.5% (정상 < 1%)
   → Jitter: 50ms (정상 < 30ms)

2. Display Filter:
   rtp
   → RTP Sequence Number 확읞
   → 슝가 팚턎에서 누띜 탐지

3. I/O Graph:
   Y Axis: SUM(rtp.timestamp)
   → 균음하지 않은 팹턮 = Jitter

4. Expert Info:
   → "Out-of-Order" 겜고 닀수

원읞 추가 분석:

# 넀튞워크 읞터페읎슀 에러 확읞
ethtool -S eth0 | grep -E 'err|drop|fifo'
rx_dropped: 12345  ← 수신 버퍌 였버플로우
tx_errors: 678     ← 송신 에러

# 읞터페읎슀 통계
ip -s link show eth0
RX errors 12345

# 시슀템 로귞
dmesg | grep -i 'network\|eth0'
[  123.456] eth0: RX buffer overflow

핎결:

# Ring Buffer 크Ʞ 슝가
ethtool -G eth0 rx 4096 tx 4096

# QoS 섀정 (VoIP 우선순위)
tc qdisc add dev eth0 root handle 1: prio bands 3
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
   match ip dport 10000 0xffff flowid 1:1

시나늬였 3: TCP 재전송 폭슝

슝상: 애플늬쌀읎션 응답 지연, CPU 사용률 정상

tcpdump 팹턮 분석:

# 재전송 팚킷 캡처
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 or \
  (tcp[13] & 0x07 != 0)' -w retrans.pcap

# SYN Flood 감지
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] == tcp-syn' | \
  awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -nr | head
  
출력:
  5432 192.168.1.100  ← 비정상적윌로 많은 SYN
   234 192.168.1.101
   123 192.168.1.102

Wireshark Expert Analysis:

1. Statistics → TCP StreamGraph → Time-Sequence (Stevens)
   → 수평 띌읞 닀수 = 재전송 대Ʞ

2. Display Filter:
   tcp.analysis.retransmission
   tcp.analysis.fast_retransmission
   tcp.analysis.duplicate_ack

3. 재전송 비윚:
   Statistics → Protocol Hierarchy
   → TCP Retransmission: 15% (정상 < 3%)

4. Follow TCP Stream:
   → 3-Way Handshake 후 RST
   → SYN Flood 공격 의심

공격 확읞:

# 반쯀 엎늰 연결 수 확읞
netstat -an | grep SYN_RECV | wc -l
12345  ← 비정상 (정상 < 100)

# SYN Cookie 활성화 (임시 ë°©ì–Ž)
sysctl -w net.ipv4.tcp_syncookies=1

# 연결 타임아웃 닚축
sysctl -w net.ipv4.tcp_synack_retries=1

# iptables Rate Limiting
iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

시나늬였 4: DNS 쿌늬 싀팚

tcpdump DNS 분석:

# DNS 쿌늬/응답 캡처
sudo tcpdump -i eth0 -nn -s 65535 'udp port 53' -w dns-issue.pcap

# 싀시간 몚니터링
sudo tcpdump -i eth0 -nn 'port 53'

출력:
14:30:00.123 IP 192.168.1.10.54321 > 8.8.8.8.53: 12345+ A? example.com
14:30:05.123 IP 192.168.1.10.54321 > 8.8.8.8.53: 12345+ A? example.com
                                                 ↑ 5쎈 후 재시도
(응답 없음)

Wireshark 분석:

1. Display Filter:
   dns.flags.response == 0 && !dns.flags.response == 1
   → 응답 없는 쿌늬만 필터링

2. Statistics → DNS
   → Query Rate: 100/s
   → Response Rate: 0/s
   → 100% 손싀

3. Follow UDP Stream:
   → DNS 서버 방화벜 찚닚 확읞
   → ICMP "Port Unreachable" 수신

묞제 진닚:

# DNS 서버 연결 테슀튞
dig @8.8.8.8 example.com +trace

# 방화벜 확읞
sudo iptables -L -n -v | grep -i dns
0     0 DROP       udp  --  *      *       0.0.0.0/0    8.8.8.8     udp dpt:53

# 대첎 DNS 테슀튞
dig @1.1.1.1 example.com  # Cloudflare DNS 정상

핎결:

# 방화벜 규칙 수정
iptables -D OUTPUT -p udp --dport 53 -d 8.8.8.8 -j DROP
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# /etc/resolv.conf 업데읎튞
nameserver 1.1.1.1
nameserver 8.8.8.8

유용한 tcpdump 필터:

# HTTP 요청만
tcpdump -i eth0 -A 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420)'
                                    # GET 묞자엎 (0x47455420)

# SYN 팚킷만
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'

# RST 팚킷만
tcpdump -i eth0 'tcp[tcpflags] & tcp-rst != 0'

# 특정 MAC 죌소
tcpdump -i eth0 ether host aa:bb:cc:dd:ee:ff

# VLAN 태귞
tcpdump -i eth0 'vlan and host 192.168.1.10'

# 큰 팚킷 (1400 bytes 읎상)
tcpdump -i eth0 'ip[2:2] > 1400'

# ICMP Redirect
tcpdump -i eth0 'icmp[icmptype] == 5'

Wireshark 고꞉ 필터:

# TCP Window가 0읞 팚킷 (흐멄 제얎)
tcp.window_size == 0

# TCP Zero Window Probe
tcp.analysis.zero_window_probe

# Delayed ACK
tcp.analysis.ack_rtt > 0.2

# TCP Out-of-Order
tcp.analysis.out_of_order

# HTTP 특정 User-Agent
http.user_agent contains "bot"

# SSL/TLS Handshake 싀팚
ssl.alert_message.desc == 40  # Handshake Failure

Q22. TCP Congestion Control 알고늬슘곌 Window Scaling의 동작 원늬는?

TCP Flow Control vs Congestion Control:

Flow Control (흐멄 제얎):
- 목적: 수신자 버퍌 였버플로우 방지
- 메컀니슘: TCP Window Size (Receiver Advertised Window)
- 범위: Point-to-Point (송신자 ↔ 수신자)

Congestion Control (혌잡 제얎):
- 목적: 넀튞워크 혌잡 방지
- 메컀니슘: Congestion Window (cwnd)
- 범위: End-to-End (전첎 겜로)

TCP Congestion Control 상태 ëšžì‹ :

┌─────────────────────────────────────────────────────────┐
│                    Slow Start                           │
│  cwnd: 1 MSS → 2 → 4 → 8 → 16 ... (Exponential)        │
│  ë§€ ACK마닀 cwnd += 1 MSS                               │
└────────────────┬────────────────────────────────────────┘
                 │ cwnd >= ssthresh (Slow Start Threshold)
                 ↓
┌─────────────────────────────────────────────────────────┐
│              Congestion Avoidance                       │
│  cwnd 슝가: Linear (ë§€ RTT마닀 1 MSS)                  │
│  ë§€ ACK마닀 cwnd += MSS * MSS / cwnd                    │
└────────────────┬────────────────────────────────────────┘
                 │ Packet Loss 감지
                 ↓
         ┌───────┮────────┐
         │                │
    3 Dup ACK        Timeout
         │                │
         ↓                ↓
┌─────────────┐  ┌──────────────────┐
│ Fast        │  │ Slow Start       │
│ Recovery    │  │ (처음부터 재시작)│
│ ssthresh=   │  │ ssthresh=        │
│  cwnd/2     │  │  cwnd/2          │
│ cwnd=       │  │ cwnd= 1 MSS      │
│  ssthresh+3 │  │                  │
└─────────────┘  └──────────────────┘

구첎적읞 예시:

쎈Ʞ 상태:
cwnd = 1 MSS (1460 bytes)
ssthresh = 64 KB
RTT = 100ms

Round 1 (Slow Start):
- 1 MSS 전송 → ACK 수신 → cwnd = 2 MSS

Round 2:
- 2 MSS 전송 → 2 ACK 수신 → cwnd = 4 MSS

Round 3:
- 4 MSS 전송 → 4 ACK 수신 → cwnd = 8 MSS

...

Round 7:
- cwnd = 64 MSS = 93,440 bytes
- cwnd >= ssthresh → Congestion Avoidance 전환

Round 8 (Congestion Avoidance):
- 64 MSS 전송 → 64 ACK 수신
- cwnd += 64 * 1460 / 93440 = 1 MSS
- cwnd = 65 MSS

Round 9:
- cwnd = 66 MSS (Linear 슝가)

Round 15:
- Packet Loss (3 Duplicate ACK)
- Fast Retransmit 싀행
- ssthresh = cwnd / 2 = 36 MSS
- cwnd = ssthresh + 3 = 39 MSS
- Fast Recovery 진입

죌요 Congestion Control 알고늬슘:

1. Reno (Classic):

- Fast Retransmit: 3 Duplicate ACK → 슉시 재전송
- Fast Recovery: cwnd륌 절반윌로 쀄읎고 Congestion Avoidance
- Timeout: cwnd = 1, Slow Start 재시작

2. Cubic (Linux Ʞ볞값):

- Window 슝가가 Cubic 핚수 따멄
- Loss 발생 지점(Wmax)을 êž°ì–µ
- Wmax 귌처에서 신쀑하게 슝가
- 고속 넀튞워크(Long Fat Network)에 최적화

K = cubic_root((Wmax - cwnd) / C)
cwnd = C * (t - K)³ + Wmax

장점: RTT가 Ꞟ얎도 빠륞 대역폭 활용

3. BBR (Bottleneck Bandwidth and RTT):

- Google 개발 (2016)
- Loss Ʞ반읎 아닌 Bandwidth와 RTT 잡정 êž°ë°˜
- 4가지 상태: Startup, Drain, ProbeBW, ProbeRTT

장점:
- 버퍌 랔로튞(Bufferbloat) 핎결
- Packet Loss 환겜에서도 안정적
- YouTube, Google Cloud 등에서 사용

sysctl -w net.ipv4.tcp_congestion_control=bbr

TCP Window Scaling (RFC 1323):

묞제:

TCP Window Size 필드: 16 bits → 최대 65,535 bytes
고속 넀튞워크 (1 Gbps, RTT 100ms):
- BDP (Bandwidth-Delay Product) = 1Gbps * 100ms = 12.5 MB
- Ʞ볞 Window Size로는 처늬량 제한
  Throughput = Window Size / RTT = 65KB / 0.1s = 650 KB/s
  → 1 Gbps 회선에서 5 Mbps만 활용

핎결: Window Scale Option

TCP SYN 팚킷에 포핚:
┌────────────────────────────────┐
│ Option Kind: 3 (Window Scale)  │
│ Option Length: 3               │
│ Shift Count: 7                 │  ← 2^7 = 128 배 확장
└────────────────────────────────┘

싀제 Window Size = (TCP Header Window) << (Shift Count)
예: Header Window = 65,535
    Shift Count = 7
    Actual Window = 65,535 * 128 = 8,388,480 bytes (8 MB)

Window Scaling 확읞:

# tcpdump로 SYN 팚킷 확읞
sudo tcpdump -i eth0 -nn -vv 'tcp[tcpflags] & tcp-syn != 0'

출력:
IP 192.168.1.10.54321 > 93.184.216.34.80: Flags [S], seq 123, win 65535,
  options [mss 1460,nop,wscale 7,nop,nop,TS val 123 ecr 0,sackOK,eol]
                        ↑ wscale 7 = 128배 확장

# Wireshark 분석
tcp.options.wscale.shift
tcp.window_size_scalefactor

싀묎 섀정 (Linux):

# TCP 수신 버퍌 크Ʞ
sysctl -w net.ipv4.tcp_rmem='4096 87380 6291456'
            # min   default   max (6 MB)

# TCP 송신 버퍌 크Ʞ
sysctl -w net.ipv4.tcp_wmem='4096 16384 4194304'
            # min   default   max (4 MB)

# Window Scaling 활성화 (Ʞ볞값 1)
sysctl -w net.ipv4.tcp_window_scaling=1

# SACK (Selective Acknowledgment) 활성화
sysctl -w net.ipv4.tcp_sack=1

# Timestamps 활성화 (RTT 잡정)
sysctl -w net.ipv4.tcp_timestamps=1

# 처늬량 계산
# BDP = Bandwidth * RTT
# 1 Gbps * 100ms = 125 MB/s * 0.1s = 12.5 MB
# Window Size >= BDP

성능 잡정:

# iperf3로 처늬량 테슀튞
iperf3 -c server.example.com -t 60 -P 4

출력 (최적화 전):
[  5]   0.00-60.00  sec  5.12 GBytes  734 Mbits/sec  receiver
                                      ↑ Window Size 부족

# Window Scaling 후:
[  5]   0.00-60.00  sec  65.3 GBytes  9.35 Gbits/sec  receiver
                                      ↑ 거의 전첎 대역폭 활용

# cwnd 몚니터링
ss -i | grep -i cwnd
cubic wscale:7,7 rto:204 rtt:3.5/2 cwnd:10 send 33.1Mbps
      ↑ Window Scale  ↑ Congestion Window

Wireshark로 성능 묞제 진닚:

1. TCP Window Full:
   → 수신자 윈도우 크Ʞ 부족
   → 송신자가 대Ʞ핎알 핹
   tcp.analysis.window_full

2. TCP Zero Window:
   → 수신자 버퍌 가득 ì°ž
   → 송신 쀑닚
   tcp.window_size == 0

3. TCP Window Update:
   → 수신자가 윈도우 확장 알늌
   tcp.analysis.window_update

핎결:
- 수신 버퍌 크Ʞ 슝가
- Window Scaling 활성화
- 애플늬쌀읎션 처늬 속도 개선

Q23. 팚킷 캡처 시 BPF 필터 작성곌 성능 최적화 방법은?

BPF (Berkeley Packet Filter) 묞법:

Ʞ볞 구조:

[protocol] [direction] [type] [value]

protocol: ip, ip6, arp, tcp, udp, icmp
direction: src, dst, src and dst, src or dst
type: host, net, port, portrange

싀전 예제:

1. 특정 혞슀튞 간 통신:

# 양방향
tcpdump host 192.168.1.10

# 출발지만
tcpdump src host 192.168.1.10

# 목적지만
tcpdump dst host 192.168.1.10

# 두 혞슀튞 간 통신
tcpdump host 192.168.1.10 and host 192.168.1.20

2. 넀튞워크 범위:

# 서람넷
tcpdump net 192.168.1.0/24
tcpdump net 192.168.1.0 mask 255.255.255.0

# 여러 서람넷
tcpdump 'net 192.168.1.0/24 or net 10.0.0.0/8'

3. 포튞 필터링:

# 닚음 포튞
tcpdump port 80
tcpdump dst port 443

# 포튞 범위
tcpdump portrange 10000-20000

# 여러 포튞
tcpdump 'port 80 or port 443 or port 8080'

# 특정 포튞 제왞
tcpdump 'not port 22'

4. TCP 플래귞 필터:

# SYN 팚킷만
tcpdump 'tcp[tcpflags] & tcp-syn != 0'
tcpdump 'tcp[13] & 2 != 0'  # 동음 (13번짞 바읎튞, bit 1)

# SYN-ACK
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'
tcpdump 'tcp[13] == 18'  # SYN(2) + ACK(16) = 18

# FIN 팚킷
tcpdump 'tcp[tcpflags] & tcp-fin != 0'

# RST 팚킷
tcpdump 'tcp[tcpflags] & tcp-rst != 0'

# PSH-ACK (데읎터 전송)
tcpdump 'tcp[tcpflags] & (tcp-push|tcp-ack) == (tcp-push|tcp-ack)'

# ACK만 (SYN, FIN, RST 제왞)
tcpdump 'tcp[tcpflags] == tcp-ack'

5. IP 헀더 필터:

# TTL 특정 값
tcpdump 'ip[8] == 64'  # TTL = 64

# TTL < 10 (의심슀러욎 팚킷)
tcpdump 'ip[8] < 10'

# IP 옵션읎 있는 팚킷
tcpdump 'ip[0] & 0x0f > 5'  # IHL > 5 (옵션 졎재)

# DF (Don't Fragment) 플래귞
tcpdump 'ip[6] & 0x40 != 0'

# MF (More Fragments) 플래귞
tcpdump 'ip[6] & 0x20 != 0'

# 당펾화된 팚킷
tcpdump 'ip[6:2] & 0x1fff != 0'

# ToS/DSCP 값
tcpdump 'ip[1] & 0xfc == 0xb8'  # EF (Expedited Forwarding)

6. 페읎로드 검색:

# HTTP GET 요청
tcpdump -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
                                            # "GET " ASCII

# HTTP POST
tcpdump -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'
                                            # "POST"

# HTTP 응답 200
tcpdump -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450'
                                            # "HTTP"

# SSH 프로토윜 식별
tcpdump -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x5353482d'
                                            # "SSH-"

7. 복합 필터:

# 왞부 → 낎부 웹 튞래픜 (포튞 80, 443)
tcpdump 'dst net 192.168.0.0/16 and (port 80 or port 443)'

# SSH륌 제왞한 몚든 튞래픜
tcpdump 'not port 22'

# 특정 혞슀튞로의 DNS 쿌늬
tcpdump 'src host 192.168.1.10 and dst port 53'

# ICMP Echo Request/Reply
tcpdump 'icmp[icmptype] == 8 or icmp[icmptype] == 0'

# ARP 요청만
tcpdump 'arp[6:2] == 1'  # ARP opcode = 1 (request)

성능 최적화:

1. Capture Filter vs Display Filter:

# 좋음: Capture Filter (BPF, 컀널 레벚)
tcpdump -i eth0 'host 192.168.1.10'
→ 불필요한 팚킷은 캡처 안 핹
→ CPU/메몚늬 절앜

# 나쁚: 몚든 팚킷 캡처 후 필터링
tcpdump -i eth0 -w all.pcap
wireshark all.pcap  # Display Filter 사용
→ 디슀크 I/O 곌닀
→ 대용량 파음 생성

2. 슀냅샷 Ꞟ읎 최적화:

# 헀더만 필요한 겜우 (Ʞ볞값 262144)
tcpdump -i eth0 -s 96 'tcp'
# Ethernet(14) + IP(20) + TCP(20) + 옵션(42) = 96 bytes

# 전첎 팚킷 (페읎로드 분석 필요)
tcpdump -i eth0 -s 65535 'port 80'

# 최소 크Ʞ (헀더만)
tcpdump -i eth0 -s 0 'tcp'  # 0 = 전첎

3. 버퍌 크Ʞ 조정:

# Ʞ볞 버퍌: 2 MB
tcpdump -i eth0 -B 16384 'port 80'
# 16 MB 버퍌 (고속 넀튞워크)

# 드롭 팚킷 확읞
tcpdump -i eth0 -vv 'port 80'
^C
1000 packets captured
950 packets received by filter
50 packets dropped by kernel  ← 버퍌 부족

4. Ring Buffer 사용 (파음 로테읎션):

# 10MB 파음 5개 순환 (쎝 50MB)
tcpdump -i eth0 -C 10 -W 5 -w capture.pcap 'port 80'
# capture.pcap0, capture.pcap1, ..., capture.pcap4

# 시간 êž°ë°˜ 로테읎션 (5분마닀)
tcpdump -i eth0 -G 300 -w 'capture-%Y%m%d-%H%M%S.pcap'

5. 멀티윔얎 활용:

# CPU Affinity 섀정
taskset -c 0 tcpdump -i eth0 -w cpu0.pcap 'port 80'
taskset -c 1 tcpdump -i eth1 -w cpu1.pcap 'port 443'

# PF_RING (고성능 팚킷 캡처)
tcpdump -i eth0@1 -w capture.pcap  # PF_RING 채널 1

6. 싀시간 분석 vs 파음 저장:

# 싀시간 분석 (화멎 출력)
tcpdump -i eth0 -l 'port 80' | grep "GET"
# -l: Line Buffered (슉시 출력)

# 파음 저장 후 분석 (권장)
tcpdump -i eth0 -w capture.pcap 'port 80'
wireshark capture.pcap

7. 샘플링:

# 1/10 팚킷만 캡처 (통계 목적)
tcpdump -i eth0 -w capture.pcap \
  'tcp and (tcp[13] & 0x17 = 0x02) and (rand() % 10 = 0)'

고꞉ BPF 예제:

웹 튞래픜 분석:

# HTTP 헀더만 (첫 1024 bytes)
tcpdump -i eth0 -s 1024 -A 'tcp port 80 and (
  (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420) or
  (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450)
)'

# HTTPS ClientHello (TLS Handshake)
tcpdump -i eth0 '(tcp[((tcp[12:1] & 0xf0) >> 2)] = 0x16) and
  (tcp[((tcp[12:1] & 0xf0) >> 2) + 1] = 0x03) and
  (tcp[((tcp[12:1] & 0xf0) >> 2) + 5] = 0x01)'

볎안 분석:

# Port Scan 감지 (SYN만 많은 겜우)
tcpdump -i eth0 'tcp[tcpflags] == tcp-syn and src host 192.168.1.0/24'

# SYN Flood
tcpdump -i eth0 -nn -q 'tcp[tcpflags] == tcp-syn' | \
  awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | \
  awk '$1 > 100 {print "Possible SYN flood from", $2, "with", $1, "SYNs"}'

# DNS Amplification
tcpdump -i eth0 'udp port 53 and ip[2:2] > 512'

성능 테슀튞:

# 고속 넀튞워크 (10 Gbps)
# 음반 tcpdump: ~1 Gbps 처늬 가능
# PF_RING: ~10 Gbps
# DPDK: ~40 Gbps

# tcpdump 성능 잡정
time tcpdump -i eth0 -c 100000 -w /dev/null 'tcp'

real    0m2.345s
user    0m0.123s
sys     0m1.234s
→ ~42,000 pps (packets per second)

💡 용얎 섀명:



ì°žê³  자료

⚠ **GitHub.com Fallback** ⚠