데이터 보내기를 완료했을 때 연결을 끊는다
- 데이터 송.수신을 종료하는 것은 애플리케이션이 송신해야 하는 데이터를 전부 송신 완료했다고 판단했을 때임
- 어디에서 데이터 송.수신 동작이 끝나는지는 애플리케이션에 따라 다르다. ⇒ 프로토콜 스택은 어느 쪽에서 먼저 연결 끊기 단계에 들어가도 좋게 만들어져 있음
- 예를 들어 웹이라면 클라이언트가 리퀘스트를 보내고 서버에서 응답을 주고 데이터 보내기를 완료함
- 클라이언트 측이 데이터 보내기를 완료했다고 하는 식의 애플리케이션도 있음
연결 끊기 단계 (서버 측에서 먼저 연결 끊기 단계에 들어간다고 간주)

- 서버측의 어플리케이션이 먼저 Socket 라이브러리의 close를 호출함
- 서버측의 프로토콜 스택이 TCP 헤더를 만들고, 여기에 연결 끊기를 나타내는 정보를 설정함
- 구체적으로 컨트롤 비트의 FIN에 1을 설정하고 IP 담당 부분에게 송신해달라고 의뢰
- 이와 동시에 서버측의 소켓에 연결 끊기 동작에 들어갔다는 정보 기록
- 서버에서 FIN에 1을 설정한 TCP 헤더가 도착하면 클라이언트 측의 프로토콜 스택은 자신의 소켓에 서버측이 연결 끊기 동작에 들어갔다는 것 기록 & ACK 번호 서버측에 반송( FIN 1 패킷 받았다고)
- 이것이 끝나면 애플리케이션이 데이터를 가지러 올 때까지 기다림
- 어플리케이션이 read를 호출하여 데이터를 가지러 오면, 데이터를 건네지 않고 서버에서 보낸 데이터를 전부 수신 완료했다는 사실을 클라이언트 측 애플리케이션에 알림(수신 버퍼에 있는 데이터 가져감) → 클라이언트 측 애플리케이션도 close 호출
- FIN 비트에 1 설정한 TCP 헤더 만들고 IP 담당 부분에 의뢰하여 전송
- 서버에서 ACK 번호 돌아오면 대화 끝
소켓을 말소한다
- 서버와의 대화가 끝나면 소켓을 사용하여 서버와 대화할 수 없게 되어 소켓이 필요 없지만, 거기서 바로 소켓을 말소하지 않고 잠시 기다렸다 말소함
- 그 이유 : 오동작을 막기 위해
- 4-way handshake에서 마지막 ACK 번호를 송신하지 못한다면 다시 한번 FIN을 보내게 되는데 이 때 소켓이 말소되고 해당 포트에 새 소켓이 생기게 되면 그 새 소켓이 바로 연결 끊기 동작에 들어가 버릴 수도 있게 됨
- 기다리는 시간은 패킷을 다시 보내는 동작과 관계 있음. 패킷이 없어졌을 때 다시 보내는 동작은 보통 몇 분쯤 계속되고, 몇 분이 경과하면 회복 전망이 없는 것으로 판단하여 다시 보내기 동작을 멈춤
- 그 때까지의 시간 동안에는 다시 보낸 패킷이 네트워크에 존재할 가능성이 남아있으므로 다시 보내기 동작이 완전히 끝나는 시간만 기다리면 됨 (일반적으로 보통 몇분 기다리고 소켓 말소 )