[linux] TCP 상태

nooyji·2021년 11월 4일
0

TCP State

CLOSE : 커넥션 없음
LISTEN : Passive open, SYN을 기다리는 상태
SYN-SENT : SYN을 보내고 ACK를 기다리는 상태
SYN-RCVD : SYN+ACK을 보내고 ACK를 기다리는 상태
ESTABLISHED : 커넥션이 생성된 상태, 데이터를 전송할 수 있다.
FIN-WAIT-1 : 첫 FIN이 보내진 상태, ACK를 기다리고 있다.
FIN-WAIT-2 : 첫 FIN에 대한 ACK를 받은 상태, 2번째 FIN을 기다리고 있다.
CLOSE-WAIT : 첫 FIN을 받고 ACK를 보낸 상태, 어플리케이션의 종료를 기다리고 있다.
TIME-WAIT : 2번째 FIN을 받고 ACK를 보낸 상태, 동일 포트와 주소에 커넥션이 생성되지 않도록 하는 시간(2MSL time out)을 기다리는 상태
LASK-ACK : 2번째 FIN을 보내고 ACK를 기다리는 상태
CLOSING : 양쪽이 동시에 닫기로 한 상태

TCP connection close

TCP 연결 해제 과정에서의 TCP 상태에 대해 알아보자
TCP 커넥션 종료는 클라이언트와 서버 어느 쪽에서도 할 수 있기 때문에, 클라이언트와 서버로 나누지 않고 active close와 passive close로 나눈다. 여기서 말하는 Active close와 Passive close는 다음과 같다.

Active close : TCP 연결 해제 요청한 쪽, 그러니까 트래픽을 전송(request)하고 정상적으로 전송 되었으면 연결을 끊는 쪽
Passive close : TCP 연결 해제 요청을 받은 쪽, 트래픽을 받는 쪽(api 서버라고 치면 클라이언트에게 응답을 주는 쪽)

이 포스팅에서는 Client가 Active Close, Server가 Passive Close 라고 생각한다.

Active close

  1. 클라이언트는 FIN을 전송하고 FIN-WAIT-1 상태로 전환
  2. 클라이언트는 FIN에 대한 ACK를 수신하고 FIN-WAIT-2 상태로 전환
  3. 클라이언트는 FIN을 수신하면 ACK를 전송하고 TIME-WAIT 상태로 전환
  4. TIME-WAIT 상태로 2MSL 동안 남아있는다.
  5. 타이머가 만료되면 클라이언트는 CLOSED 상태가 된다.

FIN-WAIT-2 상태에서는 일정시간이 지나면 TIME-WAIT로 전환된다.

Passive close

  1. 서버는 FIN을 수신하고 ACK를 보낸다. CLOSE-WAIT 상태로 전환
  2. 프로세스로부터 passive close 명령을 받으면 서버도 FIN을 전송한다. LAST-ACK 상태로 전환
  3. LAST-ACK 상태로 있다가 클라이언트로부터 온 마지막 ACK를 수신하면 CLOSED 상태가 된다.

Server 쪽에서 passive close를 받고 (또는 받지 못하거나) fin을 정상적으로 보내지 못하면 Server 쪽은 영원히 CLOSE_WAIT 상태로 기다리게 된다. (Client의 FIN-WAIT-2는 일정 시간이 지나면 TIME WAIT로 바뀐다)

CLOSE WAIT

FIN-WAIT는 일정 시간이 지나면 TIME-WAIT 상태로 전환되고, TIME-WAIT는 재 사용이 가능한 상태지만 CLOSE WAIT는 포트를 잡고 있는 프로세스의 종료, 네트워크 재시작 외에는 제거할 방법이 없다. (그래서 어플리케이션의 정상 종료가 필요하다.)

원문 : https://smjeon.dev/etc/tcp-state/
https://luyin.tistory.com/424

0개의 댓글