Яка різниця між з'єднанням та час очікування для розеток?


180

3 питання:

  1. У чому різниця між з'єднання і читання тайм - аут для гнізд?

  2. Що означає час очікування з'єднання, встановлене на "нескінченність"? У якій ситуації він може залишитися в нескінченному циклі? і що може спричинити, що петля нескінченності вмирає?

  3. Що означає час очікування читання, встановлене на "нескінченність"? У якій ситуації він може залишитися в нескінченному циклі? і що може спричинити, що петля нескінченності вмирає?

Відповіді:


227

1) Яка різниця між з'єднанням та тайм-аутом зчитування для розеток?

Тайм-аут з'єднання - це час очікування у встановленні початкового з'єднання; тобто завершення рукостискання з'єднання TCP. Час очікування читання - час очікування на очікування читання даних 1 . Зокрема, якщо сервер не надсилає байт <timeout> секунд після останнього байта, буде підвищена помилка очікування читання.

2) Що означає тайм-аут з'єднання, встановлений на "нескінченність"? У якій ситуації він може залишитися в нескінченному циклі? і що може спричинити, що петля нескінченності вмирає?

Це означає, що спроба з'єднання потенційно може блокуватись назавжди. Немає нескінченного циклу, але спроба підключення може бути розблокована іншим потоком, що закриває сокет. ( Thread.interrupt()Виклик також може зробити трюк ... не впевнений.)

3) Що означає час очікування читання, встановлене на "нескінченність"? У якій ситуації він може залишитися у нескінченному циклі? Що може призвести до того, що нескінченна петля закінчиться?

Це означає, що виклик readна потік сокета може блокувати назавжди. Знову не існує нескінченного циклу, але його readможна розблокувати Thread.interrupt()викликом, закривши сокет і (звичайно) іншим кінцем відправити дані або закрити з'єднання.


1 - Це не ... як думав один з коментаторів ... час очікування того, як довго розетка може бути відкритою, або простоювати.


8

Це значення тайм-ауту, застосовані JVM для встановлення TCP-з'єднання та очікування зчитування даних з сокета.

Якщо значення встановлено на нескінченність, ви не будете чекати вічно. Це просто означає, що JVM не має таймауту, і ОС буде відповідати за всі тайм-аути. Однак час очікування в ОС може бути справді довгим. У деяких повільних мережах я бачив тайм-аути аж 6 хвилин.

Навіть якщо ви встановите значення часу очікування для сокета, воно може не спрацювати, якщо час очікування відбудеться у рідному коді. Ми можемо відтворити проблему в Linux, підключившись до хоста, заблокованого брандмауером, або відключивши кабель від комутатора.

Єдиний безпечний підхід до обробки тайм-ауту TCP - це запустити код підключення в інший потік і перервати потік, коли це займе багато часу.


"Якщо значення встановлено на нескінченність, ви не будете чекати вічно." Поки мова не йде про дискусію про значення "нескінченності", може точно статися, що ви чекаєте дуже довго. Тут у нас був випадок, коли HttpURLConnection.getResponseCode()висіли приклад для apprx. на тиждень, поки ми не перезапустили процес. Очевидно, що на стороні JVM не встановлено тайм-аут, а також на стороні ОС Linux не було часу.
Том Фінк

Заключний абзац невірний. Час очікування підключення триває не більше ніж через хвилину. Окрема нитка зовсім непотрібна. Ви, безумовно, можете прочитати, які працюватимуть назавжди, якщо немає даних. Однак Javadoc помиляється, коли час очікування підключення за замовчуванням є нескінченним. Це не так.
Маркіз Лорн

1
@comeGetSome Це невірно. Ви можете відключити розетку для введення. Це призведе до того, що заблокований зчитування зустріне кінець потоку.
Маркіз Лорн

@comeGetSome: мені довелося реалізувати це за допомогою потоку, який містить посилання на відкрите HTTP-з'єднання URL. Коли зазначений потік закриває з'єднання, інший потік кидає "java.net.SocketException: Socket закритий". Дякую помилку JDK-8075484 за те, що змусив мене це робити!
fmcato

@comeGetSome Напевно ви можете зателефонувати, Socket.shutdownInput()не тримаючи руки? Примітка: Ці тайм-аути застосовуються TCP, а не JVM.
Маркіз Лорнський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.