操作系统中有很多默认的网络服务或者客户端程序,例如 Web 服务器和浏览器、FTP 服务器和客户端、Telnet 服务器和客户端等,在 Linux 环境下有 Apache 、Mozilla、VSFtp 等。接下来对这些程序的协议和使用进行介绍,主要包括以下内容:
█ HTTP 协议及服务,主要介绍 HTTP 协议的标准和应用;
█ 介绍 FTP 协议标准,并介绍 FTP 客户端的使用;
█ 对 TELNET 的协议标准进行简介;
█ 介绍 Linux 下网络服务的配置方法。
一、HTTP协议
HTTP协议和服务
HTTP 协议是目前应用最广泛的应用层网络协议,它是目前互联网繁荣的基础。
1、HTTP 协议概述
应用层协议 HTTP 是 Web 的核心。HTTP 协议在 Web 的客户端程序和服务器程序中得以实现,运行在不同系统上的客户端程序和服务器程序,通过交换 HTTP 消息彼此交流。HTTP 协议定义数据格式,使得服务器和客户端通过协议进行数据交流。
Web 页面(webpage,也称为文档)是客户端和服务器交流的基本内容,它由多个对象构成。对象(object)是可由 URL 进行寻址的文件,例如 HTML 文件、JPG 图像、GIF 图像、Java 小应用程序、语音片段等。
Web 页面大多数由一个基本 HTML 文件和很多 HTML 文件中所引用的对象构成。例如,如果某个 Web 页面包含 1 个 HTML 文本文件和 5 个 PNG 图像,这个 Web 页面就由 6 个对象构成,即基本 HTML 文件加 5 个图像。这个基本的 HTML 文件使用文件中的内置 URL 来引用本页面中所使用的其他对象,例如上述的 5 个 PNG 图像需要在基本 HTML 文件中进行 URL 的引用定义。
一个 URL 由两部分构成:存放该对象的服务器主机名和该对象的路径名。例如,在如下的 URL 中:
roll.mil.news.sina.com.cn/phototj_slide/146/index.shtml
roll.mil.news.sina.com.cn 是一个主机名,/phototj_slide/146/index.shtml 是一个路径名。
浏览器是 Web 的用户代理,它显示所请求的 Web 页面,并提供大量的导航与配置特性。Web 浏览器还实现 HTTP 的客户端,因此在 Web 上下文中,可以从进程意义上互换使用 “ 浏览器 ” 和 “ 客户 ” 两词。
流行的 Web 浏览器有 Google Chrome、Firefox 和微软的 IE 等。Web 服务器存放可由 URL 寻址的 Web 对象。Web 服务器还实现 HTTP 的服务器端。流行的 Web 服务器有 Apache、 微软的 IIS 以及 IBM WebSphere。
2、HTTP 协议的基本过程
HTTP 协议是基于客户端 / 服务器之间的请求响应进行交互的。
(1) HTTP 协议的宏观过程
一个客户端与服务器建立连接后,发送一个请求给服务器,请求方式的格式为:统一资源标识符、协议版本号,后边是 MIME 信息包括请求修饰符、客户端信息和可能的内容。
服务器接到客户端的请求后,向客户端发送相应的响应信息,其格式为:一个状态行包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。
如下图(客户端和服务器之间的 HTTP 协议基本框架)所示,为一个客户端和服务器之间的 HTTP 协议访问基本过程。
在 Internet 上,HTTP 通信通常发生在 TCP/IP 连接之上。默认端口是 TCP 协议的 80 端口,其他端口也是可用的。但这并不是说 HTTP 协议在 Internet 或其他网络的其他协议之上可以完成,HTTP 只能在 TCP 协议的基础之上进行传输。
在 WWW 中,“ 客户 ” 与 “ 服务器 ” 是一个相对的概念,这个概念只在某个连接中有效,某个连接中的客户在另一个场景中可能是服务器。WWW 服务器运行时,一直在 TCP80 端口(WWW 的默认端口)监听,等待连接请求的出现。
(2) HTTP协议的内部过程
以上简要介绍了 HTTP 协议的概要运作方式,下面对 HTTP 协议的内部操作过程进行详细介绍。
首先,简单介绍基于 HTTP 协议的客户 / 服务器模式的信息交换过程,如下图(客户端和服务器之间的 HTTP 请求响应的过程)所示, 它分 4 个过程:建立连接、发送请求信息、发送响应信息、关闭连接。
①建立连接。
连接的建立是通过申请套接字(Socket)实现的。客户打开一个套接字并把它绑定在一个端口上,如果成功,就相当于建立了一个虚拟文件。
②发送请求。
打开一个连接后,客户端把请求消息送到服务器的监听端口上,完成提出请求动作。
HTTP/1.0请求消息的格式为:
请求消息 = 请求行(通用信息丨请求头丨实体头) CRLF[实体内容]
请求行 = 方法请求 URL HTTP 版本号 CRLF
方法 = GET|HEAD|POST|扩展方法
URL = 协议名称 + 宿主名 + 目录与文件名
请求行中的方法用于 HTTP 的动作方式,常用的方法有 GET、HEAD 和 POST。不同的请求对象对应 GET 的结果是不同的,对应关系如下:
对象 GET 的结果
文件 文件的内容
程序 该程序的执行结果
数据库査询 査询结果
HEAD 方法要求服务器查找某对象的元信息,而不是对象本身。
POST 方法从客户端向服务器传送数据,POST 发送的数据被服务器接收后进行处理。一个请求的例子如下:
GEThttp://networking.zju.edu.cn/zju/index.htmHTTP/1.0
头信息又称为元信息,即信息的信息,利用元信息可以实现有条件的请求或应答。
请求头 —— 告诉服务器怎样解释本次请求,主要包括用户可以接受的数据类型、压缩方法和语言等。
实体头 —— 实体信息类型、长度、压缩方法、最后一次修改时间、数据有效期等。
实体 —— 请求或应答对象本身。
③发送响应。
服务器在处理完客户的请求之后,要向客户端发送响应消息。
HTTP/1.0 的响应消息格式如下:
响应消息 = 状态行(通用信息头|响应头|实体头) CRLF (实体内容)
状态行 = HTTP 版本号 状态码 原因叙述
状态码表示响应类型
1XX 保留
2XX 表示请求成功地接收
3XX 为完成请求客户需进一步细化请求
4XX 客户错误
5XX 服务器错误
响应头的信息包括:服务程序名、通知客户清求的 URL 需要认证、请求的资源何时能使用。
④关闭连接。
客户和服务器双方都可以通过关闭套接字来结束 TCP/IP 对话。
二、FTP 协议和服务
FTP协议英文全称为File Transfer Protocol,简称FTP,是一种从一个主机向另一个主机传送文件的协议。FTP协议的历史可以追溯到1971年,不过至今仍然极为流行,FTP协议在RFC959中进行了详细的说明。
1、FTP协议概述
FTP协议中客户端与服务器端进行文件传输的交互方式如下图(FTP协议在本地和远程服务器之间传送文件)所示,客户端包含用户接口和客户端接口,服务器端为FTP服务器,客户端和服务器端都与文件系统进行交互。
(1) FTP 协议的步骤
例如一个用户想把远程**FTP**服务器上的某个文件下载到本地来,需要经过如下几个步骤。
- 首先用户通过FTP接口输入命令,让FTP客户端接口连接远方的FTP服务器主机。
- 连接成功后,远程的FTP服务器主机要求输入合适的用户名和密码,在用户名和密码得到正确的验证后,进入正常的FTP下载过程。
- 与本地的文件系统相似,可以在远程的FTP服务器上进行文件目录的转换,进入合适的目录,进行相关的操作。
对目标文件的下载,需要使用FTP协议特定的命令行格式,FTP服务器进行解析后,与客户端之间进行文件传输。
(2) FTP 是双端口服务器
与 HTTP 协议相同,FTP 协议也建立在 TCP 协议之上,但是这两个协议之间有很大的差别,最主要的差别是 FTP 协议使用两个并行的 TCP 连接来传送文件,一个是控制连接,另一个是数据连接。
控制连接用于在客户端和服务器端之间传送控制信息,例如用户名和密码、改变目录、上传或者下载文件的命令等。数据连接用户收发数据的连接信息如下图(FTP 协议的双 TCP 端口号连接)所示。由于 FTP 协议的控制信息是由一个单独的 TCP 连接来控制,通常将控制信息称为 FTP 的带外数据,即控制信息是不包含在 FTP 协议的数据连接之中的。
当 FTP 的客户端与远程的 FTP 服务器端启动 FTP 会话过程的时候,FTP 的客户端首先连接 FTP 服务器的 21 端口。连接成功后,将登录所用的用户名和登录密码发送给服务器端,登录成功后就可以进行命令交互了。
经典的 FTP 协议客户端将本地的数据端口告诉服务器端,以方便在进行文件上传或者下载的时候服务器连接客户端的数据端口。而最新的 FTP 协议允许客户端连接 FTP 服务器的 20 端口来进行数据的收发。控制数据的交互通过控制连接来传输,而文件数据的传输则通过数据端口。数据连接在本次传输完成后,可能关闭数据连接,到下次的传输发起的时 候再次打开,因此数据传输是非持久的,如下图(FTP 协议的通信过程解析)所示。
在整个FTP的会话期间,FTP服务器必须维护连接中的用户状态。也就是说,FTP服务器必须把某个控制连接与某个用户对应起来,对当前用户的状态进行跟踪。这种对用户状态的维护限制了FTP的性能。2、FTP 协议的工作模式
FTP协议的工作模式分为主动模式和被动模式,二者的主要区别在于对数据端口的处理方式不同:主动模式在客户端连接后,告诉服务器数据连接的端口;被动模式在客户端连接后,进行数据传输的时候临时连接FTP服务器的20端口,利用此端口进行数据的传输。
(1)主动模式
主动模式又叫标准模式、PORT 模式。主动模式下FTP协议的客户端和服务器端同时作为TCP连接的客户端和服务器端,FTP客户端建立数据连接的TCP服务器等待FTP服务器端的连接。一个主动模式的FTP连接建立遵循以下步骤。
FTP客户端连接FTP服务器端的21端口,建立控制连接。
- FTP客户端在某个端口建立一个TCP服务器,进行侦听等待服务器的数据连接请求。FTP客户端使用PORT命令告诉FTP服务器客户端的命令连接侦听端口。
- FTP服务器使用20号端口,与FTP客户端的数据连接侦听端口进行连接。
- 传送数据的时候通过FTP协议的客户端与服务器端的端口进行通信。
(2) 被动模式
被动模式又称为 PASV 模式。被动模式下建立命令通道的方式与主动方式相同,但是命令通道建立成功后,FTP客户端不发送port命令,而是发送pasv命令。
FTP服务器接收到此命令后,在高端口上随机选取一个端口并将端口号告诉客户端,客户端在这个端口上与服务器端进行数据的传输。
由于防火墙可能对没有开放的端口进行拦截,所以很多防火墙后的 FTP 服务器和客户端不能正常地通过主动模式或者被动模式进行数据传输,造成 FTP 协议不能正常工作,这通常要采用模式的转换,将主动模式和被动模式进行调整。3、FTP 协议的传输方式
FTP协议有两种传输方式:ASCII 传输模式和二进制数据传输模式,二者的区别在于对传输数据是否进行了解释。(1) ASCII 传输方式
如果在远程机器上运行的不是UNIX,当文件传输时FTP通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序、数据库、字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸、字库等信息的非打印字符)。在复制任何非文本文件之前,用 binary 命令告诉 FTP 逐字复制,不要对这些文件进行处理,这也是下面要讲的二进制传输。(2) 二进制传输模式
在二进制传输中,数据中保存文件的位序,这样原始的数据和复制的数据是逐位一一对应的,而对数据内容本身不进行判断。
例如,Linux 操作系统以二进制方式传送可执行文件到 Windows 系统,在对方系统上,此文件不能执行。如果在ASCII 方式下传输二进制文件,必须对内容进行转译。这会使传输稍微变慢,也会损坏数据,使文件变得不能用(在大多数计算机上,ASCII 方式一般假设每一字符的第一有效位无意义,因为 ASCII 字符组合不使用它。如果你传输二进制文件, 所有的位都是重要的)。如果你知道这两台机器是同样的,则二进制方式对文本文件和数据文件都是有效的。
4、常用FTP工具
三、TELNET 协议和服务
TELNET协议是最早出现的远程登录协议之一,使用TELNET协议可以在本机上登录到远程的计算机上进行一些操作。这在服务器管理中经常使用,可以方便地通过网络对服务器的资源进行访问和控制。
1、远程登录的基本概念
分时操作系统允许多个用户同时使用一台计算机。为了保证系统的安全和记账方便,系统要求每个用户有单独的账号作为登录标识,系统还为每个用户指定了一个口令。用户在使用该系统之前要输入标识和口令,这个过程被称为 “ 登录 ”。
远程登录是指用户使用 telnet 命令,使自己的计算机暂时成为远程主机的一个仿真终端的过程。
2、使用 TELNET 协议进行远程登录的工作过程
使用 TELNET 协议进行远程登录时需要满足以下条件:首先在本地主机上必须装有包含 TELNET 协议的客户程序,还必须知道远程主机的 IP 地址或者域名,要能正常登录必须知道登录的用户名和口令。TELNET 远程登录服务分为以下 4 个过程:
(1) 本地主机与远程主机建立连接。这个建立过程实际上是建立一个 TCP 连接,用户必须知道远程主机的 IP 地址或域名。
(2) 将本地终端上输入的用户名和口令,以及以后输入的任何命令或字符以 NVT(Net Virtual Terminal) 格式传送到远程主机。该过程实际上是从本地主机向远程主机发送一个 IP 数据报。
(3) 将远程主机输出的数据转化为本地所接受的格式送回本地终端,包括输入命令回显和命令执行结果。
(4) 最后,本地主机撤销与远程主机进行的连接,这个过程是撤销一个 TCP 连接。
3、TELNET 协议
TELNET 协议服务器软件是最常用的远程登录服务器软件,它是一种典型的客户端 / 服务器模型的服务,使用 TELNET 协议来工作。
(1)基本内容
TELNET 协议是 TCP/IP 协议族中的一种,是 Internet 远程登录服务的标准协议。使用 TELNET 协议能够把本地用户所使用的计算机变成远程主机系统的一个终端。它提供了 3 种基本服务。
█ TELNET 定义一个网络虚拟终端为远地系统提供一个标准接口。客户端程序不必详细了解远地系统,只需构造使用标准接口的程序。
█ TELNET 包括一个允许客户端和服务器协商选项的机制,而且它还提供一组标准选项。
█ TELNET 对称处理连接的两端,即 TELNET 不强迫客户端从键盘输入,也不强迫客户端在屏幕上显示输出。
(2)异构网络适应
为了使得多种操作系统间的 TELNET 交互操作能够正常进行,TELNET 协议定义了一些统一的网络传输格式和命令。
例如,某些操作系统中需要每行文本用 ASCII 回车控制符(CR)结束,另一些系统则需要使用 ASCII 换行符(LF)作为一行的结束标志,还有一些系统需要用两个字符的序列 回车换行(CRLF)作为结束标记。
大多数操作系统提供了一个中断当前程序运行的快捷键,但这个快捷键在各个系统中有可能不同(一些系统使用 Ctrl+C,而另一些系统使用 Esc 键)。如果不考虑多种操作系统之间的差异和异构性,就会发生在某个操作系统本地发出的字符或者命令,传送到远程主机后不能正常解析的情况。TELNET 协议定义了数据和命令在 Internet 上的传输方式,即网络虚拟终端 NVT(Net Virtual Terminal)。它的应用过程如下所述。
█ 对于发送的数据:客户端软件把来自用户终端的按键和命令序列转换为 NVT 格式,并发送到服务器,服务器软件将收到的数据和命令,从 NVT 格式转换为远地系统需要的格式。
█ 对于返回的数据:远程服务器将数据格式转换为 NVT 格式,而本地客户端将接收到的 NVT 格式数据再转换为本地的格式。
(3)传送远地命令
大多数的操作系统都实现各种控制命令的各种快捷键操作,当登录的用户在本地终端输入这些快捷键的时候,本地系统将执行对应的本地控制命令,而不把这些快捷键作为输入,TELNET 协议使用 NVT 来定义客户端的快捷键并将控制功能传送到服务器。当用户从本地输入普通字符时,NVT 将按照其原始含义传送:当用户输入快捷键或者组合键的时候,NVT 把输入的键值转化为特殊的 ASCII 字符在网络上传送,并在其到达服务器后转化为相应的控制命令。
(4)数据流向
TELNET 应用软件有一个缺点,它的效率不高。主要是其中的数据流向造成的。
数据信息被用户从本地键盘输入并通过操作系统传到客户端程序,客户端程序将其处理后返回操作系统,并由操作系统经过网络传送到服务器,服务器的操作系统将所接收的数据传给服务器程序,并经服务器程序再次处理后返回到操作系统上的终端入口点,最后,服务器操作系统将数据传送到用户正在运行的应用程序,这便是一次完整的输入过程:输出将按照同一通路从服务器传送到客户端。
因为每一次输入和输出时,计算机将切换进程环境好几次,这个开销是很昂贵的。由于用户按键的速率并不高,所以响应速度一般来说仍然可以接受。
[
](https://blog.csdn.net/Change_Improve/article/details/105924895)
四、SSH协议
SSH 为 Secure SHell 的缩写,SSH是Secure SHell Protocol 安全外壳协议,为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
1、什么是SSH?
简单说,SSH是一种网络协议,用于计算机之间的加密登录。
如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。
最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。
需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。
此外,本文只讨论SSH在Linux Shell中的用法。如果要在Windows系统中使用SSH,会用到另一种软件PuTTY,这需要另文介绍。
2、安全性比较
SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。
传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式,就是“中间人”冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。
通过使用SSH,你可以把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的“通道”。
[
](https://blog.csdn.net/krismile__qh/article/details/95211730)
3、协议概况
传输层协议 [SSH-TRANS] 提供了服务器认证,保密性及完整性。此外它有时还提供压缩功能。SSH-TRANS 通常运行在 TCP/IP连接上,也可能用于其它可靠数据流上。SSH-TRANS 提供了强力的加密技术、密码主机认证及完整性保护。该协议中的认证基于主机,并且该协议不执行用户认证。更高层的用户认证协议可以设计为在此协议之上。
用户认证协议 [SSH-USERAUTH] 用于向服务器提供客户端用户鉴别功能。
它运行在传输层协议 SSH-TRANS 上面。当 SSH-USERAUTH 开始后,它从低层协议那里接收会话标识符(从第一次密钥交换中的交换哈希 H )。会话标识符唯一标识此会话并且适用于标记以证明私钥的所有权。SSH-USERAUTH 也需要知道低层协议是否提供保密性保护
连接协议 [SSH-CONNECT] 将多个加密隧道分成逻辑通道。它运行在用户认证协议上。它提供了交互式登录话路、远程命令执行、转发 TCP/IP 连接和转发 X11 连接。
可以看到,里面有几个关键的key:
- session key: 这个是用来作为secret key加密用的一个key,同时也作为每个ssh连接的标识ID。
- host key: 这个是用来作为server的身份验证用的。
- known-hosts: 这个是存在客户端的一个可信server的public key列表。
- user key: 这个是用来作为client的身份验证用的。
一旦建立一个安全传输层连接,客户机就发送一个服务请求。当用户认证完成之后,会发送第二个服务请求。这样就允许新定义的协议可以与上述协议共存。连接协议提供了用途广泛的各种通道,有标准的方法用于建立安全交互式会话外壳和转发( “隧道技术”)专有。
4、基本用法
SSH主要用于远程登录。假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。
$ ssh user@host
如果本地用户名与远程用户名一致,登录时可以省略用户名。
$ ssh host
SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。
$ ssh -p 2222 user@host
上面这条命令表示,ssh直接连接远程主机的2222端口。
5、常用工具
windows系统:xshell、putty等
linux系统:openssh、remmina等
五、NFS服务
NFS 就是NetworkFileSystem 的缩写,最早之前是由Sun这家公司所发展出来的 (注1)。 它最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 (share files)。
所以,你也可以简单的将他看做是一个文件服务器 (file server) 呢!这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样 (partition)!使用上面相当的便利!
NFS协议是一种用于文件共享的协议,它可以使得主机之间进行文件的共享。客户端可以像在本机上的文件一样操作远程主机的文件。NFS协议最初仅支持UDP协议,目前最新版本的NFS可以支持UDP或者TCP协议,不过UDP协议的速度会更快。
1、定义
NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。RPC采用了XDR的支持。XDR是一种与机器无关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码,支持在异构系统之间数据的传送。
2、工作原理
NFS(Network File System,网络文件系统)是当前主流异构平台共享文件系统之一。主要应用在UNIX环境下。最早是由Sun Microsystems开发,现在能够支持在不同类型的系统之间通过网络进行文件共享,广泛应用在FreeBSD、SCO、Solaris等异构操作系统平台,允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,使得每个计算机的节点能够像使用本地资源一样方便地使用网上资源。换言之,NFS可用于不同类型计算机、操作系统、网络架构和传输协议运行环境中的网络文件远程访问和共享。
1)首先服务器端启动RPC服务,并开启111端口
2)服务器端启动NFS服务,并向RPC注册端口信息
3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。、
NFS的工作原理是使用客户端/服务器架构,由一个客户端程序和服务器程序组成。服务器程序向其他计算机提供对文件系统的访问,其过程称为输出。NFS客户端程序对共享文件系统进行访问时,把它们从NFS服务器中“输送”出来。文件通常以块为单位进行传输。其大小是8KB(虽然它可能会将操作分成更小尺寸的分片)。NFS传输协议用于服务器和客户机之间文件访问和共享的通信,从而使客户机远程地访问保存在存储设备上的数据。
3、网络文件系统架构
NFS是客户 — 服务器模型。服务器实施共享文件系统,以及客户端所连接的存储。客户端实施用户接口来共享文件系统,并加载到本地文件空间当中。 在 Linux中,虚拟文件系统交换(VFS)提供在一个主机上支持多个并发文件系统的方法(比如 CD-ROM 上的 International Organization for Standardization [ISO] 9660,以及本地硬盘上的 ext3fs)。VFS 确定需求倾向于哪个存储,然后使用哪些文件系统来满足需求。由于这一原因,NFS 是与其他文件系统类似的可插拔文件系统。对于 NFS 来说,唯一的区别是输入/输出(I/O)需求无法在本地满足,而是需要跨越网络来完成。
一旦发现了为 NFS 指定的需求,VFS 会将其传递给内核中的 NFS 实例。NFS 解释 I/O 请求并将其翻译为 NFS 程序(OPEN、ACCESS、CREATE、READ、CLOSE、REMOVE 等等)。这些程序,归档在特定 NFS RFC 中,指定了 NFS 协议中的行为。一旦从 I/O 请求中选择了程序,它会在远程程序调用(RPC)层中执行。正如其名称所暗示的,RPC 提供了在系统间执行程序调用的方法。它将封送 NFS 请求,并伴有参数,管理将它们发送到合适的远程对等级,然后管理并追踪响应,提供给合适的请求者。
进一步来说,RPC 包括重要的互操作层,称为外部数据表示(XDR),它确保当涉及到数据类型时,所有 NFS 参 与者使用相同的语言。当给定架构执行请求时,数据类型表示可能不同于满足需求的目标主机上的数据类型。XDR 负责将类型转换为公共表示(XDR),便于所有架构能够与共享文件系统互操作。XDR 指定类型字节格式(比如 float)和类型的字节排序(比如修复可变长数组)。虽然 XDR 以其在 NFS 中的使用而闻名,当您在公共应用程序设置中处理多个架构时,它是一个有用的规范。
一旦 XDR 将数据转换为公共表示,需求就通过网络传输给出传输层协议。早期 NFS 采用 Universal Datagram Protocol(UDP),但是,今天 TCP 因为其优越的可靠性而更加通用。
在服务器端,NFS 以相似的风格运行。需求到达网络协议栈,通过 RPC/XDR(将数据类型转换为服务器架构) 然后到达 NFS 服务器。NFS 服务器负责满足需求。需求向上提交给 NFS 守护进程,它为需求标示出目标文件系统树,并且 VFS 再次用于在本地存储中获取文件系统。整个流程在图 3 中有展示。注意,服务器中的本地文件系统是典型的 Linux 文件系统(比如 ext4fs)。因此,NFS 不是传统意义上的文件系统,而是访问远程文件系统的协议。
对于高延迟网络,NFSv4 实现称为 compound procedure 的程序。这一程序从本质上允许在单个请求中嵌入多个 RPC 调用,来最小化通过网络请求的 transfer tax。它还为响应实现回调模式。
4、网络文件系统协议
从客户端的角度来说,NFS 中的第一个操作称为 mount。Mount 代表将远程文件系统加载到本地文件系统空间中。该流程以对 mount(Linux 系统调用)的调用开始,它通过 VFS 路由到 NFS 组件。确认了加载端口号之后(通过 get_port 请求对远程服务器 RPC 调用),客户端执行 RPC mount 请求。这一请求发生在客户端和负责 mount 协议(rpc.mountd)的特定守护进程之间。这一守护进程基于服务器当前导出文件系统来检查客户端请求;如果所请求的文件系统存在,并且客户端已经访问了,一个 RPC mount 响应为文件系统建立了文件句柄。客户端这边存储具有本地加载点的远程加载信息,并建立执行 I/O 请求的能力。这一协议表示一个潜在的安全问题;因此,NFSv4 用内部 RPC 调用替换这一辅助 mount 协议,来管理加载点。
要读取一个文件,文件必须首先被打开。在 RPC 内没有 OPEN 程序;反之,客户端仅检查目录和文件是否存在于所加载的文件系统中。客户端以对目录的 GETATTR RPC 请求开始,其结果是一个具有目录属性或者目录不存在指示的响应。接下来,客户端发出 LOOKUP RPC 请求来查看所请求的文件是否存在。如果是,会为所请求的文件发出 GETATTR RPC 请求,为文件返回属性。基于以上成功的 GETATTRs 和 LOOKUPs,客户端创建文件句柄,为用户的未来需求而提供的。
利用在远程文件系统中指定的文件,客户端能够触发 READ RPC 请求。READ 包含文件句柄、状态、偏移、和读取计数。客户端采用状态来确定操作是否可执行(那就是,文件是否被锁定)。偏移指出是否开始读取,而计数指出所读取字节的数量。服务器可能返回或不返回所请求字节的数量,但是会指出在 READ RPC 回复中所返回(随着数据)字节的数量。
5、RPC概念
既然NFS是通过网络来进行服务器端和客户端之间的数据传输,那么两者之间要传输数据就要有想对应的网络端口,NFS服务器到底使用哪个端口来进行数据传输呢?基本上NFS这个服务器的端口开在2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了!
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,记客户端可以连接到正常端口上去。
那么RPC又是如何知道每个NFS功能的端口呢?
首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。
提示:在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。