3-way handshake

sunnyjjang·2025년 5월 22일

네트워크

목록 보기
11/26
post-thumbnail

1. 3-way handshake

  • 3-way handshake 란?

클라이언트와 서버 간 연결 설정을 위한 통신 절차

클라이언트 -> 서버: SYN (연결 요청)
서버 -> 클라이언트: SYN-ACK (연결 승인)
클라이언트 -> 서버: ACK (연결 확인)
  • 목적
  1. 상호 연결 확인: 클라이언트와 서버가 서로 연결할 준비가 되었는지 확인

  2. 데이터 전송을 위한 초기화: 서로의 시퀀스 번호를 초기화하여 데이터 전송 순서 관리

    → ISN과 SYN 으로 클라이언트와 서버의 초기 시퀀스 번호를 확인 후, 해당 번호 이후의 데이터를 수신

  3. 양방향 통신 보장 (Full-Duplex Communication): 양방향으로 데이터 통신할 수 있도록 설정

    → (클라이언트 → 서버), (서버 → 클라이언트) 방향으로 독립적인 데이터 전송 가능

  • 동작 원리
  1. 클라이언트 -> 서버: SYN
    • 클라이언트가 서버로 연결 요청 요청으로 시퀀스 번호(ISN)을 포함한 SYN 전송
    • ISN(Initial Sequence Number): 초기 시퀀스 번호
  2. 서버 -> 클라이언트: SYN-ACK
    • 서버가 연결 요청 수락 클라이언트의 SYN을 수신하고 서버의 시퀀스 번호(ISN)와 승인번호 ACK 전송
    • ACK: 클라이언트의 시퀀스 번호에 대한 확인 응답 ISN + 1
  3. 클라이언트 -> 서버: ACK
    • 클라이언트가 서버의 SYN+ACK 응답을 확인하고 ACK 전송
    • ACK: 서버의 시퀀스 번호에 대한 확인 응답 SYN + 1
  4. 연결 설정 완료
[클라이언트]                                              [서버]
-------------------------------------------------------------
| SYN (SEQ=1000)  ───────────────────────────→              |
|                         ←── SYN, ACK (SEQ=2000, ACK=1001) |
| ACK (SEQ=1001, ACK=2001) ─────────────────────→           |
-------------------------------------------------------------

2. TCP 4-Way Handshake (연결 해제)

  • TCP 4-Way Handshake란?

클라이언트와 서버 간의 TCP 연결을 안전하게 종료하기 위해 사용하는 4단계 절차

  • 목적

클라이언트와 서버가 안전하게 데이터 전송을 종료하고, 자원을 해제할 수 있도록 함

양방향 연결 종료: TCP 연결은 양방향이므로 각각 독립적으로 종료 가능

  • 동작 원리
  1. 클라이언트 -> 서버: FIN
    • 클라이언트가 서버로 종료 요청 클라이언트의 시퀀스 번호를 포함한 FIN 플래그 전송
  2. 서버 -> 클라이언트: ACK
    • 서버가 종료 요청 확인 → 클라이언트의 연결 종료 OK, 서버는 여전히 통신 가능
    • ACK: 클라이언트의 시퀀스 번호에 대한 확인 응답 ISN + 1
  3. 서버 -> 클라이언트: FIN
    • 서버가 클라이언트로 종료 요청 서버의 시퀀스 번호를 포함한 FIN 플래그 전송
  4. 클라이언트 -> 서버: ACK
    • 클라이언트가 서버의 종료 요청 확인 → 서버의 연결 종료 OK
    • ACK: 서버의 시퀀스 번호에 대한 확인 응답 ISN + 1
  5. TCP 연결 종료 완료
[클라이언트]                                         [서버]
--------------------------------------------------------
| FIN (SEQ=1000) ───────────────────────────→          |
|                         ← ACK (SEQ=2000, ACK=1001)   |
|                         ← FIN (SEQ=2000)             |
| ACK (SEQ=1001, ACK=2001) ─────────────────────→      |
--------------------------------------------------------
  • 상태 변화
  1. 클라이언트 -> 서버: FIN
    • 클라이언트 상태: FIN-WAIT-1 → 클라이언트는 연결 종료 요청을 했지만,서버는 여전히 데이터 전송 가능한 상태
  2. 서버 -> 클라이언트: ACK
    • 서버 상태: CLOSE_WAIT → 서버는 클라이언트의 FIN 요청을 확인했지만, 클라이언트로 데이터를 계속 전송 가능한 상태
    • 클라이언트 상태: FIN-WAIT-2 → 클라이언트가 서버의 ACK 수신 후, 서버의 FIN 기다리며 연결 유지
  3. 서버 -> 클라이언트: FIN
    • 서버 상태: LAST_ACK
  4. 클라이언트 -> 서버: ACK
    • 클라이언트 상태: TIME_WAIT → 클라이언트가 서버의 FIN을 확인하고 최종 ACK 전송
    • 서버 상태: CLOSED
    • 클라이언트 상태: CLOSED
[클라이언트]                                    [서버]
---------------------------------------------------------
| ESTABLISHED ──────────────────────────────→ ESTABLISHED |
| FIN-WAIT-1 (FIN) ─────────────────────────→ CLOSE-WAIT  |
| FIN-WAIT-2 ◀────────── ACK ──────────────── CLOSE-WAIT  |
| FIN-WAIT-2 ◀────────── FIN ──────────────── LAST-ACK    |
| TIME-WAIT ──────────── ACK ───────────────→ CLOSED      |
| CLOSED                                        CLOSED      |
---------------------------------------------------------
  • TIME_WAIT의 목적
  1. 지연된 FIN 패킷 재수신에 대비

    → 클라이언트가 마지막 ACK 전송 후, 네트워크 지연으로 인해 서버가 ACK를 받지 못하고 다시 FIN을 재전송될 가능성을 대비

  2. 패킷 충돌 방지 = 포트 쌍을 잠시 봉인 …

    → 동일한 포트로 곧바로 새 연결을 시도할 경우, 네트워크 상에 지연되어 남아있는 이전 패킷이 새 연결로 착각되어 전달되며 데이터 혼동을 야기할 수 있음

profile
지금 이 순간이 다시 넘겨볼 수 있는 한 페이지가 될 수 있게

0개의 댓글