Как работают InputStream в сокетах в java?

Рейтинг: 1Ответов: 2Опубликовано: 22.03.2023

Задался вопросом, предположим на сервер (java servlet)передают огромный файл 100gb, я могу считать 1000 байт, остановиться, но в сетевом соединении передача данных будет же продолжаться, и если эти данные не будут считываться, поставлю таймаут, данные будут накапливаться в буфере где-то в ОС, и если он заполнится просто соединение оборвется? Нужно сразу стараться вычитывать и перенаправлять поток?

Ответы

▲ 4Принят

На уровне операционной системы под обмен данными реализует протокол TCP. У этого протокола на стороне отправителя и на стороне получателя есть буферы.

Что произойдёт, если на стороне получателя приложение перестанет читать из буфера.

  1. Ядро на стороне отправителя пошлёт очередной блок данных, скорее всего 64 килобайта в условиях современных сетей.

  2. Ядро на стороне получателя пакеты примет, но данные сохранить не сможет, так как внутренний буфер получателя заполнен. Поэтому получатель пошлёт отправителю подтверждение, что данные не приняты.

  3. Отправитель пошлёт данные ещё раз.

  4. Получатель снова не сможет принять.

И так далее.

Этот пинг-понг будет длиться несколько минут, пока на стороне отправителя не истечёт таймер, после чего тот закроет соединение. Обратите внимание - закроет не сразу после заполнения буфера, а спустя несколько минут.

Подробнее в книге TCP/IP Illustrated

▲ 2

Сначала заполнит я приёмный буфер, потом соединение tcp скажет что не может больше принять. Потом заполнится буфер на клиенте и метод write там станет возвращать 0. В это время будут повторяться попытки доставить его.