[네트워크] TCP 연결종료 및 상태변화

Robert.Yang·2023년 5월 20일
2

Network

목록 보기
28/59
post-thumbnail

이 포스트는 널널한 개발자님 강의를 참조하여 작성한 포스트입니다.

TCP 연결종료 및 상태변화

TCP 연결 종료 과정 (4-way-handshaking)

연결을 했다면 연결을 종료하는 절차도 있을 것이다. TCP 연결 종료과정을 보면 연결할때보다 조금 복잡하다. 이 종료과정을 4-way-handshaking이라고 한다. 여기서 1가지 대 전제가 있는데 특별한 이유가 없다면 클라이언트의 행동은 active하고 서버는 passive하다. 무슨 이야기냐면 연결하고자 하는 것이 클라이언트면 연결을 종료하는 것도 클라이언트여야 한다. 그게 보편적이다. 만약 서버가 연결을 끊겠다고하면 이런 경우는 엄청 특수한 경우이다. 그래서 클라이언트가 연결하고 연결종료가 일반적인 TCP 통신체계이다.

연결을 끊자고 하는 클라이언트는 established상태여야 연결을 끊을 수 있다. 그러면 클라이언트가 established상태에서 연결을 끊을려고 FIN+ACK를 같이 보낸다. 그러면 established 상태의 서버가 OK사인으로 ACK를 보낸다. 그때 FIN+ACK를 보내고 FIN_WAIT1상태의 클라이언트는 FIN이 오기를 기대했지만 ACK만 와서 FIN_WAIT2상태가 되고 서버측에서 FIN+ACK가 오면 그때 TIME_WAIT상태가 된다. 여기서 TIME_WAIT가 중요한데 왜냐하면 이 TIME_WAIT상태가 되었다는게 의미하는 바가 뭐냐면 연결을 끊자고 하는 것이다. 만약 서버에서 TIME_WAIT상태가 나면 서버가 끊자고 하는거고 이것은 비정상적인 특수상황이다. 아무튼 TIME_WAIT은 누군가 연결을 끊자고 할 때 발생하고 CLOSED상태 전에 발생한다.

서버관점에서 보면 ESTABLISHED상태였다가 FIN+ACK를 수신하면 CLOSE_WAIT상태가 된다. 그리고 클라이언트에 FIN+ACK를 보내고 LAST_ACK상태가 되고 클라이언트측에 ACK가 오면 CLOSED상태가 된다. 그리고 클라이언트는 ACK를 보내고 CLOSED상태가 되면 소켓을 OS가 회수한다.

💡 참고
소켓은 일종의 자원으로 유한적이다. 즉, 클라이언트 입장에서 슬 수 있는 소켓이 개수 제한이 있다. 그래서 소켓회수자체는 쓸 수 있는 소켓이 증가한다는 의미이기도 한다.

즉, 서버가 특별한 이유가 없는 한 자기가 연결을 끊는게 아니고 클라이언트측에서 끊을 수 있게 유도한다. 이렇게 끊을 수 있게 Application protocol이 설계되어야 한다.

TCP 상태변화

위의 설명을 하나의 그림으로 표현하면 다음과 같다.

profile
모든 것을 즐길 줄 아는 개발자, 양성빈입니다.

0개의 댓글