TCP/UDP 였λ₯˜μ™€ 흐름 μ œμ–΄
Network

TCP/UDP 였λ₯˜μ™€ 흐름 μ œμ–΄

1.  였λ₯˜μ™€ 흐름 μ œμ–΄

Client와 ServerλŠ” 톡신을 ν•˜λ©° μˆ˜λ§Žμ€ 데이터λ₯Ό νŒ¨ν‚·μœΌλ‘œ μͺΌκ²Œ μ£Όκ³ λ°›κ²Œ λ©λ‹ˆλ‹€. μ΄κ³Όμ •μ—μ„œ 였λ₯˜μ™€ 흐름이 μ œμ–΄λœ μ‹ λ’°μ„± μžˆλŠ” 전솑을 μœ„ν•˜μ—¬ λ…Έμ΄μ¦ˆλ‘œ μΈν•˜μ—¬ μ „달받은 νŒ¨ν‚·μ΄ 쀑간에 νšŒμ†λ˜μ§€λŠ” μ•Šμ•˜λŠ”μ§€? λ„€νŠΈμ›Œν¬ 문제둜 μΈν•˜μ—¬ νŒ¨ν‚·μ΄ 쀑간에 μœ μ‹€λ˜μ§€λŠ” μ•Šμ•˜λŠ”μ§€? λ§Œμ•½ μœ μ‹€λ˜μ—ˆλ‹€λ©΄ 이후 νŒ¨ν‚·μ„ μ–΄λ–»κ²Œ μž¬μ „μ†‘ν• μ§€? 확인이 ν•„μš”ν•©λ‹ˆλ‹€.

 

첫번째 전달 받은 νŒ¨ν‚·μ΄ 쀑간에 νšŒμ†λ˜μ§€λŠ” μ•Šμ•˜λŠ”μ§€?(였λ₯˜ κ²€μΆœ 방식) ν™•μΈν•˜κΈ° μœ„ν•΄μ„œ 체크섬, νŒ¨λ¦¬ν‹° 검사, CRC 등을 μ΄μš©ν•©λ‹ˆλ‹€. μ„Έκ·Έλ¨ΌνŠΈ ν—€λ”μ—μ„œλŠ” 체크섬 ν•„λ“œλ₯Ό ν†΅ν•˜μ—¬ 였λ₯˜λ₯Ό μ •μ •ν•˜κ³  무결성을 λ³΄ν˜Έν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

 

λ‘λ²ˆμ§Έ νŒ¨ν‚·μ΄ 쀑간에 μœ μ‹€λ˜μ§€λŠ” μ•Šμ•˜λŠ”μ§€?(확인 응닡) ν™•μΈν•˜κΈ° μœ„ν•΄μ„œ μˆ˜μ‹ μΈ‘μ€ μ†‘μ‹ μΈ‘μœΌλ‘œλΆ€ν„° νŒ¨ν‚·μ„ λ°›κ³  긍정 μ‘λ‹΅μœΌλ‘œ ACK νŒ¨ν‚·μ„ λΆ€μ • μ‘λ‹΅μœΌλ‘œ NACK νŒ¨ν‚·μ„ λ°œμ†‘ν•©λ‹ˆλ‹€. μˆ˜μ‹ μΈ‘μ€ μ†‘μ‹ μΈ‘μœΌλ‘œλΆ€ν„° 응닡 νŒ¨ν‚·μ„ 받은 ν›„ μ–΄λ–€ νŒ¨ν‚·μ„ λ‹€μŒμ— 보낼지 κ²°μ •ν•˜κ²Œ λ˜λŠ”λ° 이 κ³Όμ •μ—μ„œ μ–Έμ œκΉŒμ§€λ‚˜ 응닡 νŒ¨ν‚·μ„ 기닀릴 수 μ—†κΈ° λ•Œλ¬Έμ— μž¬μ „μ†‘ 타이머가 λ™μž‘ν•©λ‹ˆλ‹€. μž¬μ „μ†‘ 타이머가 λλ‚˜κ²Œλ˜λ©΄ 응닡 νŒ¨ν‚·μ„ 받지 μ•ŠμœΌλ©΄ μœ μ‹€λ‘œ κ°„μ£Όν•˜κ³  νŒ¨ν‚·μ„ μž¬μ „μ†‘ν•©λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ λ“±μž₯ν•˜λŠ” μž¬μ „μ†‘ 타이머(RTO, Retransmission Timeout)λŠ” 데이터λ₯Ό μž¬μ „μ†‘ν•˜κΈ° μœ„ν•œ νƒ€μ΄λ¨Έμž…λ‹ˆλ‹€. μž¬μ „μ†‘ νƒ€μ΄λ¨ΈλŠ” RTT(Round Trip Time)κ³Ό μ–΄λ– ν•œ μ•Œκ³ λ¦¬μ¦˜,,,? 계산식,,,?으둜 κ³„μ‚°λ˜λ©° λ™μ μœΌλ‘œ μ •ν•΄μ§‘λ‹ˆλ‹€. RTTλŠ” 3 Way Handshakingμ—μ„œ SYN νŒ¨ν‚·μ„ 보내고 ACK νŒ¨ν‚·μ„ λ°›κΈ°κΉŒμ§€μ˜ μ‹œκ°„μ΄λ©° ν•΄λ‹Ή μ‹œμ μ€ μž¬μ „μ†‘ 타이머가 정해지기 전이기 λ•Œλ¬Έμ— Initial RTOλ₯Ό μ°Έκ³ ν•˜κ²Œ λ©λ‹ˆλ‹€. Initial RTOλŠ” μš΄μ˜μ²΄μ œμ— λ”°λΌμ„œ λ‹€λ₯΄κ²Œ μ„€μ •λ˜μ–΄ 있으며 보톡 1초이며 2제곱으둜 λŠ˜μ–΄λ‚©λ‹ˆλ‹€. μ΄λ ‡κ²Œ 3 Way Handshakingμ—μ„œ μΈ‘μ •λœ Initial RTTλŠ” νŒ¨ν‚·μ—μ„œ 확인 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

μ„Έλ²ˆμ§Έ νŒ¨ν‚·μ„ μ–΄λ–»κ²Œ μž¬μ „μ†‘ν• μ§€?(ARQ, Automatic Repeat reQuest) ν™•μΈν•˜κΈ° μœ„ν•΄μ„œ λ‹€μŒ νŒ¨ν‚·μ˜ 크기와 μœ μ‹€ μ‹œμ μœΌλ‘œλΆ€ν„° μ–Όλ§ˆλ‚˜ νŒ¨ν‚·μ„ μž¬μ „μ†‘ν• μ§€ κ²°μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. 총 세가지 λ™μž‘ 방식이 μžˆμŠ΅λ‹ˆλ‹€.

 

Stop and Wait ARQλŠ” νŒ¨ν‚·μ„ ν•œκ°œμ”©λ§Œ 보낼 수 μžˆλŠ” κ°€μž₯ λ‹¨μˆœν•œ λ°©μ‹μž…λ‹ˆλ‹€. μˆ˜μ‹ μΈ‘μ—μ„œ νŒ¨ν‚·μ„ 보내고 μ†‘μ‹ μΈ‘μœΌλ‘œλΆ€ν„° ACK νŒ¨ν‚·μ„ 전달 λ°›μ•„μ•Ό λ‹€μŒ νŒ¨ν‚·μ„ μ „μ†‘ν•©λ‹ˆλ‹€. μˆ˜μ‹ μΈ‘μ€ μž¬μ „μ†‘ 타이머가 μ™„λ£Œλ˜κΈ° μ „κΉŒμ§€ 응닡 νŒ¨ν‚·μ„ 받지 λͺ»ν•  경우 λ§ˆμ§€λ§‰μ— 보낸 νŒ¨ν‚·μ„ μž¬μ „μ†‘ν•©λ‹ˆλ‹€. 응닡 νŒ¨ν‚·μ„ λ°›κΈ° μ „κ³Ό μž¬μ „μ†‘ 타이머가 μ™„λ£Œλ˜κΈ° μ „κΉŒμ§€ μˆ˜μ‹ μΈ‘μ€ 아무것도 ν•  수 μ—†κΈ° λ•Œλ¬Έμ— κ°€μž₯ λΉ„νš¨μœ¨μ μž…λ‹ˆλ‹€.

 

Go Back N ARQλŠ” μŠ¬λΌμ΄λ”© μœˆλ„μš°λ₯Ό μ΄μš©ν•˜μ—¬ ν•œλ²ˆμ— μ—¬λŸ¬ νŒ¨ν‚·μ„ 보낼 수 있으며 νŒ¨ν‚· μœ μ‹€ μ‹œ μœ μ‹€λœ μ‹œμ λΆ€ν„° μž¬μ „μ†‘ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. μˆ˜μ‹ μΈ‘μ€ μˆœμ„œλŒ€λ‘œ νŒ¨ν‚·μ΄ λ„μ°©ν•˜μ§€ μ•Šμ•˜μ„ 경우 νŒ¨ν‚·μ„ νκΈ°ν•˜λ©° NACK νŒ¨ν‚·μœΌλ‘œ μœ μ‹€λœ νŒ¨ν‚·μ„ μž¬μ „μ†‘ μš”μ²­ν•©λ‹ˆλ‹€. λ§Œμ•½ μˆ˜μ‹ μΈ‘μ€ μž¬μ „μ†‘ 타이머가 μ™„λ£Œλ˜κΈ° μ „κΉŒμ§€ 응닡 νŒ¨ν‚·μ„ 받지 λͺ»ν•  경우 응닡을 받지 λͺ»ν•œ νŒ¨ν‚·λΆ€ν„° μž¬μ „μ†‘ν•©λ‹ˆλ‹€.

 

Selective Repeat ARQμž…λ‹ˆλ‹€. μŠ¬λΌμ΄λ”© μœˆλ„μš°λ₯Ό μ΄μš©ν•˜μ—¬ ν•œλ²ˆμ— μ—¬λŸ¬ νŒ¨ν‚·μ„ 보낼 수 있으며 νŒ¨ν‚· μœ μ‹€ μ‹œ μœ μ‹€λœ νŒ¨ν‚·λ§Œ μž¬μ „μ†‘ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. μˆ˜μ‹ μΈ‘μ€ μˆœμ„œλŒ€λ‘œ νŒ¨ν‚·μ΄ λ„μ°©ν•˜μ§€ μ•Šμ•˜μ„ 경우 νŒ¨ν‚·μ„ 버퍼에 λ³΄κ΄€ν•˜λ©° NACK νŒ¨ν‚·μœΌλ‘œ μœ μ‹€λœ νŒ¨ν‚·μ„ μž¬μ „μ†‘ μš”μ²­ν•©λ‹ˆλ‹€. μž¬μ „μ†‘ 받은 ν›„ 버퍼에 λ³΄κ΄€λœ νŒ¨ν‚·κ³Ό μž¬μ •λ ¬ν•©λ‹ˆλ‹€. λ§Œμ•½ μˆ˜μ‹ μΈ‘μ€ μž¬μ „μ†‘ 타이머가 μ™„λ£Œλ˜κΈ° μ „κΉŒμ§€ 응닡 νŒ¨ν‚·μ„ 받지 λͺ»ν•  경우 응닡을 받지 λͺ»ν•œ νŒ¨ν‚·λΆ€ν„° μž¬μ „μ†‘ν•©λ‹ˆλ‹€. κ°€μž₯ νš¨μœ¨μ μ΄μ§€λ§Œ 비ꡐ적 λ³΅μž‘ν•˜κ³  별도 버퍼와 μž¬μ •λ ¬μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ λ“±μž₯ν•˜λŠ” μŠ¬λΌμ΄λ”© μœˆλ„μš°(Sliding Window)λŠ” μˆ˜μ‹ μΈ‘κ³Ό 솑신츑이 λ„€νŠΈμ›Œν¬ 상황과 λ©”λͺ¨λ¦¬ 버퍼λ₯Ό κ³ λ €ν•˜μ—¬ ν•œλ²ˆμ— μ²˜λ¦¬ν•  수 μžˆλŠ” λ©”λͺ¨λ¦¬ 버퍼 μ•ˆμ— μœˆλ„μš° μ‚¬μ΄μ¦ˆλ₯Ό ν˜‘μ˜ν•©λ‹ˆλ‹€. μˆ˜μ‹ μΈ‘μ€ μœˆλ„μš° μ‚¬μ΄μ¦ˆ μ΄λ‚΄μ—μ„œ ν•œλ²ˆμ— νŒ¨ν‚·μ„ μ „μ†‘ν•˜λ©° ACK νŒ¨ν‚·μ„ 받은 ν›„ μƒˆλ‘œμš΄ νŒ¨ν‚·μ΄ μžˆλŠ” λ°©ν–₯으둜 λ―ΈλŠ” 과정을 λ°˜λ³΅ν•©λ‹ˆλ‹€. μˆ˜μ‹ μΈ‘μ€ ν˜„μž¬ μˆ˜μ‹ ν•  수 μžˆλŠ” μ—¬μœ  μœˆλ„μš° μ‚¬μ΄μ¦ˆ(RWND) μ „μ†‘ν•˜λ©΄ 솑신츑은 이λ₯Ό μ°Έκ³ ν•˜μ—¬ 전솑 μœˆλ„μš° μ‚¬μ΄μ¦ˆ(AWND)λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€. λ§Œμ•½ λ„€νŠΈμ›Œν¬ 상황이 쒋지 μ•Šμ•„ 혼작 μ œμ–΄λ₯Ό μœ„ν•΄ μœˆλ„μš° μ‚¬μ΄μ¦ˆμ˜ μ‘°μ ˆν•΄μ•Ό ν•œλ‹€λ©΄ 솑신츑은 혼작 μœˆλ„μš° μ‚¬μ΄μ¦ˆ(CWND)λ₯Ό ν•¨κ»˜ μ°Έκ³ ν•˜μ—¬ 전솑 μœˆλ„μš° μ‚¬μ΄μ¦ˆ(AWND)λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.

 

2. TCP

TCPλŠ” μ‹ λ’°μ„± 높은 전솑을 λͺ©ν‘œλ‘œ ν•˜λ©° 였λ₯˜μ™€ 흐름을 μ œμ–΄ν•˜κΈ° μœ„ν•΄μ„œ 였λ₯˜ κ²€μΆœ 방식, 확인 응닡, ARQ λͺ¨λ‘ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜ TCPλ₯Ό μ‚¬μš©ν•˜λŠ” TLS 1.2의 전솑을 보면 μ‹€μ œ 데이터가 졜초 μ „μ†‘λ˜κΈ°κΉŒμ§€ 두차둀 νŒ¨ν‚·(3 Way Handshaking, TLS Handshaking) κ΅ν™˜μ΄ ν•„μš”ν•©λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ 3 Way Handshkaing은 ν•„μˆ˜μ΄μ§€λ§Œ TLS Handshaking은 HTTP μ•”ν˜Έν™”λ₯Ό μœ„ν•œ 과정이라 μ•”ν˜Έν™”κ°€ ν•„μš” 없을 μ‹œ μƒλž΅λ  수 있으며 이후 응닡 νŒ¨ν‚·μ˜ μ—¬λΆ€λ₯Ό ν™•μΈν•˜λ©° 데이터λ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€.

 

첫번재 였λ₯˜ κ²€μΆœ λ°©μ‹μœΌλ‘œλŠ” 체크섬 ν•„λ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ™€ 같이 TCP νŒ¨ν‚·μ—λŠ” 체크섬 ν•„λ“œκ°€ ν•„μˆ˜λ‘œ 있으며 μƒνƒœ ν•„λ“œ 값을 ν†΅ν•˜μ—¬ ν•΄λ‹Ή νŒ¨ν‚·μ˜ 였λ₯˜ κ²€μΆœ μ—¬λΆ€λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ‘λ²ˆμ§Έ 확인 μ‘λ‹΅μœΌλ‘œλŠ” μ‘λ‹΅ νŒ¨ν‚·μ„ μ†‘μˆ˜μ‹ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ™€ 같이 TCPλŠ” νŒ¨ν‚· 전솑 ν›„ 응닡 νŒ¨ν‚·μ„ ν†΅ν•˜μ—¬ μˆ˜μ‹ μΈ‘μ˜ νŒ¨ν‚· 전솑 μ—¬λΆ€λ₯Ό ν™•μΈν•©λ‹ˆλ‹€. λ‹€λ§Œ 이 κ³Όμ •μ—μ„œ ACK νŒ¨ν‚·λ§Œ μ‚¬μš©ν•©λ‹ˆλ‹€. NACK νŒ¨ν‚·μ„ ν•¨κ»˜ μ‚¬μš©ν•  경우 μˆ˜μ‹ μΈ‘μ΄ νŒ¨ν‚·μ„ ν™•μΈν•˜λŠ” 과정이 ν•„μš”ν•˜μ—¬ 혼작 μ œμ–΄μ˜ 3 Duplicate ACKλ₯Ό 톡해 νŠΉμ • ACK νŒ¨ν‚·μ„ μ„Έλ²ˆ 받을 경우 νŒ¨ν‚· μœ μ‹€λ‘œ κ°„μ£Όν•˜κ³  μž¬μ „μ†‘ν•©λ‹ˆλ‹€.

 

μ„Έλ²ˆμ§Έ ARQλ‘œλŠ” Go Back N ARQ와 Selective Repeat ARQλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜κ³  있으며 μŠ¬λΌμ΄λ”© μœˆλ„μš°λ₯Ό μ΄μš©ν•˜μ—¬ ν•œλ²ˆμ— μ—¬λŸ¬ νŒ¨ν‚·μ„ 보낼 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ™€ 같이 μ—¬λŸ¬κ°€μ§€ 상황에 따라 νŒ¨ν‚·μ„ μž¬μ „μ†‘ν•˜μ—¬ μ†‘μˆ˜μ‹ μΈ‘μ€ ν˜„μž¬ κ°€λŠ₯ν•œ μœˆλ„μš° μ‚¬μ΄μ¦ˆλ₯Ό κ³΅μœ ν•˜κ³  μ‘°μ ˆν•©λ‹ˆλ‹€.

 

3. UDP

UDPλŠ” λΉ λ₯Έ 전솑을 λͺ©ν‘œλ‘œ ν•˜λ©° μ΅œμ†Œν•œμ˜ 였λ₯˜λ₯Ό μ œμ–΄ν•˜κΈ° μœ„ν•΄ 였λ₯˜ κ²€μΆœ λ°©μ‹λ§Œμ„ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜ UDPλ₯Ό μ‚¬μš©ν•˜λŠ” QUIC(HTTP3)의 전솑을 보면 μ‹€μ œ 데이터가 졜초 μ „μ†‘λ˜κΈ°κΉŒμ§€ ν•œμ°¨λ‘€ νŒ¨ν‚·(QUIC Handshaking) κ΅ν™˜μ΄ ν•„μš”ν•©λ‹ˆλ‹€. 이 과정도 HTTP μ•”ν˜Έν™”λ₯Ό μœ„ν•œ 과정이라 μ•”ν˜Έν™”κ°€ ν•„μš” 없을 μ‹œ μƒλž΅λ  수 있으며 이후 응닡 νŒ¨ν‚· 없이 λΉ λ₯΄κ²Œ 데이터λ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€.

 

였λ₯˜ κ²€μΆœ λ°©μ‹μœΌλ‘œλŠ” μ²΄ν¬μ„¬ ν•„λ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ™€ 같이 UDP νŒ¨ν‚·μ—λŠ” 체크섬 ν•„λ“œκ°€ ν•„μˆ˜λ‘œ 있으며 μƒνƒœ ν•„λ“œ 값을 ν†΅ν•˜μ—¬ ν•΄λ‹Ή νŒ¨ν‚·μ˜ 였λ₯˜ κ²€μΆœ μ—¬λΆ€λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.