강제 종료와 달리 절차를 거쳐 클라이언트와 서버가 정상적으로 종료가 된 경우를 말한다.
이러한 절차를 걸쳐 둘 다 종료된다.
2번 과정에서 클라이언트가 fin 패킷을 받으면 더이상 읽을 게 없다고 판단하여 EOF을 반환한다. 이때 스트림 유형에 따라 반환하는 게 다르다.
DataInuputStream -> EOFException 예외를 터뜨려 연결을 종료한다. 데이터 유형이 여러 개라 특정한 값으로 반환할 수 없기 때문이다.
BufferedInputStream -> null을 반환.
read() -> -1을 반환.
여기서 중요한 것은 상대방이 Fin 패킷을 보냈다는 것은 연결을 끊겠다는 것이다. 그러므로 Fin 패킷을 받았으면 close를 호출해 반드시 연결을 끊어줘야 한다.