TCP νλ‘ν μ½
TCP νλ‘ν μ½¶
κ°μ¶
μ΄ λ¬Έμμμλ TCP(Transmission Control Protocol)μ ν΅μ¬ κ°λ μ λ€λ£Ήλλ€. μ°κ²° μ§ν₯μ μ΄κ³ μ λ’°μ± μλ λ°μ΄ν° μ μ‘μ 보μ₯νλ TCPμ λμ μ리, ν€λ ꡬ쑰, νλ¦ μ μ΄, νΌμ‘ μ μ΄ λ©μ»€λμ¦μ νμ΅ν©λλ€.
λμ΄λ: βββ μμ νμ΅ μκ°: 3-4μκ° μ μ μ§μ: 09_Routing_Protocols.md
λͺ©μ°¨¶
- TCPμ νΉμ§
- TCP ν€λ ꡬ쑰
- 3-Way Handshake
- 4-Way Handshake
- μνμ€ λ²νΈμ ACK
- νλ¦ μ μ΄
- νΌμ‘ μ μ΄
- μ°μ΅ λ¬Έμ
- λ€μ λ¨κ³
- μ°Έκ³ μλ£
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μ ν¬νΈμ λν΄ νμ΅νμΈμ.
λ€μ λ 쨶
- 11_UDPμ_ν¬νΈ.md - UDP νΉμ§, ν¬νΈ λ²νΈ
κ΄λ ¨ λ 쨶
- 09_Routing_Protocols.md - λ€νΈμν¬ κ³μΈ΅
- 12_DNS.md - DNS λμ μ리
μΆμ² μ€μ΅¶
- Wiresharkλ‘ TCP 3-way handshake μΊ‘μ²
ss -iλλnetstat -sλ‘ TCP ν΅κ³ νμΈ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
νμ΅ μλ£¶
- TCP/IP Illustrated, Vol. 1 - W. Richard Stevens
- High Performance Browser Networking
- Cloudflare Blog - TCP
λ¬Έμ μ 보 - μ΅μ’ μμ : 2024λ - λμ΄λ: βββ - μμ νμ΅ μκ°: 3-4μκ°