在开始时,NFS通过UDP运行,每个NFS请求ANDEACH NFS在单独的UDP数据包中回复(可能是碎片化)。 udphas它可以随机删除任意数据包的迷人属性(并且还重新排序)。如果UDP丢弃了NFS客户端'请求对Theserver,NFS客户端将怨恨它(A'重传'在NFS的Jargonof)。如果UDP丢弃服务器'我的回复对客户端' s请求,Theclient还将重新发送请求,因为它可以' t真正告诉他们没有得到回复'它只是知道它没有#39; t。
(因为客户无法展示足够的服务器和数据包丢失之间的差异,它们也反应于ByRetransmiting其请求的慢速服务器。)
当服务器&#39时,很多NFS操作都是无害的重复。例如,重复Readsor查找事物的任何操作只是给客户端提供了当前版本的事物;如果这个状态与之前的不同,它几乎是客户端达到监视的功能。但是,如果服务器响应丢失,则重复某些操作非常危险,因为结果在Badway中更改。例如,考虑执行它的MKDIR操作的客户端,它使用锁定'第一次,客户端成功,但服务器'回复丢失;第二次,客户端' s请求失败,因为现在目录存在,服务器'回复到达客户端。现在你有一个困难的锁;客户端成功获得了锁定,但认为它失败了,所以没有任何东西可以释放锁定。
为了尝试解决这个问题,NFS服务器很快就引入了A"回复缓存",这缓存了NFS服务器'对客户拖放而被认为是危险的竞争令人危险的竞争作业。希望和想法是,当客户端重新发送服务器已经处理了这样的东西时,服务器将在此缓存中找到回复并将其重复到客户端。当然是一个保证的治愈,因为缓存有一个有限尺寸(并且它通常不知道可能使答案无效的其他操作)。
在UDP的NFS的日子里和频繁的丢包和重传,回复缓存非常重要。如今,NFS通过TCP useStcp重新转发NFS服务器和客户端看到的水平,所以已发送的服务器回复非常难以丢失,并且实际的NFS levelRetransmissions相对罕见(我认为他们从客户决定的客户端&#39服务器太慢,超出了实际丢失的回复)。
在过去的条目中(例如,关于基于文件的锁定不可靠的NFS),我说这是为了运营而完成的,' t idempotent。这不是真正的正确。如果在延迟之后重新发布,那么很少有NFS操作就是真正的Idempotent;例如,readdir可能会导致新的条目,或者读取可以在afile中看到更新的数据。但是,这些差异在尾随危险的是,MKDIR从成功到失败,所以他们在回复缓存中是不缓存的,以便离开房间,以便在其真正重要的操作中离开房间。
(因此,Linuxkernel NFS服务器中的非缓存NFS V3操作列表主要是ISN'鹤望感。我确实在提交时抬起了一点点,因为它可能会出现错误。希望Linux NFS服务器侵蚀了令人难以置信再次获取相同的错误。)