[๋„คํŠธ์›Œํฌ] TCP ํ˜ผ์žก์ œ์–ด,ํ๋ฆ„์ œ์–ด

TCP์— ๋Œ€ํ•˜์—ฌ 

TCP๋ž€? 

๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋ฐฉ์‹ ์ค‘ ์‹ ๋ขฐ์ ์ธ ์—ฐ๊ฒฐ๋ฐฉ์‹
TCP๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋„คํŠธ์›Œํฌ์—์„œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ
TCP๋Š” ํ˜ผ์žก ์ œ์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•จ 

๋น„ ์‹ ๋ขฐ์ ์ธ ๋ฌธ์ œ์ 

  1. ์†์‹ค : ํŒจํ‚ท์˜ ์†์‹ค
  2. ์ˆœ์„œ ๋ฐ”๋€œ : ์ „์†ก๋œ ํŒจํ‚ท์˜ ์ˆœ์„œ๊ฐ€ ์ˆ˜์‹ ํ•  ๋•Œ ๋ฐ”๋€Œ๋Š” ๋ฌธ์ œ
  3. Congestion : ๋„คํŠธ์›Œํฌ๊ฐ€ ํ˜ผ์žกํ•œ ๋ฌธ์ œ
  4. Overload : ์ˆ˜์‹ ์ธก์ด ์ดˆ๊ณผ๋˜๋Š” ๋ฌธ์ œ

TCP ๋ฐ์ดํ„ฐ ์ „์†ก ๊ณผ์ • 

  1. TCP๋Š” ์ „์ด์ค‘ ๋ฐฉ์‹์˜ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์–‘๋ฐฉํ–ฅ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๊ฐ€๋Šฅ 
  2. TCP๋Š” ์—ฐ๊ฒฐํ˜• ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์—ฐ๊ฒฐ ์„ค์ •, ๋ฐ์ดํ„ฐ ์ „์†ก, ์—ฐ๊ฒฐ ํ•ด์ œ 3๋‹จ๊ณ„๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒŒ๋จ 

 

๋ฐ์ดํ„ฐ ์ „์†ก ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Œ

  1. Application layer : ์ „์†ก์ธก application layer๊ฐ€ socket์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์Œ 
  2. Transport layer : ๋ฐ์ดํ„ฐ๋ฅผ ์„ธ๊ทธ๋จผํŠธ๋กœ ๊ฐ์‹ธ๊ณ , network layer์—๊ฒŒ ๋„˜๊ฒจ์คŒ 
  3. ์•„๋žซ๋‹จ์—์„œ send buffer์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ „์†กํ•จ
  4. ์ˆ˜์‹ ์ธก์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๋ฒ„ํผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•จ
  5. application์€ ๋•Œ๊ฐ€ ๋˜๋ฉด ๋ฒ„ํผ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์‹œ์ž‘ํ•จ 
  6. ์—ฌ๊ธฐ์„œ ํ๋ฆ„์ œ์–ด๋ฅผ ํ†ตํ•ด ์ด ์ˆ˜์‹ ์ธก ๋ฒ„ํผ๊ฐ€ ๋„˜์น˜์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•จ 
  7. ๋”ฐ๋ผ์„œ ์ˆ˜์‹ ์ธก์€ RWND(Receive WiNDow)์˜ ๋‚จ์€ ๊ณต๊ฐ„์„ ํ™๋ณดํ•จ

 

 

ํ๋ฆ„์ œ์–ด (Flow Control) 

ํ๋ฆ„์ œ์–ด๋ž€?

์†ก์‹ ์ธก๊ณผ ์ˆ˜์‹ ์ธก์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์†๋„ ์ฐจ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ• 
์ˆ˜์‹ ์ธก์ด ๋„˜์น˜์ง€ ์•Š๋„๋ก ์ „์†ก๋˜๋Š” ํŒจํ‚ท์„ ์กฐ์ ˆํ•˜๋Š” ๊ฒƒ
์ˆ˜์‹ ์ธก์ด ์ „์†ก์ธก์—๊ฒŒ ์ž์‹ ์˜ Buffer ์ƒํƒœ๋ฅผ ๊ณ„์†์ ์œผ๋กœ ํ”ผ๋“œ๋ฐฑํ•จ

Stop and Wait 

๋งค๋ฒˆ ์ „์†กํ•œ ํŒจํ‚ท์— ๋Œ€ํ•ด ํ™•์ธ ์‘๋‹ต์„ ๋ฐ›์•„์•ผ๋งŒ ๊ทธ ๋‹ค์Œ ํŒจํ‚ท์„ ์ „์†ก 

Sliding Window(Go Back N ARQ) 

  1. ์ˆ˜์‹ ์ธก์—์„œ ์„ค์ •ํ•œ ์œˆ๋„์šฐ ํฌ๊ธฐ๋งŒํผ ์†ก์‹ ์ธก์—์„œ ํ™•์ธ์‘๋‹ต์—†์ด ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋™์ ์œผ๋กœ ์กฐ์ ˆํ•˜๋Š” ์ œ์–ด ๊ธฐ๋ฒ• 
  2. ์ „์†ก์€ ๋˜์—ˆ์ง€๋งŒ, Acked๋ฅผ ๋ฐ›์ง€ ๋ชปํ•œ byte์˜ ์ˆซ์ž๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” protocol
  3. LastByteSent - LastByteAcked <= ReceivedWindowAdvertised  (๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณด๋‚ธ ๋ฐ”์ดํŠธ - ๋งˆ์ง€๋ง‰์— ํ™•์ธ๋œ ๋ฐ”์ดํŠธ <= ๋‚จ์€ ๊ณต๊ฐ„) 
  4. ํ˜„์žฌ ์ „์†ก๋˜๊ณ  ์žˆ๋Š” ํŒจํ‚ท ์ˆ˜ <= sliding window 

 

Sliding WIndow ๋™์ž‘ ๋ฐฉ์‹

  1. ๋จผ์ € ์œˆ๋„์šฐ์— ํฌํ•จ๋˜๋Š” ๋ชจ๋“  ํŒจํ‚ท์„ ์ „์†ก
  2. ํŒจํ‚ท๋“ค์˜ ์ „๋‹ฌ์ด ํ™•์ธ๋˜๋Š” ๋Œ€๋กœ ์œˆ๋„์šฐ๋ฅผ ์˜†์œผ๋กœ ์˜ฎ๊ฒจ ๋ฒ”์œ„์— ํ•ด๋‹น๋˜๋Š” ํŒจํ‚ท๋“ค์„ ์ „์†ก  

 

Window 

  1. TCP/IP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํ˜ธ์ŠคํŠธ๋“ค์€ ์†ก์‹ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ, ์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•œ 2๊ฐœ์˜ Window๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ 
  2. ํ˜ธ์ŠคํŠธ๋“ค์€ ๋ฐ์ดํ„ฐ ์ „์†ก ์ „์— '3 way handshaking'์„ ํ†ตํ•ด ์ˆ˜์‹  ํ˜ธ์ŠคํŠธ์˜ window size์™€ ์ž์‹ ์˜ window size๋ฅผ ๋งž์ถค

 

 

์†ก์‹  ๋ฒ„ํผ

  1. 200 ์ด์ „์˜ ๋ฐ”์ดํŠธ๋Š” ์ด๋ฏธ ์ „์†ก๋˜์—ˆ๊ณ , ํ™•์ธ ์‘๋‹ต์„ ๋ฐ›์Œ
  2. 200~ 202 ๋ฐ”์ดํŠธ๋Š” ์ „์†ก๋˜์—ˆ๊ณ , ํ™•์ธ ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ•จ
  3. 203 ~ 211 ๋ฐ”์ดํŠธ๋Š” ์•„์ง ์ „์†ก์ด ์•ˆ๋จ 

 

์ˆ˜์‹  ์œˆ๋„์šฐ 

 

์ˆ˜์‹  ์œˆ๋„์šฐ 

์†ก์‹  ์œˆ๋„์šฐ 

์†ก์‹  ์œˆ๋„์šฐ

  1. ์ˆ˜์‹  ์œˆ๋„์šฐ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋กœ ์†ก์‹  ์œˆ๋„์šฐ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ๋ฆ„์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅ   

 

์†ก์‹  ์œˆ๋„์šฐ์˜ ์ด๋™

 

  1. 200, 201, 202 ์‘๋‹ต Acked๋ฅผ ์•„์ง ๋ฐ›์ง€ ๋ชปํ•จ 
  2. 200, 201, 202 ์‘๋‹ต Acked๋ฅผ ๋ฐ›์œผ๋ฉด ์†ก์‹ ์ธก์€ ์ˆ˜์‹  ์œˆ๋„์šฐ๋ฅผ 203 ~ 209๋กœ ์ด๋™ 

 

 

ํ˜ผ์žก ์ œ์–ด (Congestion Control)

ํ˜ผ์žก์ œ์–ด๋ž€? 

์†ก์‹ ์ธก์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ๊ณผ ๋„คํŠธ์›Œํฌ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์†๋„ ์ฐจ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•
ํ•œ ๋ผ์šฐํ„ฐ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชฐ๋ฆด ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š์•„ ํ˜ธ์ŠคํŠธ๋“ค์€ ๋‹ค์‹œ ์žฌ์ „์†กํ•˜๋Š” ์•…์ˆœํ™˜ ๋ฐœ์ƒ
์ด๋Ÿฌํ•œ ํ˜ผ์žก์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์†ก์‹ ์ธก์˜ ๋ฐ์ดํ„ฐ ์ „์†ก ์†๋„๋ฅผ ๊ฐ•์ œ๋กœ ์กฐ์ ˆํ•˜๋Š” ์ž‘์—…์„ ํ˜ผ์žก์ œ์–ด๋ผ๊ณ  ํ•จ
๋„คํŠธ์›Œํฌ ๋‚ด์— ํŒจํ‚ท์˜ ์ˆ˜๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ๋งŽ์•„์ง€๋Š” ๊ฒƒ์„ ํ˜ผ์žก์ด๋ผ ํ•จ
ํ˜ผ์žก ์ œ์–ด๋Š” ํ๋ฆ„์ œ์–ด์™€ ๋‹ค๋ฅด๊ฒŒ ํ˜ธ์ŠคํŠธ์™€ ๋ผ์šฐํ„ฐ๋ฅผ ํฌํ•จํ•œ ๋ณด๋‹ค ๋„“์€ ๊ด€์ ์—์„œ์˜ ์ „์†ก ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃธ 

AIMD(Additive Increase / Multicative Decrease)  

  1. ์ฒ˜์Œ์— ํŒจํ‚ท์„ ํ•˜๋‚˜์”ฉ ์ „์†ก, ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด window ํฌ๊ธฐ๋ฅผ 1์”ฉ ์ฆ๊ฐ€
  2. ํŒจํ‚ท ์ „์†ก์— ์‹คํŒจํ•˜๊ฑฐ๋‚˜ Timeout์ด๋ฉด ํŒจํ‚ท ์ „์†ก ์†๋„๋ฅผ ๋ฐ˜์œผ๋กœ ์ค„์ž„
  3. ๊ณตํ‰ํ•œ ๋ฐฉ์‹, ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŠธ๊ฐ€ ํ•œ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ณต์œ ํ•˜๋ฉด ๋‚˜์ค‘์— ์ง„์ž…ํ•˜๋Š” ์ชฝ์ด ๋ถˆ๋ฆฌํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ์—” ํ‰ํ˜• ์ƒํƒœ๊ฐ€ ๋จ
  4. ์ดˆ๋ฐ˜์— ์ „์†ก๋˜๋Š” ํŒจํ‚ท์ด ์ ๋‹ค๋ณด๋‹ˆ ํ•œ๊ณ„ ๋Œ€์—ญํญ์„ ์ „๋ถ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋Œ€์—ญํญ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ 
  5. ๋„คํŠธ์›Œํฌ ํ˜ผ์žก์„ ๋ฏธ๋ฆฌ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•จ

Slow Start 

  1. AIMD ๋ฐฉ์‹์ด ์ „์†ก ์†๋„๋ฅผ ์˜ฌ๋ฆฌ๋Š”๋ฐ ์˜ค๋žœ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์— ์ฐฉ์•ˆ 
  2. ์ฒ˜์Œ์—๋Š” ๋˜‘๊ฐ™์ด ํŒจํ‚ท ํ•˜๋‚˜๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ, ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ๋„์ฐฉํ•˜๋Š” ACK ํŒจํ‚ท๋งˆ๋‹ค window size 1์”ฉ ์ฆ๊ฐ€. ์ฆ‰ ํ•œ ์ฃผ๊ธฐ๋งˆ๋‹ค window size๊ฐ€ 2๋ฐฐ ์ฆ๊ฐ€ํ•จ
  3. ์ „์†ก ์†๋„๋Š” ์ง€์ˆ˜ ํ•จ์ˆ˜ ๊ผด๋กœ ์ฆ๊ฐ€ํ•˜๋ฉฐ, ํ˜ผ์žก ํ˜„์ƒ ๋ฐœ์ƒ์‹œ window size๋ฅผ 1๋กœ ๋–จ์–ด๋œจ๋ฆผ
  4. ํ•œ๋ฒˆ ํ˜ผ์žก ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋„คํŠธ์›Œํฌ์˜ ์ˆ˜์šฉ๋Ÿ‰ ์˜ˆ์ƒ ๊ฐ€๋Šฅ 
  5. ๋”ฐ๋ผ์„œ ํ•œ๋ฒˆ ํ˜ผ์žก ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋˜ window size์˜ ์ ˆ๋ฐ˜๊นŒ์ง€๋Š” ์ง€์ˆ˜ ํ•จ์ˆ˜ ๊ผด๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋‹ค๊ฐ€ ๊ทธ ์ดํ›„๋กœ๋Š” 1์”ฉ ์ฆ๊ฐ€ ์‹œํ‚ด

Fast Retransmit (๋น ๋ฅธ ์žฌ์ „์†ก) 

  1. ์ˆ˜์‹ ์ธก์—์„œ ์•ž์˜ ํŒจํ‚ท์ด ๋„์ฐฉํ•˜์ง€ ์•Š๊ณ  ๊ทธ ์ดํ›„์˜ ํŒจํ‚ท์ด ์™€๋„ ACK ํŒจํ‚ท์„ ๋ณด๋ƒ„
  2. ์ˆœ์„œ๋Œ€๋กœ ์ž˜ ๋„์ฐฉํ•œ ๋งˆ์ง€๋ง‰ ํŒจํ‚ท์˜ ๋‹ค์Œ ํŒจํ‚ท ๋ฒˆํ˜ธ๋ฅผ ACK ํŒจํ‚ท์— ์‹ค์–ด ๋ณด๋‚ด๋ฏ€๋กœ, ์ค‘๊ฐ„์— ์†์‹ค๋˜๋ฉด ์†ก์‹  ์ธก์—์„œ๋Š” ์ค‘๋ณต๋œ ACK๋ฅผ ๋ฐ›๊ฒŒ ๋จ => ์žฌ์ „์†ก! 
  3. ์ค‘๋ณต๋œ ์ˆœ๋ฒˆ์˜ ํŒจํ‚ท์„ 3๊ฐœ ๋ฐ›์œผ๋ฉด ์žฌ์ „์†กํ•จ, ํ˜ผ์žก์„ ์˜ˆ์ƒํ•˜๊ณ  window size ๊ฐ์†Œ

Fast Recovery (๋น ๋ฅธ ํšŒ๋ณต) 

  1. ํ˜ผ์žกํ•œ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด window size๋ฅผ 1๋กœ ์ค„์ด๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ฐ˜์œผ๋กœ ์ค„์ด๊ณ  ์„ ํ˜• ์ฆ๊ฐ€์‹œํ‚ด 
  2. ์ด ์ •์ฑ…์„ ์ ์šฉํ•˜๋ฉด ํ˜ผ์žก ์ƒํ™ฉ์„ ํ•œ๋ฒˆ ๊ฒช๊ณ  ๋‚˜์„œ๋ถ€ํ„ฐ๋Š” ์ˆœ์ˆ˜ํ•œ AIMD ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ 

 

 

Reference 

https://www.brianstorti.com/tcp-flow-control/

 

TCP Flow Control

TCP Flow Control

www.brianstorti.com

  https://github.com/gyoogle/tech-interview-for-developer

 

gyoogle/tech-interview-for-developer

๐Ÿ‘ถ๐Ÿป ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ „๊ณต ์ง€์‹ & ๊ธฐ์ˆ  ๋ฉด์ ‘ ๋ฐฑ๊ณผ์‚ฌ์ „ ๐Ÿ“–. Contribute to gyoogle/tech-interview-for-developer development by creating an account on GitHub.

github.com