⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 198.htm

📁 unix高级编程原吗
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="185.htm">上一层</a>][<a href="199.htm">下一篇</a>]
<hr><p align="left"><small>发信人: ysqcn (岁月无声), 信区: UNP <br>

标  题: 文件传输协议 <br>

发信站: UNIX编程 (2001年07月30日00:02:42 星期一), 站内信件 <br>

  <br>

发信人: flying (欣欣#简直郁闷死了!), 信区: LinuxUnix <br>

标  题: 文件传输协议(file transfer protocol, ftp) <br>

发信站: 碧海青天 (Tue Jan  9 01:29:40 2001), 转信 <br>

  <br>

文件传输协议(file transfer protocol, ftp) <br>

  <br>

1. 介绍 <br>

  <br>

ftp的目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户 <br>

透明和可靠高效地传送数据。虽然我们也可以手工使用它,但是它的主要作用是供 <br>

程序使用的。在阅读本文之前最好能够阅读tcp协议标准规范和telnet协议标准规 <br>

范。 <br>

  <br>

2. 概览 <br>

  <br>

在本节中我们将讨论一些表面上的问题,有些名词的定义请参阅tcp和telnet参考 <br>

文献。我们先介绍一下(1)字节大小,在ftp中字节大小有两个:逻辑字节大小和 <br>

用于传输的字节大小。后者通常是8位,而前者可不一定是多少了。传输字节不必 <br>

等于逻辑字节大小,也不必对数据结构进行解释。(2)控制连接是建立在 <br>



user-pit和server-pi之间用于交换命令与应答的通信链路。(3)数据连接是传输 <br>

数据的全双工连接。传输数据可以发生在服务器dtp和用户dtp之间也可以发生在两 <br>

个服务器dtp之间。(4)dtp:数据传输过程(dtp)建立和管理数据连接,dtp可 <br>

以是主动的也可以是被动的。(5)eor代表记录尾。(6)ntv代表网络虚拟终端, <br>

它的定义与在telnet协议中的定义一致。(7)nvfs代表网络虚拟文件系统。(8) <br>

ftp可以传输非连续的文件,这些文件的一部分称为页。(9)pi代表协议解释器。 <br>

(10)服务器dtp代表一种传输过程,它通常处于“主动”状态,它和侦听端口建 <br>

立数据连接,它还可以为传输和存储设置参数,并根据pi的指令传输数据。当然, <br>

dtp也可以转入“被动”状态。(11)服务器ftp进程,它是和用户ftp进程一起工 <br>

作的,它由pi和dtp组成。至于用户ftp进程则是由pi,dtp和用户接口组成的。下 <br>

图是ftp服务示意图: <br>

  <br>

  <br>

  <br>

注意:数据连接是双向的,它不用整个时间都存在。上图中用户pi开始控制连接, <br>

控制连接与telnet协议很象。在开始阶段,标准ftp命令由用户pi产生并通过控制 <br>

连接传送到服务器进程。服务器pi向用户pi返回标准应答。ftp命令指定数据连接 <br>

参数和文件系统操作。用户dtp在特定数据端口侦听,服务器开始数据连接并以指 <br>

定的参数开始数据传输。数据端口不必在开始ftp命令的机器上,但用户或用户 <br>

ftp进程必须确定它在指定的数据端口上侦听。这个数据连接是全双工的。 <br>

  <br>

在另外一种情况下,用户或许希望在两个主机间传送文件,不是两个本地主机。用 <br>



户在两台主机间建立控制连接,然后规划数据连接。用这种方式,控制信息由用户 <br>

pi获得,但是数据在服务器dtp之间传送。下面就是一个例子: <br>

  <br>

  <br>

  <br>

协议要求数据传输在处理时打开控制连接。在完成ftp服务后由用户中止控制连接 <br>

,而服务器具体操作。如果在未接收命令时关闭了控制连接,服务器也会关闭数据 <br>

传输。ftp和telnet很有联系,ftp使用telnet协议进行控制连接,可有两种方法达 <br>

到目的:用户pi或服务器pi可以在自己的过程中实现telnet协议的功能;第二种方 <br>

法是利用系统中现有的telnet模块。实现上,ftp对telnet协议的依赖也不多,即 <br>

使重新实现,代码量也不大。 <br>

  <br>

3. 数据传输功能 <br>

  <br>

数据连接只传输数据,控制连接传送命令和响应。几个命令是关于在主机间传输数 <br>

据的,数据传输基本上独立于物理结构的,但是如果在压缩传输模式下流式传输与 <br>

文件结构有关,文件的属性与表示类型有关。 <br>

  <br>

3.1. 数据表示与保存 <br>

  <br>

数据是在主机间的存储设置间传送的。因为两个系统的数据存储方式不同,因此需 <br>

要对它进行转换,在传送文本时会有对ascii表示的问题,在进行二进制传送的时 <br>



候,会有不同系统对字节长度规定不同的问题,有的系统是7位,有的系统可能是 <br>

32位,这也需要进行转换。需要提供数据表示与传输模型函数,但是ftp提供这方 <br>

面的功能不多,超过ftp提供功能的那一部分要用户自己实现。 <br>

  <br>

3.1.1. 数据类型 <br>

  <br>

数据表示是由用户指定的表示类型,它可以是隐含的,也可以是用户指定的。请一 <br>

定注意:逻辑字节长度与物理字节长度是不同的。 <br>

  <br>

3.1.1.1. ascii类型 <br>

  <br>

这是所有ftp必须实现的默认类型,用于传送文本文件,当在主机间使用ebcdic传 <br>

送时更方便,则不使用ascii类型。发送方将内部表示转换为nvt-ascii格式,接收 <br>

方则进行相反的过程接收数据。根据nvt标准,要在行结束处使用<crlf>序列。 <br>

nvt-ascii是8位的。ascii和ebcdic的格式参数在下面讨论。 <br>

  <br>

3.1.1.2. ebcdic类型 <br>

  <br>

它是作为ascii的另一种方法在主机间传送数据的数据类型。ebcdic和ascii很象, <br>

仅在类型的功能描述上有一些差别。行结束符使用很少。 <br>

  <br>

3.1.1.3. 图象类型 <br>



  <br>

在此类型下传送的数据被看作连续的位,发送方将数据打包到8位传输字节中传送 <br>

。因为结构的需要要对传送数据进行填充,填充字节全部为0,填充必须在文件结 <br>

构时使用,而且要标记出以便接收方过滤掉。它用于传送二进制数据和有效地传送 <br>

和存储文件,因此所有ftp也必须实现。 <br>

  <br>

3.1.1.4. 本地类型 <br>

  <br>

也可以以十进制指定逻辑字节大小。如果物理字节大小和逻辑字节大小不同,直接 <br>

将物理数据打包为逻辑字节,不用什么填充。接收方根据逻辑字节大小进行和本机 <br>

的存储特点进行转换。传输必须是可重复的,也就是说,相同的文件相同的参数, <br>

那内容必须是一样的。 <br>

  <br>

3.1.1.5. 格式控制 <br>

  <br>

ascii和ebcdic有一个可选参数,它说明文件垂直格式控制,下面的数据表示类型 <br>

在ftp中有定义。字符文件可能有三种用途,打印,存储或留待以后处理。如果是 <br>

用于打印,那主机必须知道垂直格式控制的表示,如果存储或等以后处理,也需要 <br>

保留文件格式。如果在远程主机上处理完后传输回本地主机,要保证远程主机处理 <br>

时没有麻烦。这都需要在ascii和ebcdic格式上加入新的参数。 <br>

  <br>

3.1.1.5.1. non print <br>



  <br>

未指定第二个参数是它是默认值。它必须为所有ftp接受。如果传输的文件是用于 <br>

打印的,则使用边界和间隔的默认值。通常它不用于打印目的,而用于保存文件或 <br>

执行文件。 <br>

  <br>

3.1.1.5.2. telnet格式控制 <br>

  <br>

文件包括ascii/ebcdic垂直格式控制,这些控制字符可以使打印正常进行。 <br>

  <br>

3.1.1.5.3. carriage control (asa) <br>

  <br>

文件包含asa (fortran)垂直格式控制字符。在以asa标准形成的行中,第一个字符 <br>

不打印,它用于决定打印前的走纸量。下面是定义了的asa字符: <br>

  <br>

blank: 向下移动1行;0:向下移动2行;1:移动至下一页;+:不移动 <br>

  <br>

打印机必须能够决定结构体的结束。如果文件本身有记录结构就没有问题,如果没 <br>

有,<crlf>用于区别打印行,但这些格式标记已经由asa控制字符使用了。 <br>

  <br>

3.1.2. 数据结构 <br>

  <br>

除了有不同的数据类型外,ftp还允许有不同的文件结构,下面是三种文件结构: <br>



文件式结构:文件中没有内部结构,文件被看作是二进制流;记录结构:文件是由 <br>

一系列记录组成的;页结构:文件是由不同的索引页组成的。 <br>

  <br>

如果未使用stru命令,文件结构是默认值。文件的结构会影响传输模型,存储和数 <br>

据表示。文件本来的属性和保存它的主机有关,不同的机器会以自己的方式保存文 <br>

件。在不同主机间传送文件时必须使主机能够识别相互的表示。有些主机上的文件 <br>

是面向字节的,有些是面向记录的,在传送时就会出现问题。那就要在接收方进行 <br>

内部转换。在进行转换的时候,需要区别记录的边界,在ascii中使用<crlf>,在 <br>

ebcdic中使用<nl>作为分隔符。采用这种实现方法的必须保证转换是可逆的。 <br>

  <br>

3.1.2.1. 文件结构 <br>

  <br>

如果未使用stru命令,文件结构是默认值。文件结构中没有默认值,文件被看作是 <br>

连续的字节串。 <br>

  <br>

3.1.2.2. 记录结构 <br>

  <br>

对于文本文件,记录结构必须是所有ftp实现必须有的。记录结构文件是由连续的 <br>

记录构成的。 <br>

  <br>

3.1.2.3. 页结构 <br>

  <br>

  <br>

文件是非连续时使用页结构。这种文件称为随机访问文件。这些文件中有时会的和 <br>

文件整体或部分相关的信息出现。在ftp中,文件的一个部分称为页。为了提供不 <br>

同的页大小和相关信息,每页都带页头发送。页头中有如下域: <br>

  <br>

头长度 <br>

 包括此字节的页头长度,单位为字节,最小长度为4 <br>

  <br>

页索引 <br>

 指出此部分在原文件中的位置,它和传输编号不是一回事 <br>

  <br>

数据长度 <br>

 页数据中的逻辑字节数,最小值为0 <br>

  <br>

页类型 <br>

 页的类型有以下几种:0=未页,指示传输结构,包头必须为4,数据长度必须为0 <br>

;1=通常页,没有控制信息的通常页文件的普通类型;2=描述子页,用于传送整体 <br>

文件的描述信息;3=访问控制页,包括页级访问控制信息的页文件头域,包头长度 <br>

必须为5 <br>

  <br>

可选域 <br>

 提供每页的控制信息 <br>

  <br>

  <br>

  <br>

所有域均以1个逻辑字节长度为大小,逻辑字节长度由type命令指定。如果读取版 <br>

本与和开始版本号一致,文件访问时必须以相同的参数进行。如果参数相同,ftp <br>

实现要保证取得的文件内容是相同的。 <br>

  <br>

3.2. 建立数据连接 <br>

  <br>

传送数据机制包括建立连接选择数据参数。用户和服务器dtp有默认数据端口。用 <br>

户进程默认数据端口和控制连接端口相同。服务器进程默认数据端口和控制连接端 <br>

口相邻。传输字节大小是8位字节。此字节是实际传输字节,但不代表主机内的数 <br>

据表示。被动数据传输进程在数据端口接收数据,ftp请求命令决定数据传输的方 <br>

向。服务器在接收到请求以后,将初始化端口的数据连接。当连接建立后,传输在 <br>

dtp之间传送,服务器pi对用户pi返回应答。ftp实现运行一个默认数据端口,用户 <br>

pi才能改变默认端口。 <br>

  <br>

通过port命令可能改变端口,用户可能希望数据在第三方主机上进行其它操作,用 <br>

户pi需要在两个服务器pi上建立连接。一个服务器被告知侦听另一服务器的请求。 <br>

用户pi通过port命令通知另一服务器的数据端口。最后双方发送相应的传送命令。 <br>

通常,服务器负责支持数据连接,初始化并关闭它,除非用户dtp在传输模式下要 <br>

求关闭连接。服务器在下面情况下关闭数据连接: <br>

  <br>

1. 服务器结束发送数据,通过eof要求中止传送; <br>



  <br>

2. 用户发送abort命令; <br>

  <br>

3. 用户改变端口; <br>

  <br>

4. 控制连接关闭; <br>

  <br>

5. 发生不可恢复错误。 <br>

  <br>

3.3. 数据连接管理 <br>

  <br>

默认数据连接端口:所有ftp必须支持默认数据连接,只有用户pi能够初始化非默 <br>

认端口的使用。 <br>

  <br>

确定非默认数据端口:用户pi可以使用port命令指定非默认端口,它要求服务器方 <br>

以pasv确定非默认数据端口。连接是由双方地址确定的,因此改变一方地址就改变 <br>

了连接。 <br>

  <br>

数据连接的重用:在使用流式数据传输模型时,文件结束通过关闭连接指示。如果 <br>

要传送多个文件时就会出麻烦,解决的方法有两个,一个是确定非默认端口,另一 <br>

个是使用另一种传输模式。就传输模式而言,流传输模式是不安全的,因此无法确 <br>

定连接是暂时还是永久关闭。其它传输模式不通过关闭连接表示文件结构,它们可 <br>



以通过ftp命令决定传送结构。因此使用这些传输模式可以在保持连接的情况下传 <br>

送多个文件。 <br>

  <br>

3.4. 传输模式 <br>

  <br>

有三种传输模式:一种将数据格式化并考虑重新开始过程;一种压缩数据;一种是 <br>

不经过处理(少量处理)传送。所有数据传输必须以一个eof结束,它可以显式给 <br>

出,也可以通过关闭连接隐式给出。对于记录文件,所有eor是显式的,包括最后 <br>

一个记录。对于以页结构传送的文件,使用“最后一页”表示结束。从这里开始, <br>

下文中我们提到的字节指的是“传输字节”。 <br>

  <br>

为了进行标准化传送,传送主机必须把行结束或记录结束的内部表示转化为传输模 <br>

式和文件结构指定的形式传送,接收方则进行相反的工作。ibm大型机的记录计数 <br>

域可能不能为其它主机识别,所以记录结束标记在流模式下以双字节控制码传送, <br>

在块或压缩模式下以标记位传送。而ascii或ebcdic的行结束则则<crlf>或<nl>指 <br>

示。这样的转换需要时间,所以相同的系统在传送文本文件时采用二进制或流表示 <br>

比较合适。下面是ftp定义的传输模式: <br>

  <br>

3.4.1. 流模式 <br>

  <br>

数据以字节流的形式传送。使用的表示类型没有限制,允许记录结构。在记录结构 <br>

文件eor和eof表示为双字节控制码。第一字节全为0,后一字节为转义字符。当第 <br>



二位值为1时表示eor,为2时表示eof,如果要同时表示eor和eof,值为3。全1字节 <br>

作为数据发送时必须使用双字节传送,其中数据保存在第二个字节内。如果是文件 <br>

结构,通过发送方关闭连接表示eof,接收到的所有数据就是文件内容。 <br>

  <br>

  <br>

  <br>

3.4.2. 块模式 <br>

  <br>

文件以块形式传送,块带有自己的头部分。头字节包括计数域和描述子代码。计数 <br>

域说明了数据块的字节数,描述子代码定义了以下内容:eof,eor重新开始标记或 <br>

怀疑错误数据。怀疑错误数据不是为了进行差错控制,它是为了站点间交换特定数 <br>

据,传送时不管本地错误(如硬盘错误)而只管传送,但是传送时可要指出,这个 <br>

数据可能有错。在此模式下可以使用记录结构,也可以使用相应的数据表示。头字 <br>

节的结构如下图所示: <br>

  <br>

描述子 8位 <br>

 字节计数 16位 <br>

  <br>

  <br>

描述子代码由在描述子字节中的位标记说明,下面是已经指定的四种代码及其意义 <br>

: <br>

  <br>

  <br>

代码 <br>

 意义 <br>

  <br>

128 <br>

 数据块结束是eor <br>

  <br>

64 <br>

 数据块结束是eof <br>

  <br>

32 <br>

 数据块内有怀疑错误 <br>

  <br>

16 <br>

 数据块是重新开始标记 <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

以这种编码,对于特定块可能存在多个描述子编码条件,所需要的位必须全部设置 <br>

。重新开始标记包括在数据流中,它作为8位整数代表在控制连接上使用语言的可 <br>



打印字节,但<sp>不得出现在其中。例如要传送6字节标记,下面就是例子: <br>

  <br>

  <br>

  <br>

descrptr code = 16 <br>

 byte count = 6 <br>

  <br>

  <br>

  <br>

  <br>

marker 8位 <br>

 marker 8位 <br>

 marker 8位 <br>

  <br>

  <br>

  <br>

  <br>

marker 8位 <br>

 marker 8位 <br>

 marker 8位 <br>

  <br>

  <br>

  <br>

3.4.3. 压缩模式 <br>

  <br>

有三种信息需要传送:常规数据以字节串传送;压缩数据,包括复本和过滤器;控 <br>

制信息,以两个转义字符传送。如果有n(>0但小于127)个常规数据传送,在数据 <br>

前一位加上一个字节,这个字节最高位为0,其它位表示的数值等于n。如下图: <br>

  <br>

  <br>

  <br>

若要压缩一个数据位d的n复本字符串,用两个字节传送,如下图,它表示的是压缩 <br>

的字节: <br>

  <br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -