🌏 Network

TCP 연결 및 해제 과정과 상태

date
Apr 1, 2023
slug
tcp-conn-disconn
author
status
Public
tags
Network
summary
RFC 793에 정의된 TCP 연결 상태를 기반으로 연결 과정과 연결 해제에 대한 설명입니다.
type
Post
thumbnail
category
🌏 Network
updatedAt
May 24, 2023 02:04 AM
TCP 연결은 연결이 되어 있는 상태나 연결이 끊어진 상태, 연결을 기다리고 있는 상태 등 여러 상태를 가질 수 있는데 RFC 793에 명시되어 있는 상태와 다이어그램은 다음과 같다.
notion image
  • LISTEN : 서버가 연결을 수신하고자 할 때, 연결을 기다리는 상태.
  • SYN-SENT : 클라이언트가 서버에게 연결 요청을 보낸 후, 서버로부터 승인을 기다리는 상태.
  • SYN-RECEIVED : 서버가 연결 요청을 수신받으면, 연결 요청에 대한 응답을 보내고 클라이언트로부터 연결 확인을 기다리는 상태.
  • ESTABLISHED : 클라이언트와 서버가 연결된 상태.
  • FIN-WAIT-1 : 서버 또는 클라이언트가 연결을 종료하고자 할 때 연결 종료 요청을 보내고 그에 대한 응답을 기다리는 상태.
  • FIN-WAIT-2 : 연결 종료 요청을 보낸 쪽이 그에 대한 응답을 받고 나서 기다리는 상태.
  • CLOSING : 연결 종료 요청을 보낸 쪽이 ??
  • CLOSE-WAIT : 연결 종료 요청을 받은 쪽이 연결 종료 요청을 기다림.
  • TIME-WAIT : 연결 종료 요청을 보낸 쪽이 그에 대한 응답을 기다리는 상태.
  • LAST-ACK (LAST_WAIT) : 연결 종료 요청을 받은 쪽이 연결 종료 요청을 받고 응답을 기다리는 상태.
  • CLOSED : 연결이 완전히 종료된 상태.

TCP 연결과 해제

notion image

3-Way Handshake (연결)

Step 1

  • 클라이언트 : 서버로 SYN 세그먼트를 보내 연결을 요청하고, SYN_SENT 상태가 된다. (SYN_SENT)
  • 서버 : LISTEN 상태에서 특정 포트로부터 요청을 받을 준비를 한다. 클라이언트에게 SYN 세그먼트를 받으면 SYN_RECV 상태가 된다. (LISTENSYN_RECV)

Step 2

  • 서버 : SYN_RECV 상태가 되면, 클라이언트로 SYN + ACK 세그먼트를 보내고 클라이언트의 ACK 패킷을 기다린다.
  • 클라이언트 : 서버의 SYN + ACK 세그먼트를 기다린다. (SYN_SENT)

Step 3

  • 클라이언트 : 서버로부터 SYN + ACK 세그먼트를 받으면 ACK 세그먼트를 보내고, 연결이 수립된 것으로 판단하여 ESTABLISHED 상태가 된다. (SYN_SENTESTABLISHED)
  • 서버 : 클라이언트의 ACK 세그먼트를 받으면, 연결이 수립된 것으로 판단하여 ESTABLISHED 상태가 된다. (SYN_RECVESTABLISHED)

4-Way Handshake (연결 종료)

연결은 클라이언트가 먼저 시작해야 하지만, 연결 해제는 그렇지 않다.
연결을 해제한 쪽을 Active Close 라고 표현하고, 상대방을 Passive Close 라고 표현한다.

Step 1

  • Active Close : Passive Close에게 FIN + ACK 세그먼트를 보내며 자신은 FIN_WAIT_1 상태가 된다. (ESTABLISHEDFIN_WAIT_1)
  • Passive Close : Active Close에게 FIN + ACK 세그먼트를 받으면 CLOSE_WAIT 상태가 된다. (ESTABLISHEDCLOSE_WAIT)

Step 2

  • Passive Close : CLOSE_WAIT 상태가 되면 Active Close에게 ACK 세그먼트를 보낸다. (CLOSE_WAIT)
  • Active Close : Passive Close에게 ACK 세그먼트를 받으면 FIN_WAIT_2 상태가 된다. (FIN_WAIT_1FIN_WAIT_2)
    • 만약, 동시에 연결을 종료하는 상황이라 Passive Close로부터 FIN + ACK을 수신받으면 CLOSING 상태가 된다. 이 상태에서 Passive Close의 ACK을 기다리다가, 수신 완료 시 TIME_WAIT 상태가 된다.

Step 3

  • Passive Close : Passive Close도 Active Close에게 FIN + ACK 세그먼트를 보낸다. 이후 Active Close의 응답을 기다리기 위해 LAST_ACK 상태가 된다. (CLOSE_WAITLAST_ACK)
  • Active Close : Passive Close에게 FIN 패킷을 받으면 FIN_WAIT_2 에서 TIME_WAIT 상태가 된다. 그리고 Passive Close에게 ACK 세그먼트를 보낸다 (FIN_WAIT_2TIME_WAIT)

Step 4

  • Active Close : TIME_WAIT 상태에서 일정 시간 (보통 60초) 기다리다가, CLOSED 상태가 된다. (TIME_WAITCLOSED)
  • Passive Close : Active Close에게 ACK 세그먼트를 받으면 CLOSED 된다. (LAST_ACKCLOSED)