为什么NFS默认使用UDP?

时间:2009-02-24 23:27:16

标签: unix networking rpc nfs

我确信它有一些古老的遗产原因,但它是什么?这似乎是一种旨在实现可靠数据传输的服务。

8 个答案:

答案 0 :(得分:23)

  • NFS最初设计用于损失率非常低的局域网。
  • UDP更快,开销更少
  • NFS是无状态的,因此客户端重试
  • 很简单

请注意,NFS v3 +可以使用TCP。

答案 1 :(得分:6)

UDP是NFSv2的默认设置(现在没有人真正使用它),但NFSv3默认使用TCP。 TCP挂载更可靠,并且您知道网络问题比使用UDP快得多。

答案 2 :(得分:3)

UDP是无状态的,TCP不是,但是TCP有许多预定义的属性,它们不能安装NFS,或者说NFS想要管理这些特性。特别是,当TCP正在进行数据包传输时,它确实会控制超时等。

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

NFS关注"状态"而不是TCP,其设计在新连接(或重新连接)上设置新状态,该连接(和状态)可能因任何(硬件)原因而死亡,并且新连接不会持续该状态...想想关于处理文件......你只是单独离开这个过程,NFS连接稍微退出,但是当它回来时,一切都会继续..现在应用程序更智能,路由很多,事情更模块化,而且我们更加不耐烦......如果它不打算计划......有人接到电话并且必须登录才能让它继续运行它们可以...当天回来,当它可以离开时,它是一个更无缝的东西...它的工作方式今天仍然很好,但现在有更多的选择,并且现在有更多的人更快地修复一切。还有一个想法是每个结束来回传递会话对象而不是在作业之间做出承诺,直到双方都同意他们已经完成 - 回到当天NFS为你做了很多这个......

这个类比有点类似于RS232的工作方式...电子设备会做它的事情并加载它们的缓冲区并且会变满并且必须停止(或丢失信息),它们可以传递信息流(并且为空它们的缓冲区并继续)当CTS(清除发送引脚 - 如插头上的金属引脚)高或低(它应该是什么)。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

当协议将由应用程序本身管理时使用UDP。应用程序可能更好地了解如何操作,或者它可能更快(在应用程序的特殊条件下)。 TCP是非常好的,但它有很多与之相关的开销。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

还使用了UDP,因为它可以大大减少内存使用量。在最初开发NFS的20世纪80年代,你有一个类似4-8MB RAM的UNIX系统,并且(至少在学术环境中)服务器"可能只是这些4-8MB系统中的一个,附加了一些额外的磁盘。在服务器上使用RAM是一个很大的问题,你可能已经丢失了几个MB到TCP缓冲区,我最好用作磁盘缓存。它还使处理内存压力变得容易,过度使用的NFS服务器可以简单地丢弃请求。

答案 7 :(得分:0)

无状态UDP连接可最大限度地减少网络流量,因为NFS服务器在客户端被授权访问共享卷后向客户端发送cookie。此cookie是存储在服务器端的随机值,并与来自客户端的RPC请求一起传递。