Почему NFS по умолчанию использует UDP?

Я уверен, что этому есть какая-то причина из древнего наследия, но что это? Похоже, что это сервис, ориентированный на надежную доставку данных.

Ответов (8)

Решение
  • Первоначально NFS был разработан для использования в локальной сети с очень низким уровнем потерь.
  • UDP быстрее и имеет меньше накладных расходов
  • NFS не имеет состояния, поэтому клиентам легко повторить попытку.

Обратите внимание, что NFS v3 + может использовать TCP.

Представление. UDP имеет гораздо меньшие накладные расходы, чем TCP. С другой стороны, NFS должна самостоятельно обрабатывать надежный транспорт (по сравнению с TCP), но поскольку это протокол для локальных сетей, где проблемы с подключением и отбрасывание пакетов (или лучше: должно быть) не являются проблемой, он оптимизирован для производительности.

UDP-соединение без сохранения состояния минимизирует сетевой трафик, поскольку сервер NFS отправляет клиенту файл cookie после того, как клиент авторизован для доступа к общему тому. Этот файл cookie представляет собой случайное значение, которое хранится на стороне сервера и передается вместе с запросами RPC от клиента.

UDP не имеет состояния, TCP - нет, но TCP имеет много предопределенных свойств, которые не подходят для NFS, или, скорее, NFS хочет управлять спецификой. В частности, когда TCP выполняет передачу пакетов, он регулирует тайм-ауты и т. Д.

С UDP вы теряете накладные расходы, которые вам совершенно не нужны. Когда файловая система NFS, как изначально предполагалось, система выполняет запись, и если она завершится только наполовину, это будет плохо ... поэтому NFS (в жестком режиме) будет продолжать повторять попытки завершить транзакцию навсегда, 1 минута, 5, 10 и час, день ... когда соединение восстановится, транзакция может продолжиться до завершения ...

и, как правило, больше людей сейчас исправляют все быстрее. Также идея о том, что каждый конец передает объекты сеанса туда и обратно и не фиксирует между заданиями, пока обе стороны не согласятся, что они выполнены - в те времена, когда NFS много это делала за вас ...

Аналогия в чем-то похожа на то, как работает RS232 ... электроника сделает свое дело и загрузит свои буферы, будет заполнена и должна будет остановиться (или потерять информацию), они могут передать этот поток информации (и очистить свои буферы и продолжить), когда CTS (Clear to send pin - как металлический штифт на вилке) был высоким или низким (каким бы он ни был).

UDP используется по умолчанию для NFSv2 (который в наши дни никто не должен использовать), но NFSv3 по умолчанию использует TCP. Монтирование TCP более надежно, и вы знаете, что у вас проблемы с сетью, намного быстрее, чем с UDP.

Я предполагаю, что это, вероятно, по наследственным (историческим) причинам. Первоначально NFS, вероятно, использовался в сетях с низкой задержкой, где была очень небольшая вероятность ошибки, поэтому накладные расходы на инициирование 3-стороннего рукопожатия для установки TCP-соединения (вместе с двунаправленным подтверждением всех сообщений) перевешивали простоту с использованием протокола без установления соединения, такого как UDP.

Когда UDP используется в качестве транспортного протокола, по-видимому, клиент NFS должен будет управлять повторными передачами, если это необходимо.

UDP используется, когда протокол будет управляться самим приложением. Приложение может лучше понимать, как это сделать, или оно может быть быстрее (в особых условиях приложения). TCP очень хорош, но с ним связано много накладных расходов.

UDP также использовался, потому что он мог значительно уменьшить использование памяти. В 1980-х годах, когда изначально была разработана NFS, у вас была система UNIX с 4-8 МБ ОЗУ, и (по крайней мере, в академической среде) «сервер» мог быть просто одной из этих систем размером 4-8 МБ с несколькими к нему подключены дополнительные диски. Использование ОЗУ на сервере было большой проблемой, вы могли потерять несколько МБ из-за буферов TCP, которые лучше использовать в качестве дискового кеша. Это также упростило работу с нехваткой памяти: перегруженный сервер NFS мог просто отбрасывать запросы.