为什么NFS默认使用UDP协议?

30

我相信有一些古老的传统原因造成了这种情况,但是它到底是什么呢?似乎它是一个专注于可靠数据传递的服务。


2
似乎NFS不再默认使用UDP了,请参考一些答案。NFSv4甚至可能只使用TCP? - rogerdpack
1
是的,对于NFSv4,请参见https://tools.ietf.org/html/rfc7530#section-3.1。UDP在这一点上大多被淘汰了。 - Bruce Fields
8个回答

27
  • NFS最初设计用于低丢包率的局域网。
  • UDP更快,开销较小。
  • NFS是无状态的,所以客户端重试很简单。

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


7

UDP是NFSv2的默认选项(如今几乎无人使用),但NFSv3默认使用TCP。 TCP挂载更加可靠,而且您可以比使用UDP更快地确定网络问题。


7
没错 - 当使用基于TCP的NFS时,如果出现网络问题,你会遇到长时间的超时和过期处理。但是使用UDP时,它会通过强制发送大量UDP数据包来恢复连接。 - synthesizerpatel

5
UDP是无状态的,而TCP则不是,但TCP有许多预定义属性并不适用于NFS,或者说NFS希望控制这些细节。特别是,在TCP进行数据包传输时,它会控制超时等情况。
使用UDP可以避免你不需要的开销。当NFS文件系统进行写操作时,最初的想法是如果只完成了一半,那将是很糟糕的...因此,NFS(在硬模式下)将继续重试来完成事务,直到永远、1分钟、5分钟、10分钟,一小时,一天...当连接恢复后,事务可以继续完成...
NFS负责“状态”,而不是TCP,其设计在新连接(或重新连接)上建立新状态,该连接(和状态)可能因任何(硬件)原因而死亡,并且新连接不会保留该状态...考虑处理文件...你只需要离开进程,NFS连接会断开一段时间,但当它恢复时,一切都会继续...现在的应用程序更加智能,路由更加多样化,组成更加模块化,我们更加不耐烦...如果计划不按计划进行...有人接到电话,必须登录并尝试以任何方式解决它...在过去,当它可以被忽略时,这是一个更加无缝的事情...它的工作方式今天仍然很好,但现在有更多的选择,而且越来越多的人会更及时地修复所有问题。 此外,每个端点传递会话对象并在作业之间不提交,直到双方同意完成——在过去,NFS为您处理了很多这些内容....
这种类比有点类似于RS232的工作方式...电子设备会执行它们的操作并加载它们的缓冲区,并在缓冲区满时停止(或丢失信息),它们可以在CTS(即插头上的金属引脚)高或低(无论该引脚应该是什么)时传递信息流(并清空其缓冲区并继续)。

3
UDP也被用于其可以大大降低内存使用量。在1980年代开发NFS时,您可能会遇到仅有4-8MB RAM的UNIX系统,而且(至少在学术环境中)“服务器”可能只是其中一个配备了几个额外磁盘的4-8MB系统。服务器上的RAM使用是一个重要问题,您可能会失去几个MB的TCP缓冲区,这些区域本来可以更好地用作磁盘高速缓存。同时,UDP协议也方便处理内存压力,一个超负荷的NFS服务器可以简单地放弃一些请求。

1

当协议由应用程序本身管理时,使用UDP。应用程序可能对如何执行此操作有更好的想法,或者在特定应用程序条件下可能更快。TCP非常好,但与之相关的开销很大。


1

性能。UDP的开销比TCP低得多。另一方面,NFS必须自行处理可靠传输(与TCP相比),但由于这是用于局域网的协议,连接问题和数据包丢失不应该是问题,因此它被优化为性能。


这只是误导。UDP作为默认传输协议是NFS在快速链路(例如Gbit/s或10 GBit/s以太网)上速度惨不忍睹的最重要原因,如果没有正确配置的话。 - Feuermurmel
2
@Feuermurmel 我不确定为什么这会误导人。在做出NFS协议决策时,Gbit/s或更高速率对于网络基础设施来说并不常见。此外,TCP堆栈没有像今天这样被优化和(或多或少)容错。 我相信NFS开发人员在决定实现手工制作的协议之前,在现有的网络堆栈/协议上进行了相当多的性能测试。 即使在更高的网络速度和其他优化方面也无法正常工作,这可能是他们在后来的版本中更改默认值的原因。 - Kosi2801

1

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

当UDP用作传输协议时,假定如果需要重新传输,将由NFS客户端来管理。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接