Как работают InputStream в сокетах в java?
Задался вопросом, предположим на сервер (java servlet)передают огромный файл 100gb, я могу считать 1000 байт, остановиться, но в сетевом соединении передача данных будет же продолжаться, и если эти данные не будут считываться, поставлю таймаут, данные будут накапливаться в буфере где-то в ОС, и если он заполнится просто соединение оборвется? Нужно сразу стараться вычитывать и перенаправлять поток?
На уровне операционной системы под обмен данными реализует протокол TCP. У этого протокола на стороне отправителя и на стороне получателя есть буферы.
Что произойдёт, если на стороне получателя приложение перестанет читать из буфера.
- Ядро на стороне отправителя пошлёт очередной блок данных, скорее всего 64 килобайта в условиях современных сетей.
- Ядро на стороне получателя пакеты примет, но данные сохранить не сможет, так как внутренний буфер получателя заполнен. Поэтому получатель пошлёт отправителю подтверждение, что данные не приняты.
- Отправитель пошлёт данные ещё раз.
- Получатель снова не сможет принять.
И так далее.
Этот пинг-понг будет длиться несколько минут, пока на стороне отправителя не истечёт таймер, после чего тот закроет соединение. Обратите внимание - закроет не сразу после заполнения буфера, а спустя несколько минут.
Подробнее в книге TCP/IP Illustrated