소켓의 연결 시간과 읽기 시간 초과의 차이점은 무엇입니까?


180

3 가지 질문 :

  1. 소켓의 연결 시간 과 읽기 시간 초과 의 차이점은 무엇입니까 ?

  2. 연결 시간 초과가 "무한대"로 설정된 것은 무엇입니까 ? 어떤 상황에서 무한 루프에 남아있을 수 있습니까? 그리고 무한 루프가 죽는 원인은 무엇입니까?

  3. 읽기 시간 초과가 "무한대"로 설정된 것은 무엇을 의미합니까? 어떤 상황에서 무한 루프에 남아있을 수 있습니까? 그리고 무한 루프가 죽는 원인은 무엇입니까?

답변:


227

1) 소켓의 연결 시간과 읽기 시간 초과의 차이점은 무엇입니까?

연결 시간 초과는 초기 연결을 만드는 시간 초과입니다. 즉, TCP 연결 핸드 셰이크 완료. 읽기 시간 초과는 데이터 1 을 읽기 위해 대기하는 시간 초과입니다 . 특히, 서버가 마지막 바이트 이후 <timeout> 초 동안 바이트를 보내지 못하면 읽기 시간 초과 오류가 발생합니다.

2) 연결 시간 초과가 "무한대"로 설정된 것은 무엇을 의미합니까? 어떤 상황에서 무한 루프에 남아있을 수 있습니까? 그리고 무한 루프가 죽는 원인은 무엇입니까?

연결 시도가 영원히 차단 될 수 있음을 의미합니다. 무한 루프는 없지만 소켓을 닫는 다른 스레드가 연결 시도를 차단 해제 할 수 있습니다. ( Thread.interrupt()전화가 트릭을 수행 할 수도 있습니다 ... 잘 모르겠습니다.)

3) 읽기 시간 초과가 "무한대"로 설정된 것은 무엇을 의미합니까? 어떤 상황에서 무한 루프에 남아있을 수 있습니까? 무한 루프가 끝나는 원인은 무엇입니까?

read소켓 스트림에 대한 호출이 영원히 차단 될 수 있음을 의미합니다 . 다시 한 번 무한 루프는 없지만 호출에 read의해 차단을 해제 Thread.interrupt()하고 소켓을 닫고 다른 쪽 끝은 데이터를 보내거나 연결을 닫을 수 있습니다.


1-한 의견자가 생각한 것처럼 ... 소켓을 열거 나 유휴 할 수있는 시간에 대한 시간 초과는 아닙니다.


8

이는 TCP 연결 설정 및 소켓에서 데이터 읽기를 대기하기 위해 JVM에서 시행하는 시간 종료 값입니다.

값이 무한대로 설정되면 영원히 기다리지 않습니다. 이는 JVM에 시간 초과가 없으며 OS가 모든 시간 초과를 담당한다는 것을 의미합니다. 그러나 OS의 시간 초과는 실제로 길 수 있습니다. 느린 네트워크에서 6 분의 시간 초과가 발생했습니다.

소켓의 시간 종료 값을 설정하더라도 원시 코드에서 시간 종료가 발생하면 작동하지 않을 수 있습니다. 방화벽으로 차단 된 호스트에 연결하거나 케이블 스위치를 뽑아 Linux에서 문제를 재현 할 수 있습니다.

TCP 시간 초과를 처리하는 유일한 안전한 방법은 다른 스레드에서 연결 코드를 실행하고 스레드가 너무 오래 걸리면 중단하는 것입니다.


"값이 무한대로 설정되면 영원히 기다리지 않습니다." "무한대"의 의미에 대한 논의가 아니라면 아주 오래 기다릴 수 있습니다. 여기 HttpURLConnection.getResponseCode()에 apprx가 걸려 있는 경우가있었습니다 . 프로세스를 다시 시작할 때까지 1 주일 JVM 측에는 시간 초과가 설정되지 않았으며 Linux OS 측에는 시간 초과가 없었습니다.
Tom Fink

마지막 단락이 올바르지 않습니다. 최대 약 1 분 후에 연결 시간이 초과됩니다. 별도의 스레드가 완전히 필요하지 않습니다. 데이터가 없으면 영원히 실행되는 읽기 를 가질 수 있습니다 . 그러나 Javadoc은 기본 연결 시간 종료가 무한하다는 점에서 잘못되었습니다. 그렇지 않습니다.
Lorne의 후작

1
@comeGetSome 맞지 않습니다. 입력을 위해 소켓을 종료 할 수 있습니다. 차단 된 읽기가 스트림 끝에서 발생합니다.
Lorne의 후작

@comeGetSome : 열린 HTTP URL 연결에 대한 참조를 보유하는 스레드를 사용하여 이것을 구현해야했습니다. 해당 스레드가 연결을 닫으면 다른 스레드에서 "java.net.SocketException : Socket closed"가 발생합니다. 내가 그렇게하게 해준 버그 JDK-8075484에게 감사한다!
fmcato

@comeGetSome 확실하게 Socket.shutdownInput()손을 잡지 않고도 전화 를 걸 수 있습니까? NB 이러한 시간 종료는 JVM이 아닌 TCP에 의해 시행됩니다.
Lorne의 후작
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.