2009-02-24 5 views
23

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

+1

NFS больше не использует UDP по умолчанию, см. Некоторые ответы. NFSv4 может даже использовать только TCP? – rogerdpack

+1

Да, для NFSv4 см. Https://tools.ietf.org/html/rfc7530#section-3.1. UDP в основном уходит в этот момент. –

ответ

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

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

1

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

1

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

+0

Это просто вводит в заблуждение. UDP, являющийся транспортной сетью по умолчанию, является самой важной причиной того, почему NFS по быстрым ссылкам (например, Gbit/s или 10 GBit/s Ethernet) ужасно медленна, если не настроена правильно. – Feuermurmel

+0

@Feuermurmel Я не уверен, почему это должно вводить в заблуждение. К тому времени, когда было принято решение о протоколе NFS, Gbit/s или выше не было обычным делом для сетевых инфраструктур. Кроме того, стеки TCP не были оптимизированы и (более или менее) отказоустойчивыми, как сегодня. Я довольно уверен, что разработчики NFS применили справедливую долю тестирования производительности для существующих сетевых стеков/протоколов, прежде чем они решили реализовать протокол ручной работы. Это не сработало с еще более высокими скоростями сети и другими оптимизациями, поэтому, вероятно, они изменили значение по умолчанию в более поздних версиях. – Kosi2801

2

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

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

6

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

+3

Это правда - когда вы используете NFS через TCP, и есть сетевая проблема, вы получаете длинные таймауты и устаревшие дескрипторы. С UDP он восстанавливается благодаря силе взлома UDP-пакетов. – synthesizerpatel

0

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

2

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

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

NFS ищет «состояние» вместо TCP, дизайн которого устанавливает новое состояние на новое соединение (или пересоединение), что соединение (и состояние) может умереть по любой (аппаратной) причине, и новое соединение не будет сохраняться в этом состоянии ... Подумайте о обработке файла ... вы просто оставите процесс в покое, NFS-соединение выпадает немного, но когда оно вернется, все будет просто продолжаться. В наши дни приложения умнее, маршруты многочисленны, вещи более модульные, и мы гораздо более нетерпеливы ... если он не собирается план .. кто-то получает телефонный звонок и должен войти в систему и получить его в любом случае, они могут ... в тот же день, когда его можно было оставить, это было более безболезненно ...Способ, которым он работает, по-прежнему хорош сегодня, но теперь есть еще много вариантов и, как правило, больше людей фиксируют все быстрее. Кроме того, идея каждого конца, проходящего сеансы объектов вперед и назад, а не совершения между рабочими местами, пока обе стороны не согласятся, что они сделаны - в тот же день, когда NFS сделала это для вас ....

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

1

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