[네트워크] TCP의 연결 및 해제(3,4 way handshaking)

jh Seo·2025년 5월 28일
0

네트워크 공부

목록 보기
6/16

3way handshaking(TCP의 링크 설정)

  1. 클라이언트는 접속을 요청하는 SYN 패킷을 보낸다.
    이 때, 클라이언트는 응답을 기다리기 위해 SYN_SENT 상태로 변한다.
    서버는 LISTEN상태로 대기중이다.

    • SYN_SENT: SYN을 요청한 상태
    • LISTEN: 포트가 열린 상태로 연결 요청에 대기 하는 중
  2. LISTEN 상태였던 서버는 SYN 요청을 받으면,
    클라이언트에게 요청을 수락하는 ACK 패킷과 SYN 패킷을 보낸다.
    (양방향 통신이기 때문에 서버도 클라이언트에 접속하기 위해 SYN 패킷을 보냄)
    서버는 SYN_RECEIVED상태로 전환 후 대기한다.

    • SYN_RECEIVED: SYN요청을 받고 상대방의 응답을 기다리는중
  3. SYN/ACK 패킷을 받은 클라이언트는 서버에 ACK 패킷을 보내고 ESTABLISHED 상태로 전환한다.
    ACK 패킷을 받은 서버 또한 ESTABLISHED 상태로 전환되면 연결 수립이 완료된다.

    • ESTABLISHED: 연결 수립이 완료된 상태, 서로 데이터를 교환할 수 있다

자세한 설명

  1. Client → Server SYN 보내기
  • 클라이언트가 연결을 시작
  • 클라이언트는 서버에 SYN 플래그 비트를 1로 설정해 세그먼트를 서버에 전송
  • 자신의 초기 시퀀스 번호(ISN)도 함께 보냄
  • 데이터는 없음(오직 연결 요청)
  • Client → Server: [SYN, seq=1000]
  1.  Server → Client SYN-ACK 응답
  • 서버는 클라이언트의 SYN을 수신하고, 서버의 ISN(Initial Sequence number)을 보내며 승인번호(ACK #)로 클라이언트의 ISN+1을 보냄
  • SYN 플래그 비트를 1로 설정해 세그먼트를 클라이언트에 전송
  • Server → Client: [SYN, seq=5000, ACK=1001]
    (= "나는 5000번부터 시작할게. 너의 1000번도 잘 받았어")
  1. Client → Server ACK 보내기
  • 클라이언트가 서버의 SYN-ACK을 받고 최종확인
  • 클라이언트는 서버의 ISN+1한 값인 승인번호를 담아 ACK 세그먼트 전송
  • Client → Server: [ACK, seq=1001, ACK=5001]
    (= "너의 5000번 받았고, 내 다음은 1001번부터야")

데이터 통신 과정


1. 송신 측이 ESTABLISHED 상태에서 수신 측에게 데이터를 보낸다.
2. 수신 측은 잘 전송 받았다고 ACK 플래그를 넣어 응답한다.
3. 만약 송신 측에서 수신 측으로부터 ACK를 받지 못했다면 제대로 송신하지 못한 것으로 판단하고 데이터를 재전송한다.

4way handshaking(TCP의 링크 해제)

  1. 서버와 클라이언트가 TCP 연결이 되어있는 상태에서 클라이언트가 접속을 끊기 위해
    CLOSE() 함수를 호출한다.
    클라이언트가 FIN 플래그를 보내게 되고, FIN_WAIT1 상태로 대기한다.

    • FIN_WAIT1: 자신이 보낸 FIN에 대한 ACK나 FIN을 기다린다
  2. 서버는 클라이언트가 CLOSE()를 호출한 것을 알게 되고 CLOSE_WAIT 상태로 바꾼 후
    ACK 플래그를 전송한다.
    만일 서버에서 클라이언트로 보낼 데이터가 남은 경우 나머지를 모두 전송한다.

    • CLOSE_WAIT: 상대방의 FIN을 받은 상태. 상대방 FIN에 대한 ACK를 보내고 어플리케이션에 종료를 알린다
  3. ACK를 받은 클라이언트는 FIN_WAIT2 상태로 변한다.
    이 때 서버도 CLOSE() 함수를 호출하고 FIN 플래그를 클라이언트에게 전송한 후, LAST_ACK 상태로 대기한다.

    • FIN_WAIT2: 자신이 보낸 FIN에 대한 ACK를 받았고, FIN을 기다린다
    • LAST_ACK: CLOSE_WAIT 상태를 처리 후 자신의 FIN 요청을 보낸 후 ACK를 기다리는 상태
  4. FIN 플래그를 수신한 클라이언트는 ACK 플래그를 보낸 후 TIME_WAIT 상태로 전환된다.
    ACK 플래그를 받은 서버는 CLOSED 상태로 변한다.
    TIME-WAIT에서 일정 시간이 지난 클라이언트는 CLOSED 상태로 변한다.
    둘 모두 CLOSED 상태로 전환되면 연결은 완전히 종료된다.

    • TIME_WAIT: 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 기다린 후 CLOSED로 전이됨 → 혹시 모를 누락된 데이터 패킷을 기다림.
    • CLOSED: 연결 수립을 시작하기 전의 기본 상태(연결 없음)

플래그(패킷의 플래그)의 종류

  • ACK플래그가 다른 플래그와 같이 출력되는 경우:
    3-way handshaking의 2단계, SYN 플래그와 같이 전송된다.
profile
코딩 창고!

0개의 댓글