🌏 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에 명시되어 있는 상태와 다이어그램은 다음과 같다.

- LISTEN : 서버가 연결을 수신하고자 할 때, 연결을 기다리는 상태.
- SYN-SENT : 클라이언트가 서버에게 연결 요청을 보낸 후, 서버로부터 승인을 기다리는 상태.
- SYN-RECEIVED : 서버가 연결 요청을 수신받으면, 연결 요청에 대한 응답을 보내고 클라이언트로부터 연결 확인을 기다리는 상태.
- ESTABLISHED : 클라이언트와 서버가 연결된 상태.
- FIN-WAIT-1 : 서버 또는 클라이언트가 연결을 종료하고자 할 때 연결 종료 요청을 보내고 그에 대한 응답을 기다리는 상태.
- FIN-WAIT-2 : 연결 종료 요청을 보낸 쪽이 그에 대한 응답을 받고 나서 기다리는 상태.
- CLOSING : 연결 종료 요청을 보낸 쪽이 ??
- CLOSE-WAIT : 연결 종료 요청을 받은 쪽이 연결 종료 요청을 기다림.
- TIME-WAIT : 연결 종료 요청을 보낸 쪽이 그에 대한 응답을 기다리는 상태.
- LAST-ACK (LAST_WAIT) : 연결 종료 요청을 받은 쪽이 연결 종료 요청을 받고 응답을 기다리는 상태.
- CLOSED : 연결이 완전히 종료된 상태.
TCP 연결과 해제

3-Way Handshake (연결)
Step 1
- 클라이언트 : 서버로 SYN 세그먼트를 보내 연결을 요청하고,
SYN_SENT상태가 된다. (SYN_SENT)
- 서버 :
LISTEN상태에서 특정 포트로부터 요청을 받을 준비를 한다. 클라이언트에게 SYN 세그먼트를 받으면SYN_RECV상태가 된다. (LISTEN→SYN_RECV)
Step 2
- 서버 :
SYN_RECV상태가 되면, 클라이언트로 SYN + ACK 세그먼트를 보내고 클라이언트의 ACK 패킷을 기다린다.
- 클라이언트 : 서버의 SYN + ACK 세그먼트를 기다린다. (
SYN_SENT)
Step 3
- 클라이언트 : 서버로부터 SYN + ACK 세그먼트를 받으면 ACK 세그먼트를 보내고, 연결이 수립된 것으로 판단하여
ESTABLISHED상태가 된다. (SYN_SENT→ESTABLISHED)
- 서버 : 클라이언트의 ACK 세그먼트를 받으면, 연결이 수립된 것으로 판단하여
ESTABLISHED상태가 된다. (SYN_RECV→ESTABLISHED)
4-Way Handshake (연결 종료)
연결은 클라이언트가 먼저 시작해야 하지만, 연결 해제는 그렇지 않다.
연결을 해제한 쪽을
Active Close 라고 표현하고, 상대방을 Passive Close 라고 표현한다.Step 1
- Active Close : Passive Close에게 FIN + ACK 세그먼트를 보내며 자신은
FIN_WAIT_1상태가 된다. (ESTABLISHED→FIN_WAIT_1)
- Passive Close : Active Close에게 FIN + ACK 세그먼트를 받으면
CLOSE_WAIT상태가 된다. (ESTABLISHED→CLOSE_WAIT)
Step 2
- Passive Close :
CLOSE_WAIT상태가 되면 Active Close에게 ACK 세그먼트를 보낸다. (CLOSE_WAIT)
- Active Close : Passive Close에게 ACK 세그먼트를 받으면
FIN_WAIT_2상태가 된다. (FIN_WAIT_1→FIN_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_WAIT→LAST_ACK)
- Active Close : Passive Close에게 FIN 패킷을 받으면
FIN_WAIT_2에서TIME_WAIT상태가 된다. 그리고 Passive Close에게 ACK 세그먼트를 보낸다 (FIN_WAIT_2→TIME_WAIT)
Step 4
- Active Close :
TIME_WAIT상태에서 일정 시간 (보통 60초) 기다리다가,CLOSED상태가 된다. (TIME_WAIT→CLOSED)
- Passive Close : Active Close에게 ACK 세그먼트를 받으면 CLOSED 된다. (
LAST_ACK→CLOSED)