NetWork[TCP-Close]
TCP 전체 끊기 / 절반 끊기
TCP커넥션은 애플리케이션 측에서 입력 채널과 출력 채널중 하나만 끊거나 모두 끊을 수 있습니다.
모두 끊는 방법은 close()를 호출하면 모두 끊을 수 있고, 입력이나 채널중 하나만 개별적으로 끊으려고 한다면 shutdown()을 호출하면 됩니다.
TCP 끊기와 리셋 에러
만약 파이프라인 지속 커넥션을 사용한다고 하면, 기기들에 예상치 못한 쓰기 에러를 발생하는 것을 예방하기 위해 절반 끊기를 사용해야 합니다.
보통 커넥션의 출력 채널을 끊는 것이 안전합니다.
만약 클라이언트 측에서 데이터를, 즉 통신을 하지 않을 것임을 확신할 수 없는 이상, 커넥션의 입력 채널을 끊는 것은 위험합니다.
그 이유는 클라이언트측에서 이미 끊긴 입력 채널에 데이터를 전송하면 서버의 운영체제는 클라이언트로 connection reset by peer라는 메세지를 보내게 되는데, 운영체제는 이를 심각한 오류라고 에러라고 판단하여, 버퍼에 저장된 읽지 않은 데이터를 모두 삭제하기 때문입니다.
이를 예방하기 위해서는 커넥션을 잘 끊어야 합니다.
우아하게 커넥션 끊기
커넥션을 잘 끊는 방법은, 애플리케이션 출력 채널에 절반 끊기를 난 후에도 데이터나 스트림의 끝을 식별하기 위해 입력 채넣에 대해 상태 검사를 주기적으로 실시해야 합니다.
만약 입력 채널이 특정 타임아웃 시간 내에 끊거지지 않으면 애플리케이션은 리소스를 보호하기 위해 커넥션을 강제로 끊을 수 있습니다.
This post is licensed under CC BY 4.0 by the author.