TCP ν”„λ‘œν† μ½œ

TCP ν”„λ‘œν† μ½œ

κ°œμš”

이 λ¬Έμ„œμ—μ„œλŠ” TCP(Transmission Control Protocol)의 핡심 κ°œλ…μ„ λ‹€λ£Ήλ‹ˆλ‹€. μ—°κ²° μ§€ν–₯적이고 μ‹ λ’°μ„± μžˆλŠ” 데이터 전솑을 보μž₯ν•˜λŠ” TCP의 λ™μž‘ 원리, 헀더 ꡬ쑰, 흐름 μ œμ–΄, 혼작 μ œμ–΄ λ©”μ»€λ‹ˆμ¦˜μ„ ν•™μŠ΅ν•©λ‹ˆλ‹€.

λ‚œμ΄λ„: ⭐⭐⭐ μ˜ˆμƒ ν•™μŠ΅ μ‹œκ°„: 3-4μ‹œκ°„ μ„ μˆ˜ 지식: 09_Routing_Protocols.md


λͺ©μ°¨

  1. TCP의 νŠΉμ§•
  2. TCP 헀더 ꡬ쑰
  3. 3-Way Handshake
  4. 4-Way Handshake
  5. μ‹œν€€μŠ€ λ²ˆν˜Έμ™€ ACK
  6. 흐름 μ œμ–΄
  7. 혼작 μ œμ–΄
  8. μ—°μŠ΅ 문제
  9. λ‹€μŒ 단계
  10. 참고 자료

1. TCP의 νŠΉμ§•

1.1 TCP κΈ°λ³Έ νŠΉμ„±

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                       TCP νŠΉμ§•                                   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                  β”‚
β”‚  1. μ—°κ²° μ§€ν–₯ (Connection-Oriented)                             β”‚
β”‚     - 데이터 전솑 μ „ μ—°κ²° μ„€μ • ν•„μš” (3-way handshake)           β”‚
β”‚     - 전솑 μ™„λ£Œ ν›„ μ—°κ²° ν•΄μ œ (4-way handshake)                  β”‚
β”‚                                                                  β”‚
β”‚  2. μ‹ λ’°μ„± (Reliability)                                        β”‚
β”‚     - 데이터 전달 보μž₯                                          β”‚
β”‚     - μˆœμ„œ 보μž₯                                                 β”‚
β”‚     - 였λ₯˜ 감지 및 μž¬μ „μ†‘                                       β”‚
β”‚                                                                  β”‚
β”‚  3. 흐름 μ œμ–΄ (Flow Control)                                    β”‚
β”‚     - μˆ˜μ‹ μžμ˜ 처리 속도에 맞좰 전솑                            β”‚
β”‚     - μŠ¬λΌμ΄λ”© μœˆλ„μš° μ‚¬μš©                                      β”‚
β”‚                                                                  β”‚
β”‚  4. 혼작 μ œμ–΄ (Congestion Control)                              β”‚
β”‚     - λ„€νŠΈμ›Œν¬ 혼작 상황 λŒ€μ‘                                   β”‚
β”‚     - Slow Start, Congestion Avoidance λ“±                       β”‚
β”‚                                                                  β”‚
β”‚  5. 전이쀑 톡신 (Full-Duplex)                                   β”‚
β”‚     - μ–‘λ°©ν–₯ λ™μ‹œ 데이터 전솑 κ°€λŠ₯                              β”‚
β”‚                                                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

1.2 TCP vs UDP 간단 비ꡐ

νŠΉμ„± TCP UDP
μ—°κ²° μ—°κ²° μ§€ν–₯ λΉ„μ—°κ²°
μ‹ λ’°μ„± μ‹ λ’°μ„± 보μž₯ λΉ„μ‹ λ’°μ„±
μˆœμ„œ μˆœμ„œ 보μž₯ μˆœμ„œ 미보μž₯
속도 μƒλŒ€μ  느림 빠름
헀더 크기 20-60 λ°”μ΄νŠΈ 8 λ°”μ΄νŠΈ
μš©λ„ μ›Ή, 이메일, 파일 전솑 슀트리밍, DNS, κ²Œμž„

1.3 TCP μ„Έκ·Έλ¨ΌνŠΈ

TCP 데이터 μΊ‘μŠν™”

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Application Layer                                               β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚                         Data                                 β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Transport Layer (TCP)                                           β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚  TCP Header  β”‚                    Data                       β”‚ β”‚
β”‚ β”‚   (20-60B)   β”‚                (Segment)                      β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                      TCP Segment                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Network Layer (IP)                                              β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚  IP Header   β”‚              TCP Segment                      β”‚ β”‚
β”‚ β”‚   (20-60B)   β”‚                                               β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                       IP Packet                                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2. TCP 헀더 ꡬ쑰

2.1 TCP 헀더 ν˜•μ‹

 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        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |       |C|E|U|A|P|R|S|F|                               |
| Offset| Rsrvd |W|C|R|C|S|S|Y|I|            Window             |
|       |       |R|E|G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options (if any)                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             Data                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2.2 헀더 ν•„λ“œ μ„€λͺ…

ν•„λ“œ 크기 μ„€λͺ…
Source Port 16 bits μ†‘μ‹ μž 포트 번호 (0-65535)
Destination Port 16 bits μˆ˜μ‹ μž 포트 번호 (0-65535)
Sequence Number 32 bits μ„Έκ·Έλ¨ΌνŠΈ λ°μ΄ν„°μ˜ 첫 번째 λ°”μ΄νŠΈ 번호
Acknowledgment Number 32 bits λ‹€μŒμ— 받을 κ²ƒμœΌλ‘œ κΈ°λŒ€ν•˜λŠ” λ°”μ΄νŠΈ 번호
Data Offset 4 bits TCP 헀더 길이 (4λ°”μ΄νŠΈ λ‹¨μœ„)
Reserved 4 bits μ˜ˆμ•½ (0으둜 μ„€μ •)
Flags 8 bits μ œμ–΄ ν”Œλž˜κ·Έ (CWR, ECE, URG, ACK, PSH, RST, SYN, FIN)
Window 16 bits μˆ˜μ‹  μœˆλ„μš° 크기 (흐름 μ œμ–΄)
Checksum 16 bits 였λ₯˜ κ²€μΆœμš© 체크섬
Urgent Pointer 16 bits κΈ΄κΈ‰ 데이터 μœ„μΉ˜ (URG ν”Œλž˜κ·Έ μ„€μ • μ‹œ)
Options 0-40 bytes μΆ”κ°€ μ˜΅μ…˜ (MSS, Window Scale λ“±)

2.3 TCP ν”Œλž˜κ·Έ

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                       TCP ν”Œλž˜κ·Έ                                 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ CWR     β”‚ Congestion Window Reduced - 혼작 μœˆλ„μš° μΆ•μ†Œ μ•Œλ¦Ό     β”‚
β”‚ ECE     β”‚ ECN-Echo - λͺ…μ‹œμ  혼작 μ•Œλ¦Ό                           β”‚
β”‚ URG     β”‚ Urgent - κΈ΄κΈ‰ 데이터 쑴재                             β”‚
β”‚ ACK     β”‚ Acknowledgment - 확인 응닡 유효                       β”‚
β”‚ PSH     β”‚ Push - 버퍼링 없이 μ¦‰μ‹œ 전달                          β”‚
β”‚ RST     β”‚ Reset - μ—°κ²° κ°•μ œ μ’…λ£Œ                                β”‚
β”‚ SYN     β”‚ Synchronize - μ—°κ²° μš”μ²­ (μ‹œν€€μŠ€ 번호 동기화)          β”‚
β”‚ FIN     β”‚ Finish - μ—°κ²° μ’…λ£Œ μš”μ²­                               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2.4 μ£Όμš” TCP μ˜΅μ…˜

μ˜΅μ…˜ Kind μ„€λͺ…
MSS 2 Maximum Segment Size (일반적으둜 1460 bytes)
Window Scale 3 μœˆλ„μš° 크기 ν™•μž₯ (μ΅œλŒ€ 1GBκΉŒμ§€)
SACK Permitted 4 Selective ACK 지원 μ—¬λΆ€
SACK 5 μˆ˜μ‹ λœ μ„Έκ·Έλ¨ΌνŠΈ λ²”μœ„
Timestamps 8 RTT μΈ‘μ • 및 PAWS
NOP 1 νŒ¨λ”©μš© (No Operation)

3. 3-Way Handshake

3.1 μ—°κ²° μ„€μ • κ³Όμ •

TCP 연결은 3-way handshakeλ₯Ό 톡해 μ„€μ •λ©λ‹ˆλ‹€.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    3-Way Handshake                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                  β”‚
β”‚     ν΄λΌμ΄μ–ΈνŠΈ                           μ„œλ²„                   β”‚
β”‚         β”‚                                  β”‚                    β”‚
β”‚         β”‚  Step 1: SYN                     β”‚                    β”‚
β”‚         β”‚  ─────────────────────────────►  β”‚                    β”‚
β”‚         β”‚  SYN=1, Seq=100                  β”‚                    β”‚
β”‚  CLOSED β”‚                                  β”‚ LISTEN             β”‚
β”‚    ↓    β”‚                                  β”‚    ↓               β”‚
β”‚ SYN_SENTβ”‚  Step 2: SYN-ACK                 β”‚ SYN_RECEIVED       β”‚
β”‚         β”‚  ◄─────────────────────────────  β”‚                    β”‚
β”‚         β”‚  SYN=1, ACK=1, Seq=300, Ack=101  β”‚                    β”‚
β”‚    ↓    β”‚                                  β”‚                    β”‚
β”‚ ESTABLISHED Step 3: ACK                    β”‚                    β”‚
β”‚         β”‚  ─────────────────────────────►  β”‚                    β”‚
β”‚         β”‚  ACK=1, Seq=101, Ack=301         β”‚                    β”‚
β”‚         β”‚                                  β”‚ ESTABLISHED        β”‚
β”‚         β”‚                                  β”‚                    β”‚
β”‚         β”‚        μ—°κ²° 수립 μ™„λ£Œ            β”‚                    β”‚
β”‚         β”‚  ◄═════════════════════════════► β”‚                    β”‚
β”‚         β”‚         Data Transfer            β”‚                    β”‚
β”‚                                                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

3.2 각 단계 상세

Step 1: SYN (Synchronize)

ν΄λΌμ΄μ–ΈνŠΈ β†’ μ„œλ²„

TCP Header:
  Source Port: 50000 (μž„μ˜)
  Destination Port: 80 (HTTP)
  Sequence Number: 100 (ISN - Initial Sequence Number)
  Acknowledgment: 0
  Flags: SYN=1
  Window: 65535
  Options: MSS=1460, Window Scale=7

의미: "μ—°κ²°ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ‚΄ μ‹œν€€μŠ€ λ²ˆν˜ΈλŠ” 100λΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€."

Step 2: SYN-ACK

μ„œλ²„ β†’ ν΄λΌμ΄μ–ΈνŠΈ

TCP Header:
  Source Port: 80
  Destination Port: 50000
  Sequence Number: 300 (μ„œλ²„μ˜ ISN)
  Acknowledgment: 101 (ν΄λΌμ΄μ–ΈνŠΈ Seq + 1)
  Flags: SYN=1, ACK=1
  Window: 65535
  Options: MSS=1460, Window Scale=7

의미: "μ—°κ²° μš”μ²­μ„ λ°›μ•˜μŠ΅λ‹ˆλ‹€. 101번 λ°”μ΄νŠΈλ₯Ό κΈ°λ‹€λ¦½λ‹ˆλ‹€.
       λ‚΄ μ‹œν€€μŠ€ λ²ˆν˜ΈλŠ” 300λΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€."

Step 3: ACK

ν΄λΌμ΄μ–ΈνŠΈ β†’ μ„œλ²„

TCP Header:
  Source Port: 50000
  Destination Port: 80
  Sequence Number: 101
  Acknowledgment: 301 (μ„œλ²„ Seq + 1)
  Flags: ACK=1
  Window: 65535

의미: "μ„œλ²„μ˜ 응닡을 λ°›μ•˜μŠ΅λ‹ˆλ‹€. 301번 λ°”μ΄νŠΈλ₯Ό κΈ°λ‹€λ¦½λ‹ˆλ‹€.
       이제 데이터λ₯Ό 주고받을 수 μžˆμŠ΅λ‹ˆλ‹€."

3.3 ISN (Initial Sequence Number)

ISN이 랜덀인 이유:

1. λ³΄μ•ˆ
   - 예츑 κ°€λŠ₯ν•œ ISN은 TCP μ„Έμ…˜ ν•˜μ΄μž¬ν‚Ή μ·¨μ•½
   - 랜덀 ISN으둜 곡격 λ‚œμ΄λ„ 증가

2. 이전 μ—°κ²°κ³Ό ꡬ뢄
   - 동일 μ†ŒμΌ“(IP:Port 쌍)의 이전 μ—°κ²° νŒ¨ν‚·κ³Ό ν˜Όλ™ λ°©μ§€
   - TIME_WAIT μƒνƒœμ™€ μ—°κ΄€

ISN 생성 μ˜ˆμ‹œ:
  ν˜„λŒ€ 운영체제: μ•ˆμ „ν•œ λ‚œμˆ˜ 생성기(CSPRNG) μ‚¬μš©
  κ³Όκ±°: μ‹œκ°„ 기반 μΉ΄μš΄ν„° (4λ§ˆμ΄ν¬λ‘œμ΄ˆλ§ˆλ‹€ 1 증가)

3.4 TCP μƒνƒœ 전이 (μ—°κ²° μ„€μ •)

ν΄λΌμ΄μ–ΈνŠΈ μƒνƒœ 전이:
CLOSED β†’ SYN_SENT β†’ ESTABLISHED

μ„œλ²„ μƒνƒœ 전이:
CLOSED β†’ LISTEN β†’ SYN_RECEIVED β†’ ESTABLISHED

4. 4-Way Handshake

4.1 μ—°κ²° μ’…λ£Œ κ³Όμ •

TCP 연결은 4-way handshakeλ₯Ό 톡해 μ •μƒμ μœΌλ‘œ μ’…λ£Œλ©λ‹ˆλ‹€.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    4-Way Handshake                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                  β”‚
β”‚   ν΄λΌμ΄μ–ΈνŠΈ (λŠ₯동적 μ’…λ£Œ)         μ„œλ²„ (μˆ˜λ™μ  μ’…λ£Œ)           β”‚
β”‚         β”‚                                  β”‚                    β”‚
β”‚ ESTABLISHED                          ESTABLISHED               β”‚
β”‚         β”‚                                  β”‚                    β”‚
β”‚         β”‚  Step 1: FIN                     β”‚                    β”‚
β”‚         β”‚  ─────────────────────────────►  β”‚                    β”‚
β”‚         β”‚  FIN=1, Seq=100                  β”‚                    β”‚
β”‚ FIN_WAIT_1                                 β”‚                    β”‚
β”‚         β”‚                                  β”‚ CLOSE_WAIT         β”‚
β”‚         β”‚  Step 2: ACK                     β”‚                    β”‚
β”‚         β”‚  ◄─────────────────────────────  β”‚                    β”‚
β”‚         β”‚  ACK=1, Ack=101                  β”‚                    β”‚
β”‚ FIN_WAIT_2                                 β”‚                    β”‚
β”‚         β”‚                                  β”‚ (남은 데이터 전솑)  β”‚
β”‚         β”‚                                  β”‚                    β”‚
β”‚         β”‚  Step 3: FIN                     β”‚                    β”‚
β”‚         β”‚  ◄─────────────────────────────  β”‚                    β”‚
β”‚         β”‚  FIN=1, Seq=300                  β”‚ LAST_ACK           β”‚
β”‚ TIME_WAIT                                  β”‚                    β”‚
β”‚         β”‚  Step 4: ACK                     β”‚                    β”‚
β”‚         β”‚  ─────────────────────────────►  β”‚                    β”‚
β”‚         β”‚  ACK=1, Ack=301                  β”‚                    β”‚
β”‚         β”‚                                  β”‚ CLOSED             β”‚
β”‚  (2MSL λŒ€κΈ°)                               β”‚                    β”‚
β”‚ CLOSED                                                          β”‚
β”‚                                                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

4.2 각 단계 상세

단계 λ°œμ‹ μž ν”Œλž˜κ·Έ μ„€λͺ…
1 ν΄λΌμ΄μ–ΈνŠΈ FIN "보낼 데이터 μ—†μŒ. μ—°κ²° μ’…λ£Œ μš”μ²­"
2 μ„œλ²„ ACK "FIN μˆ˜μ‹  확인. 아직 보낼 데이터 μžˆμ„ 수 있음"
3 μ„œλ²„ FIN "λ‚˜λ„ 보낼 데이터 μ—†μŒ. μ—°κ²° μ’…λ£Œ λ™μ˜"
4 ν΄λΌμ΄μ–ΈνŠΈ ACK "FIN μˆ˜μ‹  확인. μ—°κ²° μ’…λ£Œ μ™„λ£Œ"

4.3 Half-Close

TCPλŠ” half-closeλ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. ν•œμͺ½μ—μ„œ FIN을 보내도 λ‹€λ₯Έ μͺ½μ€ 계속 데이터λ₯Ό 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.

Half-Close μ‹œλ‚˜λ¦¬μ˜€

ν΄λΌμ΄μ–ΈνŠΈ           μ„œλ²„
    β”‚                  β”‚
    │── FIN ─────────►│  ν΄λΌμ΄μ–ΈνŠΈ: "더 보낼 데이터 μ—†μŒ"
    β”‚                  β”‚
    │◄──── ACK ───────│  μ„œλ²„: "μ•Œκ² μŒ"
    β”‚                  β”‚
    │◄──── Data ──────│  μ„œλ²„: 남은 데이터 계속 전솑
    │◄──── Data ──────│
    β”‚                  β”‚
    │── ACK ─────────►│
    β”‚                  β”‚
    │◄──── FIN ───────│  μ„œλ²„: "λ‚˜λ„ λ‹€ 보냄"
    β”‚                  β”‚
    │── ACK ─────────►│  μ—°κ²° μ’…λ£Œ
    β”‚                  β”‚

4.4 TIME_WAIT μƒνƒœ

TIME_WAIT의 λͺ©μ :

1. μ§€μ—° νŒ¨ν‚· 처리
   - λ„€νŠΈμ›Œν¬μ— λ‚¨μ•„μžˆλŠ” 이전 μ—°κ²°μ˜ νŒ¨ν‚· μ†Œλ©Έ λŒ€κΈ°
   - μƒˆ μ—°κ²°μ—μ„œ ν˜Όλž€ λ°©μ§€

2. λ§ˆμ§€λ§‰ ACK 손싀 λŒ€λΉ„
   - μ„œλ²„κ°€ λ§ˆμ§€λ§‰ ACKλ₯Ό λͺ» λ°›μœΌλ©΄ FIN μž¬μ „μ†‘
   - ν΄λΌμ΄μ–ΈνŠΈκ°€ TIME_WAIT μƒνƒœλ©΄ μž¬μ‘λ‹΅ κ°€λŠ₯

TIME_WAIT 지속 μ‹œκ°„: 2 Γ— MSL (Maximum Segment Lifetime)
  - MSL: 일반적으둜 30초 λ˜λŠ” 2λΆ„
  - TIME_WAIT: 1λΆ„ ~ 4λΆ„

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  TIME_WAIT 문제                                                 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  - λŒ€λŸ‰μ˜ 단기 μ—°κ²° μ‹œ 포트 고갈 κ°€λŠ₯                          β”‚
β”‚  - ν•΄κ²°μ±…:                                                      β”‚
β”‚    1. SO_REUSEADDR μ†ŒμΌ“ μ˜΅μ…˜ μ‚¬μš©                               β”‚
β”‚    2. tcp_tw_reuse 컀널 νŒŒλΌλ―Έν„° (Linux)                        β”‚
β”‚    3. 컀λ„₯μ…˜ 풀링 μ‚¬μš©                                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

4.5 TCP μƒνƒœ λ‹€μ΄μ–΄κ·Έλž¨

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                 TCP μƒνƒœ λ‹€μ΄μ–΄κ·Έλž¨ (κ°„λž΅)                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

                              CLOSED
                                β”‚
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚ λŠ₯동적 μ—΄κΈ°     β”‚ μˆ˜λ™μ  μ—΄κΈ°     β”‚
              β–Ό                 β–Ό                 β”‚
          SYN_SENT ──────► LISTEN                β”‚
              β”‚                 β”‚                 β”‚
              β”‚  SYN μˆ˜μ‹        β”‚ SYN μˆ˜μ‹         β”‚
              β–Ό                 β–Ό                 β”‚
          ◄──────────── SYN_RCVD ─────────►      β”‚
                              β”‚                   β”‚
                    ACK μˆ˜μ‹   β”‚                   β”‚
                              β–Ό                   β”‚
                        ESTABLISHED               β”‚
                              β”‚                   β”‚
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
              β”‚ λŠ₯동적 μ’…λ£Œ    μˆ˜λ™μ  μ’…λ£Œ    β”‚   β”‚
              β–Ό                               β–Ό   β”‚
          FIN_WAIT_1                    CLOSE_WAIT β”‚
              β”‚                               β”‚   β”‚
              β–Ό                               β–Ό   β”‚
          FIN_WAIT_2                     LAST_ACK β”‚
              β”‚                               β”‚   β”‚
              β–Ό                               β”‚   β”‚
          TIME_WAIT ─────────────────────────►│   β”‚
              β”‚                                   β”‚
              └─── 2MSL β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
                              β–Ό
                           CLOSED

5. μ‹œν€€μŠ€ λ²ˆν˜Έμ™€ ACK

5.1 μ‹œν€€μŠ€ 번호의 μ—­ν• 

μ‹œν€€μŠ€ 번호 λ™μž‘

ν΄λΌμ΄μ–ΈνŠΈ                               μ„œλ²„
    β”‚                                      β”‚
    │── Seq=1000, 1000 bytes ────────────►│
    β”‚       (1000-1999)                    β”‚
    β”‚                                      β”‚
    │◄─────────────────── ACK=2000 ───────│
    β”‚   "2000번 λ°”μ΄νŠΈλΆ€ν„° λ³΄λ‚΄μ£Όμ„Έμš”"     β”‚
    β”‚                                      β”‚
    │── Seq=2000, 1000 bytes ────────────►│
    β”‚       (2000-2999)                    β”‚
    β”‚                                      β”‚
    │◄─────────────────── ACK=3000 ───────│
    β”‚                                      β”‚

μ‹œν€€μŠ€ 번호 = 이 μ„Έκ·Έλ¨ΌνŠΈμ˜ 첫 번째 데이터 λ°”μ΄νŠΈ 번호
ACK 번호 = λ‹€μŒμ— λ°›κΈ°λ₯Ό κΈ°λŒ€ν•˜λŠ” λ°”μ΄νŠΈ 번호

5.2 λˆ„μ  확인 응닡 (Cumulative ACK)

λˆ„μ  ACK λ™μž‘

μ†‘μ‹ μž                                   μˆ˜μ‹ μž
    β”‚                                      β”‚
    │── Seq=1000, 500 bytes ─────────────►│
    │── Seq=1500, 500 bytes ─────────────►│
    │── Seq=2000, 500 bytes ─────────────►│
    β”‚                                      β”‚
    │◄────────────────────── ACK=2500 ────│
    β”‚                                      β”‚
    β”‚  ν•˜λ‚˜μ˜ ACK둜 3개 μ„Έκ·Έλ¨ΌνŠΈ λͺ¨λ‘ 확인 β”‚
    β”‚                                      β”‚

μž₯점:
- ACK νŒ¨ν‚· 수 κ°μ†Œ
- λ„€νŠΈμ›Œν¬ νš¨μœ¨μ„± ν–₯상

단점:
- 쀑간 νŒ¨ν‚· 손싀 μ‹œ 이후 νŒ¨ν‚·λ„ μž¬μ „μ†‘
  (SACK으둜 ν•΄κ²°)

5.3 SACK (Selective Acknowledgment)

SACK λ™μž‘

μ†‘μ‹ μž                                   μˆ˜μ‹ μž
    β”‚                                      β”‚
    │── Seq=1000, 500B ─────────────────►│ βœ“
    │── Seq=1500, 500B ────────────X     β”‚ (손싀)
    │── Seq=2000, 500B ─────────────────►│ βœ“
    │── Seq=2500, 500B ─────────────────►│ βœ“
    β”‚                                      β”‚
    │◄──── ACK=1500, SACK=2000-3000 ─────│
    β”‚      "1500 λΉ μ‘ŒλŠ”λ°, 2000-3000은 λ°›μŒ"
    β”‚                                      β”‚
    │── Seq=1500, 500B ─────────────────►│ (μž¬μ „μ†‘)
    β”‚                                      β”‚
    │◄────────────────────── ACK=3000 ────│
    β”‚                                      β”‚

SACK μž₯점:
- μ†μ‹€λœ μ„Έκ·Έλ¨ΌνŠΈλ§Œ 선택적 μž¬μ „μ†‘
- λΆˆν•„μš”ν•œ μž¬μ „μ†‘ λ°©μ§€
- 고속 λ„€νŠΈμ›Œν¬μ—μ„œ 효율적

5.4 μž¬μ „μ†‘ 타이머 (RTO)

RTO (Retransmission Timeout) 계산

1. RTT (Round Trip Time) μΈ‘μ •
   - μ„Έκ·Έλ¨ΌνŠΈ 전솑뢀터 ACK μˆ˜μ‹ κΉŒμ§€ μ‹œκ°„

2. SRTT (Smoothed RTT) 계산
   SRTT = (1 - Ξ±) Γ— SRTT + Ξ± Γ— RTT
   (α = 1/8, 일반적)

3. RTTVAR (RTT Variance) 계산
   RTTVAR = (1 - Ξ²) Γ— RTTVAR + Ξ² Γ— |SRTT - RTT|
   (β = 1/4, 일반적)

4. RTO 계산
   RTO = SRTT + max(G, 4 Γ— RTTVAR)
   (G = 클럭 granularity)

μ˜ˆμ‹œ:
  μΈ‘μ •λœ RTT: 100ms, 120ms, 90ms, 110ms
  SRTT β‰ˆ 105ms
  RTTVAR β‰ˆ 10ms
  RTO = 105 + 4 Γ— 10 = 145ms

6. 흐름 μ œμ–΄

6.1 μŠ¬λΌμ΄λ”© μœˆλ„μš°

μŠ¬λΌμ΄λ”© μœˆλ„μš° κ°œλ…

솑신 버퍼:
β”Œβ”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”
β”‚ 1 β”‚ 2 β”‚ 3 β”‚ 4 β”‚ 5 β”‚ 6 β”‚ 7 β”‚ 8 β”‚ 9 β”‚10 β”‚11 β”‚12 β”‚
β””β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”˜
β”‚ACK됨│    μœˆλ„μš° (전솑 κ°€λŠ₯)    β”‚   아직 전솑 λΆˆκ°€   β”‚
β”‚     │◄────── Window=5 ───────►│                    β”‚

μˆ˜μ‹  μœˆλ„μš° 크기에 따라 μ „μ†‘λŸ‰ 쑰절:

Window = 5000:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     μ΅œλŒ€ 5000 bytesκΉŒμ§€ ACK 없이 전솑 κ°€λŠ₯       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Window = 0 (Zero Window):
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     전솑 쀑지! μˆ˜μ‹ μž 버퍼 가득 μ°Έ               β”‚
β”‚     Window Probe둜 주기적 확인                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

6.2 μœˆλ„μš° 크기 쑰절

μœˆλ„μš° 크기 λ³€ν™”

μ†‘μ‹ μž                               μˆ˜μ‹ μž
    β”‚                                  β”‚ rcvbuf=4000
    │── 1000B ────────────────────────►│ Window=3000
    │── 1000B ────────────────────────►│ Window=2000
    │── 1000B ────────────────────────►│ Window=1000
    β”‚                                  β”‚
    │◄─── ACK, Window=0 (버퍼 ν’€) ─────│
    β”‚                                  β”‚
    β”‚     (μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 데이터 읽음)  β”‚
    β”‚                                  β”‚
    │◄─── ACK, Window=4000 ────────────│
    β”‚                                  β”‚
    │── 1000B ────────────────────────►│
    │── 1000B ────────────────────────►│

6.3 Window Scale μ˜΅μ…˜

κΈ°λ³Έ μœˆλ„μš° 크기: 16λΉ„νŠΈ = μ΅œλŒ€ 65,535 bytes

고속 λ„€νŠΈμ›Œν¬μ—μ„œ λΆ€μ‘±:
  - 100Mbps, RTT 100ms β†’ BDP = 100 Γ— 0.1 / 8 = 1.25MB ν•„μš”
  - 1Gbps, RTT 100ms β†’ BDP = 12.5MB ν•„μš”

Window Scale μ˜΅μ…˜:
  - 3-way handshakeμ—μ„œ ν˜‘μƒ
  - μœˆλ„μš° 값을 μ™Όμͺ½μœΌλ‘œ μ‹œν”„νŠΈ
  - μ΅œλŒ€ μŠ€μΌ€μΌ: 14 (μœˆλ„μš° μ΅œλŒ€ μ•½ 1GB)

μ˜ˆμ‹œ:
  Window = 65535, Scale = 7
  μ‹€μ œ μœˆλ„μš° = 65535 Γ— 2^7 = 65535 Γ— 128 = 8,388,480 bytes (μ•½ 8MB)

6.4 Silly Window Syndrome λ°©μ§€

문제: μž‘μ€ μ„Έκ·Έλ¨ΌνŠΈ λ‹€μˆ˜ 전솑 (λΉ„νš¨μœ¨μ )

솑신츑 ν•΄κ²°: Nagle μ•Œκ³ λ¦¬μ¦˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  μž‘μ€ 데이터가 μžˆμ„ λ•Œ:                                         β”‚
β”‚  1. 미전솑 데이터가 μ—†μœΌλ©΄ μ¦‰μ‹œ 전솑                            β”‚
β”‚  2. 미전솑 데이터가 있으면 MSS만큼 λͺ¨μ΄κ±°λ‚˜ ACK 올 λ•ŒκΉŒμ§€ λŒ€κΈ°   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

μˆ˜μ‹ μΈ‘ ν•΄κ²°: Delayed ACK + Clark's Solution
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  1. ACKλ₯Ό μ¦‰μ‹œ 보내지 μ•Šκ³  200ms λŒ€κΈ°                           β”‚
β”‚  2. μœˆλ„μš° μ—…λ°μ΄νŠΈλŠ” MSS 이상 λ˜λŠ” λ²„νΌμ˜ 50% 이상일 λ•Œλ§Œ      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

7. 혼작 μ œμ–΄

7.1 혼작 μ œμ–΄ κ°œμš”

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     TCP 혼작 μ œμ–΄                                β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                  β”‚
β”‚  λͺ©μ : λ„€νŠΈμ›Œν¬ ν˜Όμž‘μ„ κ°μ§€ν•˜κ³  전솑λ₯ μ„ 쑰절                   β”‚
β”‚                                                                  β”‚
β”‚  핡심 λ³€μˆ˜:                                                     β”‚
β”‚  - cwnd (Congestion Window): μ†‘μ‹ μžκ°€ κ²°μ •ν•˜λŠ” μœˆλ„μš°           β”‚
β”‚  - rwnd (Receive Window): μˆ˜μ‹ μžκ°€ κ΄‘κ³ ν•˜λŠ” μœˆλ„μš°              β”‚
β”‚  - μ‹€μ œ 전솑 κ°€λŠ₯λŸ‰ = min(cwnd, rwnd)                           β”‚
β”‚                                                                  β”‚
β”‚  ssthresh (Slow Start Threshold):                               β”‚
β”‚  - Slow Start와 Congestion Avoidance의 경계                     β”‚
β”‚  - 혼작 λ°œμƒ μ‹œ μ‘°μ •                                            β”‚
β”‚                                                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

7.2 Slow Start

Slow Start λ™μž‘

                cwnd λ³€ν™”
               β”‚
       64 MSS  ─                              * (혼작 λ°œμƒ)
               β”‚                            *
       32 MSS  ─                          *
               β”‚                        *
       16 MSS  ─                      *
               β”‚                    *
        8 MSS  ─                  *
               β”‚                *
        4 MSS  ─              *
               β”‚            *
        2 MSS  ─          *
               β”‚        *
        1 MSS  ─      *
               β”‚
               └──────────────────────────────────── RTT
                    1   2   3   4   5   6

κ·œμΉ™:
- 초기 cwnd = 1 MSS (λ˜λŠ” IW=10 MSS, μ΅œμ‹  κ΅¬ν˜„)
- 각 ACKλ§ˆλ‹€ cwnd += 1 MSS
- κ²°κ³Ό: RTTλ§ˆλ‹€ cwnd 2λ°° 증가 (μ§€μˆ˜μ  증가)
- ssthresh 도달 μ‹œ Congestion Avoidance둜 μ „ν™˜

7.3 Congestion Avoidance

Congestion Avoidance λ™μž‘

                cwnd λ³€ν™”
               β”‚
               β”‚  ssthresh                    * (혼작 λ°œμƒ)
        16 MSS ┼─────────────*──────────*──*
               β”‚           *   *       *
               β”‚         *      *    *
               β”‚       *          *
               β”‚     *       μ„ ν˜• 증가 (AIMD)
               β”‚   *
               β”‚ *  Slow Start (μ§€μˆ˜)
               β”‚*
               β”‚
               └──────────────────────────────────── RTT

κ·œμΉ™:
- cwnd >= ssthresh일 λ•Œ λ™μž‘
- 각 RTTλ§ˆλ‹€ cwnd += 1 MSS (λ˜λŠ” cwnd += MSS/cwnd per ACK)
- μ„ ν˜• 증가 (Additive Increase)

7.4 혼작 감지와 λŒ€μ‘

혼작 감지 방법:

1. νƒ€μž„μ•„μ›ƒ (RTO 만료)
   - μ‹¬κ°ν•œ 혼작으둜 νŒλ‹¨
   - ssthresh = cwnd / 2
   - cwnd = 1 MSS
   - Slow Start μž¬μ‹œμž‘

2. 쀑볡 ACK 3개 (Fast Retransmit)
   - κ²½λ―Έν•œ 혼작으둜 νŒλ‹¨
   - ssthresh = cwnd / 2
   - cwnd = ssthresh + 3 MSS
   - Fast Recovery μ§„μž…

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     혼작 μ œμ–΄ μƒνƒœ 전이                          β”‚
β”‚                                                                  β”‚
β”‚  Slow Start ──(cwnd >= ssthresh)──► Congestion Avoidance        β”‚
β”‚      β”‚                                        β”‚                  β”‚
β”‚      β”‚                                        β”‚                  β”‚
β”‚   (timeout)                              (3 dup ACKs)            β”‚
β”‚      β”‚                                        β”‚                  β”‚
β”‚      β–Ό                                        β–Ό                  β”‚
β”‚  Slow Start ◄──────────────────────── Fast Recovery             β”‚
β”‚                    (recovery μ™„λ£Œ)                               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

7.5 Fast Retransmitκ³Ό Fast Recovery

Fast Retransmit μ‹œλ‚˜λ¦¬μ˜€

μ†‘μ‹ μž                               μˆ˜μ‹ μž
    β”‚                                  β”‚
    │── Seq=1000 ─────────────────────►│
    │── Seq=2000 ──────X              β”‚ (손싀)
    │── Seq=3000 ─────────────────────►│
    β”‚                                  β”‚
    │◄───────────────── ACK=2000 (dup1)β”‚
    β”‚                                  β”‚
    │── Seq=4000 ─────────────────────►│
    │◄───────────────── ACK=2000 (dup2)β”‚
    β”‚                                  β”‚
    │── Seq=5000 ─────────────────────►│
    │◄───────────────── ACK=2000 (dup3)β”‚
    β”‚                                  β”‚
    β”‚  3개의 쀑볡 ACK μˆ˜μ‹ !            β”‚
    β”‚  β†’ RTO 기닀리지 μ•Šκ³  μ¦‰μ‹œ μž¬μ „μ†‘ β”‚
    β”‚                                  β”‚
    │── Seq=2000 (μž¬μ „μ†‘) ────────────►│
    β”‚                                  β”‚
    │◄─────────────────────── ACK=6000 β”‚

Fast Recovery:
- 3 dup ACKs ν›„ ssthresh = cwnd/2
- cwnd = ssthresh + 3 (이미 μˆ˜μ‹ λœ μ„Έκ·Έλ¨ΌνŠΈ κ³ λ €)
- μƒˆ ACK μˆ˜μ‹  μ‹œ cwnd = ssthresh
- Congestion Avoidance둜 μ „ν™˜

7.6 ν˜„λŒ€ 혼작 μ œμ–΄ μ•Œκ³ λ¦¬μ¦˜

μ•Œκ³ λ¦¬μ¦˜ νŠΉμ§• μ‚¬μš© ν™˜κ²½
Reno κΈ°λ³Έ AIMD, Fast Recovery ν‘œμ€€
NewReno λΆ€λΆ„ ACK κ°œμ„  Reno κ°œμ„ 
CUBIC BIC κ°œμ„ , Linux κΈ°λ³Έ 고속 λ„€νŠΈμ›Œν¬
BBR λŒ€μ—­ν­/RTT 기반 Google, κ³ μ§€μ—° λ„€νŠΈμ›Œν¬
Vegas RTT λ³€ν™” 기반 μ €μ§€μ—° ν™˜κ²½
CUBIC cwnd 증가

cwnd
  β”‚
  β”‚                              *
  β”‚                           *     *
  β”‚                        *           *
  β”‚                     *                 *
  β”‚                  *                       *
  β”‚               *                             *
  β”‚            *          cubic ν•¨μˆ˜              *
  β”‚         *                                        *
  β”‚      *
  β”‚   *
  β”‚ *
  β”‚*
  └──────────────────────────────────────────────────── time

νŠΉμ§•:
- W_max (λ§ˆμ§€λ§‰ 혼작 μ‹œ μœˆλ„μš°) κΈ°μ–΅
- W_max에 λΉ λ₯΄κ²Œ μ ‘κ·Ό ν›„ 느리게 증가
- 곡정성과 ν™•μž₯μ„± 우수

8. μ—°μŠ΅ 문제

문제 1: 3-Way Handshake 뢄석

λ‹€μŒ νŒ¨ν‚· 캑처λ₯Ό λΆ„μ„ν•˜μ„Έμš”.

Packet 1: 192.168.1.10:50000 β†’ 10.0.0.5:443
          SYN, Seq=1000000000

Packet 2: 10.0.0.5:443 β†’ 192.168.1.10:50000
          SYN, ACK, Seq=2000000000, Ack=?

Packet 3: 192.168.1.10:50000 β†’ 10.0.0.5:443
          ACK, Seq=?, Ack=?

a) Packet 2의 Ack 값은? b) Packet 3의 Seq 값은? c) Packet 3의 Ack 값은?

문제 2: μ‹œν€€μŠ€ 번호 계산

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— 5000 bytes 데이터λ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€. MSS=1000 bytesμž…λ‹ˆλ‹€.

초기 μ‹œν€€μŠ€ λ²ˆν˜Έκ°€ 10000일 λ•Œ, 각 μ„Έκ·Έλ¨ΌνŠΈμ˜ Seq λ²ˆν˜Έμ™€ μ˜ˆμƒ ACKλ₯Ό κ³„μ‚°ν•˜μ„Έμš”.

μ„Έκ·Έλ¨ΌνŠΈ 데이터 크기 Seq μ˜ˆμƒ ACK
1 1000
2 1000
3 1000
4 1000
5 1000

문제 3: 흐름 μ œμ–΄

μˆ˜μ‹ μžμ˜ receive bufferκ°€ 10000 bytesμž…λ‹ˆλ‹€. ν˜„μž¬ 2000 bytesκ°€ 버퍼에 μžˆμŠ΅λ‹ˆλ‹€.

a) κ΄‘κ³  μœˆλ„μš° ν¬κΈ°λŠ”? b) μ†‘μ‹ μžκ°€ 4000 bytesλ₯Ό μ „μ†‘ν•˜λ©΄, μƒˆλ‘œμš΄ μœˆλ„μš° ν¬κΈ°λŠ”? c) μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 3000 bytesλ₯Ό 읽으면, μƒˆλ‘œμš΄ μœˆλ„μš° ν¬κΈ°λŠ”?

문제 4: 혼작 μ œμ–΄

ssthresh = 16 MSS, cwnd = 1 MSS둜 μ‹œμž‘ν•©λ‹ˆλ‹€.

a) 4번의 RTT ν›„ cwnd ν¬κΈ°λŠ”? (손싀 μ—†μŒ) b) cwnd = 32 MSS일 λ•Œ νƒ€μž„μ•„μ›ƒ λ°œμƒ. μƒˆλ‘œμš΄ ssthresh와 cwndλŠ”? c) cwnd = 24 MSS일 λ•Œ 3개의 쀑볡 ACK λ°œμƒ. μƒˆλ‘œμš΄ ssthresh와 cwndλŠ”?


μ •λ‹΅

문제 1 μ •λ‹΅

a) Packet 2의 Ack = 1000000001 (ν΄λΌμ΄μ–ΈνŠΈ Seq + 1) b) Packet 3의 Seq = 1000000001 (SYN은 1λ°”μ΄νŠΈλ‘œ κ°„μ£Ό) c) Packet 3의 Ack = 2000000001 (μ„œλ²„ Seq + 1)

문제 2 μ •λ‹΅

μ„Έκ·Έλ¨ΌνŠΈ 데이터 크기 Seq μ˜ˆμƒ ACK
1 1000 10000 11000
2 1000 11000 12000
3 1000 12000 13000
4 1000 13000 14000
5 1000 14000 15000

문제 3 μ •λ‹΅

a) κ΄‘κ³  μœˆλ„μš° = 10000 - 2000 = 8000 bytes b) μƒˆ μœˆλ„μš° = 10000 - 2000 - 4000 = 4000 bytes c) μƒˆ μœˆλ„μš° = 10000 - (2000 + 4000 - 3000) = 7000 bytes

문제 4 μ •λ‹΅

a) Slow Start 단계 (cwnd < ssthresh) - RTT 1: cwnd = 2 MSS - RTT 2: cwnd = 4 MSS - RTT 3: cwnd = 8 MSS - RTT 4: cwnd = 16 MSS

b) νƒ€μž„μ•„μ›ƒ λ°œμƒ: - μƒˆ ssthresh = 32 / 2 = 16 MSS - μƒˆ cwnd = 1 MSS

c) 3 dup ACKs (Fast Retransmit): - μƒˆ ssthresh = 24 / 2 = 12 MSS - μƒˆ cwnd = 12 + 3 = 15 MSS (Fast Recovery)


9. λ‹€μŒ 단계

TCP의 핡심 κ°œλ…μ„ μ΄ν•΄ν–ˆλ‹€λ©΄, UDP와 ν¬νŠΈμ— λŒ€ν•΄ ν•™μŠ΅ν•˜μ„Έμš”.

λ‹€μŒ 레슨

κ΄€λ ¨ 레슨

μΆ”μ²œ μ‹€μŠ΅

  1. Wireshark둜 TCP 3-way handshake 캑처
  2. ss -i λ˜λŠ” netstat -s둜 TCP 톡계 확인
  3. tcpdump둜 TCP ν”Œλž˜κ·Έ 뢄석

10. 참고 자료

RFC λ¬Έμ„œ

  • RFC 793 - TCP κΈ°λ³Έ λͺ…μ„Έ
  • RFC 5681 - TCP Congestion Control
  • RFC 7323 - TCP Extensions (Window Scaling, Timestamps)
  • RFC 2018 - TCP Selective Acknowledgment Options

λͺ…λ Ήμ–΄ μ°Έκ³ 

# TCP μ—°κ²° μƒνƒœ 확인 (Linux)
ss -tan
netstat -an | grep tcp

# TCP 톡계
netstat -s | grep -i tcp
cat /proc/net/snmp | grep Tcp

# TCP νŠœλ‹ νŒŒλΌλ―Έν„° 확인
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.rmem_max
sysctl net.ipv4.tcp_window_scaling

# Wireshark ν•„ν„°
tcp.flags.syn == 1 && tcp.flags.ack == 0  # SYN νŒ¨ν‚·
tcp.analysis.retransmission               # μž¬μ „μ†‘
tcp.analysis.duplicate_ack                # 쀑볡 ACK

ν•™μŠ΅ 자료


λ¬Έμ„œ 정보 - μ΅œμ’… μˆ˜μ •: 2024λ…„ - λ‚œμ΄λ„: ⭐⭐⭐ - μ˜ˆμƒ ν•™μŠ΅ μ‹œκ°„: 3-4μ‹œκ°„

to navigate between lessons