Post

3-way handshake & 4-way handshake

🎬 Intro

3-way handshake & 4-way handshake에 λŒ€ν•΄ μ•Œμ•„λ΄…μ‹œλ‹€.

βœ… 3-way handshake

img.png

3-Way HandshakeλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ™€ 연결을 μ„€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€. 이 과정은 연결을 μ•ˆμ •μ μœΌλ‘œ μ„€μ •ν•˜κ³ , 데이터 전솑을 μ‹œμž‘ν•˜κΈ° 전에 톡신 경둜λ₯Ό ν™•μΈν•˜λŠ” λ‹¨κ³„μž…λ‹ˆλ‹€.

  • SYN (Synchronization): μ—°κ²° μš”μ²­μ„ λ‚˜νƒ€λ‚΄λ©°, ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— μ„Έμ…˜μ„ μ„€μ •ν•˜κΈ° μœ„ν•΄ 초기 μ‹œν€€μŠ€ 번호λ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€.
  • ACK (Acknowledgement): μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ˜ μ‹œν€€μŠ€ λ²ˆν˜Έμ— 1을 λ”ν•œ ACKλ₯Ό λ°˜ν™˜ν•˜μ—¬ μš”μ²­μ„ ν™•μΈν•©λ‹ˆλ‹€.

Step 1: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œ SYN 전솑

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ™€μ˜ 연결을 μ„€μ •ν•˜κΈ° μœ„ν•΄ SYN νŒ¨ν‚·μ„ μ „μ†‘ν•©λ‹ˆλ‹€. 이 νŒ¨ν‚·μ—λŠ” ν΄λΌμ΄μ–ΈνŠΈ 츑의 초기 μ‹œν€€μŠ€ λ²ˆν˜Έκ°€ ν¬ν•¨λ©λ‹ˆλ‹€.
  • 초기 μ‹œν€€μŠ€ 번호(ISN) λ‚œμˆ˜λ‘œ μ§€μ •λ©λ‹ˆλ‹€.
    • 컀λ„₯μ…˜μ„ 맺을 λ•Œ μ‚¬μš©ν•˜λŠ” ν¬νŠΈλŠ” μœ ν•œν•œ λ²”μœ„ λ‚΄μ—μ„œ μ‚¬μš©λ˜λ©°, μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ μž¬μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 두 톡신 ν˜ΈμŠ€νŠΈκ°€ 과거에 μ‚¬μš©λœ 포트 번호 μŒμ„ λ‹€μ‹œ μ‚¬μš©ν•  κ°€λŠ₯성이 μ‘΄μž¬ν•©λ‹ˆλ‹€. μ„œλ²„ μΈ‘μ—μ„œλŠ” μ„Έκ·Έλ¨ΌνŠΈμ˜ SYN을 보고 μ„Έκ·Έλ¨ΌνŠΈλ₯Ό κ΅¬λΆ„ν•˜λŠ”λ°, λ§Œμ•½ μ‹œν€€μŠ€ λ²ˆν˜Έκ°€ λ‚œμˆ˜κ°€ μ•„λ‹Œ 순차적인 번호둜 μ „μ†‘λœλ‹€λ©΄, μ΄μ „μ˜ 컀λ„₯μ…˜μ—μ„œ 온 μ„Έκ·Έλ¨ΌνŠΈλ‘œ 잘λͺ» 인식될 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 문제λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 초기 μ‹œν€€μŠ€ 번호(ISN)λŠ” λ‚œμˆ˜λ‘œ μ„€μ •λ©λ‹ˆλ‹€.

    • 예λ₯Ό λ“€μ–΄, 이전 μ—°κ²°μ—μ„œ μ‚¬μš©λœ ISN이 100이고, ν˜„μž¬ μ—°κ²°μ—μ„œ μ‚¬μš©λœ ISN이 200이라고 κ°€μ •ν•˜λ©΄, 이전 μ—°κ²°μ˜ 데이터 μ„Έκ·Έλ¨ΌνŠΈλŠ” μ‹œν€€μŠ€ 번호 100λΆ€ν„° μ‹œμž‘ν•  κ²ƒμž…λ‹ˆλ‹€. λ°˜λ©΄μ—, μƒˆλ‘œμš΄ μ—°κ²°μ—μ„œλŠ” ISN이 200λΆ€ν„° μ‹œμž‘ν•˜λ―€λ‘œ, μ„œλ‘œ λ‹€λ₯Έ μ‹œν€€μŠ€ 번호둜 인해 이전 μ—°κ²°μ˜ 데이터가 ν˜„μž¬ μ—°κ²°λ‘œ 잘λͺ» μ „λ‹¬λ˜λŠ” 상황을 λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Step 2: μ„œλ²„κ°€ SYN + ACK 전솑

  • μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° SYN νŒ¨ν‚·μ„ μˆ˜μ‹ ν•œ ν›„, μš”μ²­μ„ μˆ˜λ½ν–ˆμŒμ„ λ‚˜νƒ€λ‚΄λŠ” ACK νŒ¨ν‚·κ³Ό μ„œλ²„ 츑의 μ‹œν€€μŠ€ 번호λ₯Ό 담은 SYN νŒ¨ν‚·μ„ λ™μ‹œμ— λ³΄λƒ…λ‹ˆλ‹€.
  • μ„œλ²„λ„ ν΄λΌμ΄μ–ΈνŠΈμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λ‚œμˆ˜λ₯Ό μ‹œν€€μŠ€ 번호둜 μ„€μ •ν•©λ‹ˆλ‹€.
  • μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ³΄λ‚΄λŠ” ACKλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 보낸 μ‹œν€€μŠ€ λ²ˆν˜Έμ— +1을 ν•œ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

Step 3: ν΄λΌμ΄μ–ΈνŠΈκ°€ ACK 전솑

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„λ‘œλΆ€ν„° SYNκ³Ό ACK νŒ¨ν‚·μ„ λ°›μœΌλ©΄, μ„œλ²„μ˜ μ‹œν€€μŠ€ λ²ˆν˜Έμ— +1을 ν•œ ACK νŒ¨ν‚·μ„ μ„œλ²„λ‘œ μ „μ†‘ν•©λ‹ˆλ‹€.
  • 이 μ‹œμ μ—μ„œ ν’€ λ“€ν”Œλ ‰μŠ€(Full-Duplex) 톡신이 κ΅¬μΆ•λ˜λ©°, μ–‘λ°©ν–₯ 데이터 전솑이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • Full - duplex ν†΅μ‹ μ˜ ꡬ성
    • step 1,2 μ—μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈ β†’ μ„œλ²„ λ°©ν–₯에 λŒ€ν•œ μ—°κ²° νŒŒλΌλ―Έν„°λ₯Ό μ„€μ • ν•˜κ³  이λ₯Ό μ„œλ²„κ°€ 승인
    • step 2,3 μ—μ„œλŠ” μ„œλ²„ β†’ ν΄λΌμ΄μ–ΈνŠΈ λ°©ν–₯에 λŒ€ν•œ μ—°κ²° νŒŒλΌλ―Έν„°λ₯Ό μ„€μ • ν•˜κ³  이λ₯Ό ν΄λΌμ΄μ–ΈνŠΈκ°€ 승인
    • 이λ₯Ό 톡해 full-duplex 톡신이 ꡬ좕

img.png

βœ… 4-way handshake

4-Way HandshakeλŠ” TCP μ—°κ²° μ’…λ£Œ 과정을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 연결을 μ’…λ£Œν•  λ•ŒλŠ” FIN ν”Œλž˜κ·Έκ°€ μ‚¬μš©λ˜λ©°, ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„κ°€ λͺ¨λ‘ 데이터λ₯Ό 전솑 μ™„λ£Œν–ˆμŒμ„ ν™•μΈν•˜λŠ” 과정을 κ±°μΉ©λ‹ˆλ‹€.

  • FIN (Finish): 더 이상 전솑할 데이터가 μ—†μŒμ„ λ‚˜νƒ€λ‚΄λ©°, 연결을 μ’…λ£Œν•˜κΈ° μœ„ν•œ μš”μ²­μž…λ‹ˆλ‹€.

Step 1: ν΄λΌμ΄μ–ΈνŠΈ β†’ μ„œλ²„λ‘œ FIN 전솑

  • ν΄λΌμ΄μ–ΈνŠΈκ°€ 연결을 μ’…λ£Œν•˜λ €κ³  ν•  λ•Œ FIN νŒ¨ν‚·μ„ μ „μ†‘ν•©λ‹ˆλ‹€. 이 νŒ¨ν‚·μ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ 더 이상 보낼 데이터가 μ—†μŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

Step 2: μ„œλ²„κ°€ ACK 전솑

  • μ„œλ²„λŠ” FIN νŒ¨ν‚·μ„ μˆ˜μ‹ ν•˜κ³ , 이에 λŒ€ν•œ ACK νŒ¨ν‚·μ„ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ „μ†‘ν•©λ‹ˆλ‹€. ACKλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 보낸 μ‹œν€€μŠ€ λ²ˆν˜Έμ— +1을 더해 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μ„œλ²„λŠ” 아직 전솑할 데이터가 남아 μžˆμ„ 수 μžˆμœΌλ―€λ‘œ, ν΄λΌμ΄μ–ΈνŠΈκ°€ FIN을 보낸 후에도 연결을 μœ μ§€ν•©λ‹ˆλ‹€.

Step 3: μ„œλ²„κ°€ FIN 전솑

  • μ„œλ²„λŠ” λͺ¨λ“  데이터λ₯Ό μ „μ†‘ν•œ ν›„, FIN νŒ¨ν‚·μ„ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ „μ†‘ν•©λ‹ˆλ‹€. μ΄λŠ” μ„œλ²„ μΈ‘μ—μ„œ 더 이상 보낼 데이터가 μ—†μŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

Step 4: ν΄λΌμ΄μ–ΈνŠΈκ°€ ACK 전솑

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ˜ FIN νŒ¨ν‚·μ„ μˆ˜μ‹ ν•œ ν›„ ACK νŒ¨ν‚·μ„ μ „μ†‘ν•©λ‹ˆλ‹€. 이둜써 μ–‘μͺ½ λͺ¨λ‘ μ—°κ²° μ’…λ£Œλ₯Ό ν™•μΈν•˜λ©°, TIME_WAIT μƒνƒœμ— μ§„μž…ν•˜μ—¬ μž μ‹œ λŒ€κΈ°ν•œ ν›„ 연결이 μ™„μ „νžˆ μ’…λ£Œλ©λ‹ˆλ‹€.

❓TCP κ΄€λ ¨ 질문

Q1: TCP μ—°κ²° μ„€μ •(3단계)κ³Ό μ—°κ²° μ’…λ£Œ(4단계) 과정이 단계가 λ‹€λ₯Έ 이유?

λ‹΅λ³€: ν΄λΌμ΄μ–ΈνŠΈκ°€ 데이터 전솑을 μ’…λ£Œν–ˆλ”λΌλ„ μ„œλ²„λŠ” 아직 보낼 데이터가 남아 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ FIN νŒ¨ν‚·μ„ 보내면 μ„œλ²„λŠ” ACK νŒ¨ν‚·μœΌλ‘œ μ‘λ‹΅ν•œ ν›„, 데이터λ₯Ό λͺ¨λ‘ μ „μ†‘ν•œ λ‹€μŒμ—μ•Ό FIN νŒ¨ν‚·μ„ λ³΄λ‚΄κ²Œ λ©λ‹ˆλ‹€. 이 λ•Œλ¬Έμ— μ—°κ²° μ’…λ£Œ 과정은 4λ‹¨κ³„λ‘œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

Q2: μ„œλ²„μ—μ„œ FIN νŒ¨ν‚·λ³΄λ‹€ 늦게 λ„μ°©ν•˜λŠ” νŒ¨ν‚·μ΄ μžˆμ„ 경우?

λ‹΅λ³€: μ΄λŸ¬ν•œ 상황에 λŒ€λΉ„ν•΄ ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„λ‘œλΆ€ν„° FIN νŒ¨ν‚·μ„ μˆ˜μ‹ ν•˜λ”λΌλ„ TIME_WAIT μƒνƒœμ— λ“€μ–΄κ°‘λ‹ˆλ‹€. 이 κΈ°κ°„ λ™μ•ˆ μž‰μ—¬ νŒ¨ν‚·μ„ 기닀리며, 기본적으둜 240초 λ™μ•ˆ μ„Έμ…˜μ„ μœ μ§€ν•˜κ³  νŒ¨ν‚·μ„ μˆ˜μ‹ ν•  μ€€λΉ„λ₯Ό ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ§€μ—°λœ νŒ¨ν‚·μ΄ 연결이 μ’…λ£Œλœ 이후에도 μ•ˆμ „ν•˜κ²Œ 처리될 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

Q3: 초기 μ‹œν€€μŠ€ 번호(ISN)λ₯Ό λ‚œμˆ˜λ‘œ μƒμ„±ν•˜λŠ” 이유?

λ‹΅λ³€: 포트 λ²ˆν˜ΈλŠ” μœ ν•œν•œ λ²”μœ„λ₯Ό κ°€μ§€λ©°, μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ μž¬μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 이전 μ—°κ²°μ—μ„œ μ‚¬μš©λœ 포트 λ²ˆν˜Έμ™€ μ‹œν€€μŠ€ λ²ˆν˜Έκ°€ μƒˆλ‘œμš΄ μ—°κ²°κ³Ό 쀑볡될 κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 초기 μ‹œν€€μŠ€ 번호(ISN)λ₯Ό λ‚œμˆ˜λ‘œ μ„€μ •ν•˜μ—¬ μ€‘λ³΅λœ 데이터 νŒ¨ν‚·μ΄ 잘λͺ»λœ μ—°κ²°λ‘œ μΈμ‹λ˜λŠ” 것을 λ°©μ§€ν•©λ‹ˆλ‹€.


✨ Summary

TCP의 3-Way HandshakeλŠ” μ•ˆμ •μ μΈ 연결을 μ„€μ •ν•˜κΈ° μœ„ν•œ 과정이며, 4-Way HandshakeλŠ” μ•ˆμ „ν•˜κ²Œ 연결을 μ’…λ£Œν•˜κΈ° μœ„ν•œ κ³Όμ •μž…λ‹ˆλ‹€. 각각의 λ‹¨κ³„μ—μ„œ μ‹œν€€μŠ€ λ²ˆν˜Έμ™€ ACK 번호λ₯Ό ν™œμš©ν•˜μ—¬ 데이터 μ „μ†‘μ˜ 신뒰성을 보μž₯ν•˜λ©°, 이λ₯Ό 톡해 TCPλŠ” μ‹ λ’°μ„± μžˆλŠ” 톡신을 μ œκ³΅ν•©λ‹ˆλ‹€.

This post is licensed under CC BY 4.0 by the author.