ConnectionTimeout과 SocketTimeout


135

사용중인 라이브러리에 문제가 있습니다. 라이브러리 일 수도 있고 잘못 사용했을 수도 있습니다!

기본적 으로이 작업을 수행 할 때 (밀리 초 단위의 시간 초과)

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds

시간 초과 예외가 생성되지 않고 정상적으로 작동하지만 다음을 수행하면

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short

소켓 예외가 발생합니다.

그래서 내 질문은 왜 연결 예외를 시뮬레이션 할 수 없습니까? 소켓과 연결 시간 초과의 차이점을 오해하고 있습니까? 도서관은 여기에 있습니다 (아직 공식적으로 공개되지는 않음).

답변:


227

연결 시간 초과는 단지 TCP 연결을 시작할 때 발생합니다. 일반적으로 원격 시스템이 응답하지 않는 경우에 발생합니다. 이는 서버가 종료되었거나 잘못된 IP / DNS 이름을 사용했거나 포트가 잘못되었거나 서버와의 네트워크 연결이 끊 겼음을 의미합니다.

소켓 제한 시간은 연속 들어오는 데이터 흐름을 모니터링하기 위해 최선을 다하고 있습니다. 지정된 시간 초과 동안 데이터 흐름이 중단되면 연결이 중단 / 중단 된 것으로 간주됩니다. 물론 이것은 항상 데이터가 수신되는 연결에서만 작동합니다.

소켓 제한 시간을 1로 설정하면 매 밀리 초마다 새 데이터를 수신해야합니다 (데이터 블록을 현명하게 읽고 블록이 충분히 크다고 가정)!

들어오는 스트림 만 밀리 초 이상 정지하면 시간 초과가 발생하는 것입니다.


1
서버가 다운되지 않았지만 사용 중이면 연결 시간이 초과 될 수 있습니까? 아니면 소켓 시간 초과입니까?
Robert

9
서버에 과부하가 걸리기 전에 TCP 연결이 설정되어 있으면 소켓 예외가 발생합니다. 그렇지 않으면 TCP 연결을 설정할 수 없음을 나타내는 연결 예외가 발생합니다.
Robert

2
특히 오래된 모바일 네트워크의 대기 시간이 길다는 점을 고려하면 연결 시간 초과를 몇 초 (예 : 10 초 이상 10000msec)로 설정해야합니다. 소켓 제한 시간은 HTTP가 요청 후 연결을 다시 사용할 수 있기 때문에 여러 연결을 사용하지 않는 경우에만 설정합니다.
Robert

1
소켓 시간 초과 (예 : 1 분)를 설정하면 1 분 동안 활동이 없으면 연결이 끊어 지므로 시간 초과가 설정되지 않은 경우 일반적으로 다시 사용됩니다.
Robert

2
@Robert 서버 사용량이 많을 경우 반드시 연결 예외가 발생하지는 않습니다. 서버 플랫폼에서 플랫폼에 따라 다릅니다. 소켓 읽기 시간 종료는 연결을 종료하지 않습니다. SocketTimeoutException이 발생합니다. 연결을 계속 사용할 수 있는지 여부는 응용 프로그램이 결정해야합니다. 소켓에서 더 많은 I / O를 시도 할 수 없다는 API에 대해서는 확실히 아무것도 없습니다. 여러 연결을 사용하는 경우 시간 초과를 사용하지 않는다는 말이 이해가되지 않습니다. 여기에 잘못된 정보가 너무 많습니다.
Lorne의 후작

83

접속 타임 아웃 프로그램 설정에 다른 프로세스로의 연결을 기다릴 것이 최대 시간이다. 이 시점에서 애플리케이션 데이터를 얻거나 게시하지 않고 연결 자체를 설정하기 만하면됩니다.

소켓 타임 아웃은 개별 패킷을 기다리는 시간 제한입니다. 소켓 제한 시간이 전체 응답을 수신하기위한 제한 시간이라는 것은 일반적인 오해입니다. 따라서 소켓 시간 종료가 1 초이고 3 개의 IP 패킷으로 구성된 응답이 있고 각 응답 패킷이 도달하는 데 0.9 초가 걸리고 총 응답 시간이 2.7 초인 경우 시간 종료가 없습니다.


3
괜찮아. 1. 연결이 이미 설정된 경우에만 SocketTimeout이 표시된다고 말할 수 있습니까? 2. 3 개의 패킷이 수신 된 후 5 분 동안 데이터 흐름이 없으면 어떻게합니까? 세 번째 패킷을받은 후 SocketTimeout 예외가 발생합니까?
Saurabh Patil

2
@SaurabhPatil 1. 예. 확인은 Wikipedia의 HTTP 프로토콜 기술 개요를 참조하십시오 . 2. 메시지의 끝이 전송되면 더 이상의 데이터가 필요하지 않으므로 소켓 시간 초과가 발생하지 않습니다. 주제에 대한 이 답변 을 참조하십시오 .
entpnerd

7
"소켓 제한 시간"을 "유휴 제한 시간"으로 지정했으면합니다.
Manish Maheshwari
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.