2009-02-24 202 views
23

我确定这有一些古老的遗留原因,但它是什么?这看起来像是一项面向可靠数据交付的服务。为什么NFS默认使用UDP?

+1

出现NFS默认不再使用UDP,请参阅一些答案。 NFSv4甚至可能只使用TCP? – rogerdpack 2012-10-17 15:18:05

+1

是的,对于NFSv4,请参阅https://tools.ietf.org/html/rfc7530#section-3.1。 UDP在这一点上大部分都会消失。 – 2017-02-24 21:38:08

回答

22
  • NFS最初设计用于损失率非常低的局域网。
  • UDP更快,而且具有更少的开销
  • NFS是无状态的,所以它的简单客户端重试

需要注意的是NFS V3 +可以使用TCP。

1

当协议将由应用程序本身管理时使用UDP。应用程序可能会有更好的想法,或者可能会更快(在应用程序的特殊条件下)。 TCP非常好,但有很多与之相关的开销。

1

表现。 UDP的开销比TCP低得多。另一方面,NFS必须自己处理可靠的传输(与TCP相比),但由于这是LAN连接问题和包丢失(或更好:应该是)不成问题的LAN协议,因此它针对性能进行了优化。

+0

这只是误导。作为默认传输方式的UDP是导致NFS快速链接(例如Gbit/s或10 GBit/s以太网)配置不当的最重要原因。 – Feuermurmel 2014-05-27 08:39:34

2

我的猜测是,这可能是遗留(历史)原因。最初,NFS可能在低延迟网络中使用,其中几乎没有出错的可能性,因此启动三次握手以建立TCP连接(连同双向确认所有消息)的开销超过了简单性使用像UDP这样的无连接协议。

当使用UDP作为传输协议时,可能需要NFS客户端来管理重传。

6

UDP是NFSv2的默认值(现在没人真的应该使用),但NFSv3默认使用TCP。 TCP挂载更可靠,并且您知道您的网络问题比UDP更快。

0

无状态UDP连接使网络流量最小化,因为NFS服务器在客户端被授权访问共享卷后向客户端发送cookie。这个cookie是一个存储在服务器端的随机值,并且与来自客户端的RPC请求一起传递。

2

UDP是无状态的,TCP不是,但TCP有很多预定义的属性,它们并没有包含NFS,或者说NFS想管理这些细节。特别是,当TCP正在进行数据包传输时,它确定超时等。

使用UDP,您将失去不需要任何方式的开销。如果NFS文件系统原本就是这样,那么系统会执行写操作,如果它只有一半完成,那将会很糟糕......所以NFS(在硬模式下)将继续重试以永久完成事务,1分钟, 5,10和小时,一天...当连接回来时,交易可以继续完成...

NFS在“状态”而不是TCP之后,它的设计设置了一个新的状态新的连接(或重新连接),该连接(和状态)可能会因为任何(硬件)原因而死亡,并且新的连接不会持续该状态...考虑处理文件...您只需将该过程独立, NFS连接会退出一段时间,但是当它回来时,一切都会继续。这些日子里,应用程序更智能,路线更多,事物更模块化,我们更加不耐烦......如果它不打算计划..有人接到一个电话,并且必须登录,然后才能继续......可以回到当天,当它可以离开时,这是一个更加无缝的事情......它的工作方式今天仍然很好,但现在有更多的选择,并且现在更倾向于有更多的人更快地修复所有事情。此外,每个结束会话对象的想法来回对象,而不是在两个工作之间进行,直到双方都认为他们完成了 - 当天NFS为你做了很多这样的事情......

这个比喻有点类似于RS232的工作原理......电子设备会做它的事情并加载它们的缓冲区并且会变满并且不得不停止(或者失去信息),他们可以传递信息流(并且清空它们的缓冲区并且继续)当CTS(清除发送引脚 - 如在插头上的金属引脚)高或低时(它应该是)。

1

还使用了UDP,因为它可以大大减少内存使用量。在20世纪80年代,最初开发NFS时,你将拥有一个带有4-8MB RAM的UNIX系统,并且(至少在学术环境中),“服务器”可能只是这些4-8MB系统中的一个,额外的磁盘连接到它。在服务器上使用RAM是一个大问题,你可能已经损失了几个MB到TCP缓冲区,我已经更好地用作磁盘缓存。它还可以轻松处理内存压力,过载的NFS服务器可以简单地删除请求。