当前位置:Linux教程 - Linux - 熟知套接字和应用层

熟知套接字和应用层



        
    翻译:llrraa

    Charles L. Hedirck 版权所有 (C) 1987
    任何人可以部分或全部的复制 该文章 ,只要符合以下情况:(1) 任何对整篇文章的复制或者重新出版都应该注明该文 源自Rutgers University,并包括该说明;(2)任何对文中内容的使用应说明使用了 对该文的参考并指明来自Rutgers University,并经过作者Charles Hedrick授权 。

    迄今为止,我们已经描述了一个数据流怎么被分解成数据包的,被送到另一台计 算机,并且按原样合起来。然而,要实现任何有用的事情就必须做更多的事情。 必须有一种方法让你对指定的计算机打开连接,登录上去,告诉它你需要什么文 件,并且控制文件的传输。(如果你想到不同的应用,例如计算机邮件,某种类 似的协议也是需要的。)这个是由”应用层协议“完成的。应用层协议位于 TCP/IP协议的顶部。也就是说,当他们需要发送一个消息,他们会把那个消息交 给TCP层。TCP层确保它输送到另一端。因为TCP层和IP层处理了所有的网络方面的 细节,应用层协议可以认为一个网络连接是一个简单的字节流,就像一个终端或 一条电话线。

    在探究关于应用程序的更多细节之前,我们必须描述一下怎么找到一个应用。 假设你想传送一个文件到一台Internet地址为128.6.4.7电脑上。要开始这个过程 ,你需要的不仅仅是Internet地址。你必须连接到另一端的FTP服务器。一般而言 ,网络程序专门用来完成一些特定的任务。大多数系统用不同的程序去处理文件 传输,远程终端登录,邮件等等。当你连接到128.6.4.7时,你必须指定你要和 FTP服务器对话。这是通过每个服务器持有的熟知套接字来实现的。前面已经说过 TCP层用端口号来区别不同的会话。用户程序通常使用或多或少的随机产生的端口 号。然而特定的端口号被指派给等待请求的程序。例如,如果你要传送一个文件 ,你要启动一个称为“ftp”的程序。它将使用某个随机数(假定为1234)来打开 一个连接,这个随机数就是它这端的端口号。然而它将指定21作为另一端的端口 号。这是FTP服务器的正式端口号。注意,有两个不同的程序与此有关。你运行 ftp在你这边。这个程序被设计成用来接受从你的终端发出的命令并把他们传递到 另一端。在另一台机器上与你会话的程序是FTP服务器。与其说它被设计为一台交 互式的终端,还不如说它是被设计用来接受来自网络连接的命令的程序。没有必 要让你的程序使用一个熟知套接字号,因为没有人会去查找它。但是服务器必须 有熟知端口号,这样子才能让人们对它们打开连接并且开始向它们传送命令。每 个程序的正式端口号都取之于”已分配号码“。

    注意,一个连接实际上由一组4个数来描述:各端的Internet地址和各端的TCP层 端口号。每个数据报都包含所有这4个数在里边。(Internet地址在IP头里,TCP 层端口号在TCP头里。)为了互相区别,任意两个连接都不能拥有相同的一组数字 。但是只要其中的任何一个数字不同就足够啦。例如,很有可能同一台机器的两 个用户要传送文件到相同的另一台机器,这就可能形成具有以下参数的连接:
    Internet地址 TCP 端口
    连接 1 128.6.4.194, 128.6.4.7 1234, 21
    连接 2 128.6.4.194, 128.6.4.7 1235, 21

    既然有关相同的机器,Internet地址就是一样的。因为它们都进行文件传输,所 以连接的一端涉及FTP的熟知端口号。唯一不同的东西是用户运行的程序的端口号 。这已经足以形成区别了。一般来说,至少连接的一端要求网络软件给它分配确 是保唯一的端口号。通常这个由用户端做,因为服务器必须使用熟知端口号码。 既然我们知道怎么打开连接了,让我们回过头来继续谈应用程序。正如刚才提到 的,一旦TCP打开一个连接,我们就有了一个像简单的电线那样的东西。所有困难 的部分都由TCP层和IP层处理。然而我们仍然需要某种与我们通过这个连接要传送 的东西相关的协议。实际上这仅仅是关于应用程序要了解哪一套命令以及这些命 令将以哪一种形式传送的协议。所传送的东西通常包括命令和数据。他们通过上 下文来区分。例如,邮件协议象这样来工作:你的邮件程序对另一端的邮件服务 器打开一个连接。你的程序告诉服务器你的机器名,信息的寄件人,以及你希望 信息送达的收件人。然后它传送一个命令告诉服务器它将开始传送信息。到了这 一步,另一端不再把它收到的数据当成命令,并且准备开始开始接受信息。你这 一端然后就开始传送信息。在信息的末尾,一个特殊的记号将被传送(第一列的 一个圆点)。然后,双方都知道你的程序又传送命令了。这是处理过程的最简单 的方法,大部分应用程序都使用这种方法。

    文件传输稍微复杂一些。文件传输协议包括两个连接。它刚开始时就像邮件一样 。用户的程序发出命令如“让我以这个用户的身份注册”,“这是我的密码”,“用这个名字把那个文件传输给我”。然而一旦传送数据的命令被发出,第二个 连接将为数据自己而打开。当然我们可以用相同的连接传送数据,就像邮件那样 。但是文件传输通常需要很长时间。文件传输协议的设计者希望让用户在传输进 行的同时能够继续发出命令。例如,用户可以进行一个查询,或者可以停止传输 。这样设计者感到最好为数据使用单独的连接,而把原先的命令连接继续留给命 令。(也有可能对两台不同的计算机打开连接,并让它们从其中一台传输文件到 另一台计算机上。在这种情况下,数据就不能通过命令连接传送。)

    除此以外,远程终端连接使用另一种机制。对于远程登录,只有一个连接。它通 常传送数据。当需要传送命令的时候(例如要设置终端类型,或者改变某种模式 ),一个特殊的字符将被使用以表明下一个字符是一条命令。如果用户碰巧把那 个特殊字符作为数据键入,两个那样的字符将被传送。

    我们不准备在本文档里详细描述应用层协议。你自己去阅读RFC更好一点。然而有 两个共同的惯例被在这里描述的应用软件使用。第一个是共同网络表示法: TCP/IP协议被期望在任何一台计算机上都可用。不幸地,并非所有的计算机在数 据如何来表示这个问题上保持一致。在字符编码(ASCII对EBCDIC)方面也有差别 ,在约定的行末字符(回车,换行,或者一种使用计数的表示法)方面以及在终 端默认字符一个一个地传送还是一行一次地传送问题上都有分歧。为了让不同种 类的计算机互相通信,每个应用层协议定义了一种标准的表示法。注意,TCP和IP 对表示法不关心。TCP仅仅传送八位字节。然而,两端的程序必须在如何解释这些 八位字节的问题上达成一致。每种应用的RFC都指定了该应用的标准表示法。通常 是“网络ASCII码”。这种码使用ASCII字符,并用回车后面跟着换行符表示行末 。对于远程登录,也有一种“标准终端”的定义,这种终端就是重现发生在远程 机器上的事件的半双工终端。大部分应用程序也允许两台计算机在其它表示法上 达到一致,这些表示法使它们感到更方便一些。例如,PDP-10系列具有36比特的 字。有一种方法使两台PDP-10机器在传送36比特二进制文件上达成一致。类似地 ,两个更喜欢全双工终端会话的系统能够达成一致。然而,每个应用都有一种标 准表示法,每台机器都必须支持这种表示法。

    一个示范应用:SMTP 为了更好的阐明什么与应用层协议有关,我将举一个SMTP的例子,SMTP是一个邮 件协议。(SMTP就是简单邮件传输协议。)我们假定一台叫做TOPAZ.RUTGERS.EDU 希望传输以下信息。

    Date: Sat, 27 Jun 87 13:26:31 EDT
    From: [email protected]
    To: [email protected]
    Subject: meeting
    Let\s get together Monday at 1pm.

    首先,要注意信息本身的格式是用一种Internet标准(RFC 822)来描述的。这个 标准指定了信息必须以网络ASCII码(也就是它必须是ASCII码,并用回车/换行来 划分行)来传送。它也描述了总体的结构,这个结构首先是一组标题行,然后是 一空白行,接着是信息的内容。最后,它详细地描述了标题行的语法。通常它们 由一个关键字和紧跟的一个值组成。 要注意地址表示为[email protected]。开头,地址仅仅是“某人在某台机器 上”。然而,最近的标准使它更灵活。有规定让某些系统处理另一些系统的邮件 。这样就能允许对没连接到Internet的计算机进行自动转发。它可以用来让很多 系统向中心邮件服务器发信件。实际上甚至不需要有一台名为RED.RUTGERS.EDU的 实际计算机存在。名字服务器可以设置为使你可以根据部门名称发信件,并且每 个部门的信件会被自动送到相应的计算机。也有可能在@符号之前有不同于用户名 的其它东西。程序有可能被设置用来处理邮件。也有规定去处理邮件列表和一般 性的名字如“postmaster”或“operator”

    信息传输到另一个系统的方法在RFC821和974中有描述。要进行传送的程序通过查 询名字服务器以确定传输信息到哪里。第一个查询是要查明哪台机器处理名为 RED.RUTGERS.EDU的邮件。此种情况下,服务器回答RED.RUTGERS.EDU处理它自己 的邮件。然后程序请求RED.RUTGERS.EDU的地址,这个地址是128.6.4.2。然后邮 件程序对128.6.4.2打开端口为25的TCP连接。端口25是用来接收邮件的熟知套接 字。一旦建立了连接,邮件程序便开始传送命令。下面是一次典型的对话。每一 行都有标记以说明它是来自TOPAZ还是RED的。要注意是TOPAZ发起连接的:

    RED 220 RED.RUTGERS.EDU SMTP Service at 29 Jun 87 05:17:18 EDT
    TOPAZ HELO topaz.rutgers.edu/ RED 250 RED.RUTGERS.EDU - Hello, TOPAZ.RUTGERS.EDU
    TOPAZ MAIL From:
    RED 250 MAIL accepted
    TOPAZ RCPT To:
    RED 250 Recipient accepted
    TOPAZ DATA
    RED 354 Start mail input; end with .
    TOPAZ Date: Sat, 27 Jun 87 13:26:31 EDT
    TOPAZ From: [email protected]
    TOPAZ To: [email protected]
    TOPAZ Subject: meeting
    TOPAZ
    TOPAZ Let\s get together Monday at 1pm.
    TOPAZ .
    RED 250 OK
    TOPAZ QUIT
    RED 221 RED.RUTGERS.EDU Service closing transmission channel

    首先,要注意命令都使用普通的文本。这在Internet标准中是很典型的。许多协 议都使用标准的ASCII命令,这样就容易知道正在进行什么操作和分析问题。例如 ,邮件程序保留每次会话的记录。如果出了问题,记录文件可以简单地寄给邮件 管理员。因为是普通文本,所以管理员能了解正在进行什么操作。它也允许人为 测试与邮件服务器直接交互。(一些新协议因为太复杂而使这成为不现实的。命 令的语法要用特定的分析器来分析。这样,新协议倾向于使用二进制格式。通常 它们的构成就像C或者PASCAL的记录的结构。)第二,要注意所有的应答都用数字 开头。这在Internet标准中也是很典型的。允许的应答在协议中定义。数字令用 户程序可以清楚地进行响应。应答的其余部分是文本,它通常是给监视或看记录 的人用的。它对程序的运转不产生任何影响。(然而协议在某一方面使用了应答 文本的一部分。)命令本身仅仅允许一端的邮件程序告诉邮件服务器一些信息, 邮件服务器需要这些信息用来交付邮件。在这种情况下,邮件服务器可以自己看 邮件信息来得到相关的信息。但是,对于更复杂的情况,这可能会不安全。每次 会话必须用HELO开头,HELO给出了发起连接的系统的名字。然后寄件人和收件人 被指定(如果有几个收件人的话,就可能有不只一次RCPT命令。)最后数据本身 被传送。注意,信息文本用仅含有一个句点的一行来终止。(一个信息里有这样 的行出现,那个句点便用两个来表示。)在信息被接收后,寄件人可以传送另一 条信息,或者像上面的例子那样终止会话。

    通常应答数字具有一种模式。协议定义了具体的一套应答,它们可以作为对任何 给出的命令的响应传送回去。但是不想详细分析它们的程序可以只查看第一位数 字。一般而言,以2开始的应答表示成功。以3开始的表示需要进一步的动作,如 上所示。4和5表示错误。4是一种“临时”错误,例如磁盘填充。信息必须被保存 ,可以稍后再试。5是永久性错误,例如一个不存在的收件人。信息必须和错误信 息一起返回给寄件人。

    (对于本节提到的协议的更详细内容,请看用于邮件的RFC 821/822,用于文件传 输的RFC 959,和用于远程登录的RFC 854/855。对于熟知端口号,请看当前版本 的已分配号码,也可能是RFC 814。)
    发布人:netbull 来自:AKA主页