연결은 유지되지만 엔드포인트가 종료되었습니까?

연결은 유지되지만 엔드포인트가 종료되었습니까?

서버가 다시 시작된 경우에도 TCP 연결(클라이언트 측)이 약 24시간 동안 ESTABLISHED 상태로 유지되는 이유를 아는 사람이 있습니까? 클라이언트 프로세스는 recv syscall에 유지되며 오류 없이 그대로 유지됩니다!

클라이언트가 Ubuntu 11.04 설치에 있습니다. 이런 일이 이미 몇 번이나 발생했지만 이유나 해결 방법을 이해할 수 없는 것 같습니다.

답변1

연결은 한쪽에서는 ESTABLISHED로 유지되고 다른 쪽에서는 존재하지 않습니다. 서버가 다시 시작된 후의 상태이기 때문입니다. 클라이언트는 서버가 다시 시작되었는지 전혀 모르고 서버는 클라이언트가 아직 연결되어 있다고 생각하는지 전혀 모릅니다. 클라이언트가 연결을 사용하려고 시도하지 않는 한 이 연결은 영원히 유지됩니다. (킵얼라이브가 활성화되지 않은 경우 일반적으로 약 2일 동안 이 상태로 유지됩니다.)

클라이언트가 서버를 영원히 기다리는 이유는 무엇입니까?! 클라이언트 또는 프로토콜이 손상되었습니다. 클라이언트가 프로토콜을 따르지 않으면 클라이언트가 손상됩니다. 프로토콜이 끊어진 연결을 감지하는 방법을 지정하지 않으면 프로토콜이 손상됩니다.

TCP는 데이터 전송을 시도하지 않는 쪽의 연결 끊김을 감지하지 않습니다. 따라서 TCP 위에 계층화된 모든 프로토콜은~ 해야 하다이를 고려하여 설계되어야 합니다. 이 중단된 연결이 허용되지 않는 동작인 경우 허용되지 않는 동작을 허용하기 때문에 이 프로토콜이 중단됩니다(또는 프로토콜을 따르지 않아 클라이언트가 중단됨).

프로토콜 사양에 실제로 기다리라고 나와 있나요?영원히데이터를 위해? 그렇다면 프로토콜 개발자의 정신이 의심스럽습니다.

관련 정보