通讯协议

通讯协议
本文源自:http://www.study-area.org/network/network.htm 

由于网络的迅猛发展﹐出現了許多供网络使用的软件和硬件﹐为了让他们能够有效的狗头﹐我們需要建立一些规则。

在這一章裡面﹐我會向大家介紹目前比較通用的网络通讯协议﹐和模拟数据是如何的从一个节点传送到另一个节点﹐从功能上面看看通讯协议的定义。

何为通讯协议﹖

一个比较好理解的讲法是﹕通讯协议就是一些标准和规则。例如﹐我们看到红灯就要停、绿灯才可以走,这就是一种协定了。若是彼此使用不同的协定,那就会造成混乱:澳洲(或英联邦)开车靠左行使、中国则靠右。只要所在国家不变,那么该协议就可以运作,但是当到达协议不一样的国家,就得进行国家上的转换了。否则,不出车祸才怪!

在网路通讯中,如果主机A 要將一个 packet 送给主机 B﹐它們就必须使用相同的通讯协议。

LAN 的工作就是让应用程序利用网络获得﹑管理﹑和安排数据。每一个节点都透过一张网络卡(NIC, Network Interface Card)连接到网络﹐再由此和其它的节点沟通。在每一个独立的工作站上面﹐已经安裝了一些应用程序﹐如 Word﹑Outlook 等。這些程式如果想使用网络上面的资源﹐比如在伺服器上面的数据﹑网络打印机﹑电子邮箱等等﹐会使用网络软件(network software)去和 NIC 沟通﹐然後 NIC 再和网络上的其它节点沟通。所有這些信息都要经过转换﹐就必須要使用通讯协议來确保所有這些参与者能够彼此理解对方和进行有效的沟通。

正如您所看到的﹐在节点与节点﹐最先的交流是在 NIC 的层次上。當数据从一个节点通过 NIC 传送到另一个节点之后﹐数据在从 NIC 传送到网络软件。而这个网络软件就是我們所說的传输通信协议(Transport protocol)了﹐在双方的机器上都会有這些 transport protocol。对于这个所谓的网络软件﹐我們可以从好些不同的角度去理解﹐不过我們可以简单的从三个层次去看﹕

第一﹐也是最容易的理解的﹐就是 NIC 的驱动程序。它负责处理网卡和传输协议之间的沟通。网卡的厂家都会提供一支驱动程序让您使用一些特定的协议﹐您可以使用同一张卡来供不同的作业系统使用。只要这张网卡在“物理”上是兼容的﹐那你就可以在作业系统上面使用了。换而言之﹐您大可不必只依赖一个牌子的厂家。当然﹐您不能将 Ethernet 网卡当Token Ring 来使用。我们也知道要让网卡工作﹐除了要使用正确的驱动程序之外﹐您还得要确定 IRQ 和 IO 要正确。另外﹐在网卡上面﹐还有一个由 6 组十六进制数字组成的 48bit 的物理位址(Physical Address)﹐也叫 MAC(Media Access Control) Address 或 Node ID﹐等名称﹐相信我们前面也听过数次了。这个位址其实分为两个部份:前面三组数字为 Manufacture ID﹐也就是厂商 ID﹔而后面的三组是 Card ID。如果我们见到一张卡的 MAC 位址是﹕02-60-8C-67-CD-54﹐那麽我们可以知道这张卡是 3Com 的﹐因为 02608C 就是 3Com 的ID。透过这两组 ID ,我们可以在实体上区分各自的网卡。理论上来说,全世界没有两张卡的 MAC Address 是相同的,而且我们也不应去修改它。然后﹐基于这个物理位址﹐我们就可以把逻辑位址捆绑于其上。物理位址我们是无法更改的﹐而且您也很难找到两张相同物理位址的网卡﹔但逻辑位址则是由网络管理员来设定。就好比您不能将公司地址门牌给改了﹐但您喜欢给您的公司起什麽名字或搬到别的地址去都可以﹐只要不会和其它公司搞混了就行。如果使用不同的传输协议﹐逻辑位址的格式也不相同(后面我们就会讲到这个问题了)。但无论是物理位址是逻辑位址﹐要在网路上面沟通的话﹐就必须不同﹐否则就是所谓的位址冲突啦。下面我们以 IPX 协议为例子认识一下逻辑位址﹕

  • 内部网络位址(Internal Network Address)。简单地说﹐internal address 是用来识别每一台机器是“谁”。很重要一点是﹐这个内部 IPX 号码在同一个网络中﹐对每一台机器来说必须是唯一的。例如 Novell NetWare 使用内部 IPX 号码来识别网络中的伺服器﹐当您安装 NetWare Server 的时候﹐您会被问及接受或更改一个随机产生的内部 IPX 号码﹐然后这个号码就成了该 server 的 ID 了。当您从工作站中输入 slist 命令﹐您就可以看到每一台 server 的 ID 都被列出来。
  • 外部网络位址(External Network Address)。这是用来识别一个网络或一个在网络中的网段(segment)用的。如果在同一个网路上面同时有两台 server 出现﹐那麽它们就必须使用相同的 external address 了。这个 external address 好比是用来识别所有的 server 在“哪裡”的。在 Novell Netware 裡面﹐只有 Server 才需要设定 external address ﹐工作站使用的是它登录所在的 server 的 external address。一个完整的 IPX 位址会是这个样子的﹕1C9FDB42 : 2E701AID﹐在“﹕” 前面的部份为 external address﹐而后一部份则为 internal。不过这样设定也有一个潜在的危险﹐如果您在安装 Novell server 的时候一不留神﹐接受了程式自选的 External Address﹐那样就很可能不能和其它 server 沟通了﹐而且在接下来的安装中﹐您会被诸如 wrong router address 等错误信息烦死﹗程式通常也可以提示您正确的号码﹐但如果您有两张网路卡在上面﹐您就要自己设定了。如果您的号码输入错误﹐您或许不可能修改系统的 AUTOEXEC.NCF 档案﹐而 external 和 internal 位址都包括在这个档案裡面﹐所以务必小心﹗

第二。在网络处理程序的另一端﹐需有一个重定向(Redirector) 的软件。

我们知道在单机作业模式下﹐当程序呼叫档案IO 的时候﹐会由作业系统接管这个请求﹐然后再传给 BIOS﹐再到硬体那裡。如果当程式呼叫的档案 IO 为网络位址的时候﹐那麽 redirector 就会接管这个请求﹐而重新导向到网络上面去﹐把请求交给对方机器。

例如﹐当您使用 Word 的时侯﹐要开启一个在网络磁盘上面的档案﹐将会如何呢﹖从 Word 的角度去看﹐它根本不知道有网络这回事﹐它只知道有一个和多个像 A﹕﹑B﹕﹑C﹕这样的磁碟。就像您吃麦当劳的时候﹐您不用知道汉堡包是怎样製作出来的﹐您只需知道鱼柳包﹑鸡柳包和拿到什麽样的 Kitty 猫就是了。Word 在设计上并不是应用于非本地磁碟上的﹐当要使用存储在网路上面的数据的时候﹐就必须有一种软件能够以磁盘代号的形式告诉 Word 才行。所以﹐如果您告诉 Word 去一个在叫 FILESER1 的伺服器之 DOC 目录下面找档案﹐那麽 redirector 软件就会接管这个请求了。

然而﹐redirector 在这个网路软体集团裡面﹐也只是其中一个角色而已﹐要真正能够拿回资料﹐我们还得需要另一角色的配合﹕ Redirector 只是工作在 client 上面﹐而在 server 那边﹐还必须有一个档案系统(File System)﹐或曰 mounter﹐来接应 redirector 的请求。

在网路世界中﹐有许多种这样的 file system﹐最出名的有 Novell 的 NetWare File System﹑Unix 网路的 Network File System (NFS)﹑以及 Microsoft 的 CIFS (Common Internet File System)。在 client 端的 redirector 必须要和在 server 上面的 file system 兼容(使用相同的协定)﹐否则 client 也只能望 file 兴叹而已。

第三。终于来到这章的主打戏了﹗出场的就是通讯协定﹐也就是节点和节点之间在网络上搬运数据的方法。

我之所以将这三个层次的中间部份留在现在才说﹐是因为它是最抽象的。您或许可以这样想象﹕NIC 驱动程序负责和 NIC 之间的沟通且尽力讨其欢心﹔在 client 上面的 redirector 和在 server 上面的 mounter﹐则和程序沟通﹐也极尽体贴之能事﹔然后通信协议﹐则出尽法宝撮合 NIC驱动程序和 redirector (或 mounter)﹐并建立起网络通信的交通规则。

正如前述﹐通讯协定只是一些标淮和规则而已﹐而这些规则令到交流的融合性得以标淮化。就如我们不能离开一些经已认同的规矩去使用道路一样﹐我们的网路也需要一些共同的沟通语言﹐才能让所有机器相互交流而不至于混乱。

LAN 和 LAN 之间的通讯也一样需要一些网路语言﹐所以它们都需要有语言大师的本领才行。事实上﹐网路语言有多种多样﹐由于它们在设计之初只为了应付不同的工作﹐而且它们大部份都从来不考虑要和其它网路兼容的。传输协定虽然可说琳琅满目﹐然而不幸得很﹐各自的厂商都有各自的一套偏好。但又非常幸运的是﹕大部份新的网路作业程式都支持超过一种协定﹐可以和不同的作业系统沟通﹐比起以前独沽一味的情形的确容易多了。

下面我们就浅略的浏览一些您将会在网路上运用到的通讯协定。

NetBEUI

让我们回到 IBM 最初进军个人电脑网路的时代﹐他们当时的确需要一个很基本的网路通讯协定﹐但他们并不打算用此来建构大型网路﹐仅仅供数十台电脑甚至更小的网路而已。基于这个诉求﹐就诞生了Network Basic Input/Output System﹐或称 NetBIOS。

NetBIOS 其实只有 18 个命令(command)来让网路的电脑能够建立﹑维持﹑和使用连接服务。不过 IBM 在不久后又再推出了 NetBIOS 的延伸版本﹕NetBIOS Extened User Interface﹐或称 NetBEUI﹐基本上是 NetBIOS 的改良版本而已。然而﹐NetBIOS 和 NetBEUI 终究是不同的﹕NetBEUI 事实上可以说是一个传输协定﹐而 NetBIOS 充其量只是一组命令来让系统可以使用网路而已﹐在技术角度来看﹐它是一个 Application Program Interface (API)。关于 NetBIOS 与 NetBEUI 的技术分歧,请参考:

Netbios Network Basic Input/Output System Protocols
NetBios, NetBEUI, NBF, SMB, CIFS Networking

NetBEUI 可以算是您在 LAN 中能够用到的最快通讯协定了。这个“最快”是指它可以将格式化资料放进封包裡面﹐而接收节点又可以迅速的解读到内容。然而﹐NetBEUI 却有一个最致命的弱点﹕它不是可路由(routable)协定﹐也就是不能够和其它网路的机器对讲。NetBEUI 在本地网路裡面是非常优秀的协定﹐但如果您想和设在其它网路的机器沟通﹐NetBEUI 就不是您所需要的了。如果您想实现和其它网路的电脑沟通﹐您极有可能必需通过路由设备或路由软体来实现﹐但无论用哪一样﹐很遗憾﹐NetBEUI 都做不到。

不过﹐Microsoft 网路则运用一种叫 NetBIOS over IP 的技术﹐来连接不同网路的 NetBEUI 客户。但归根结底﹐用来达成路由的不是 NetBIOS 而是 TCP/IP﹐也就是下一个要介绍的协定。

TCP/IP

若说起历史,TCP/IP 也算得上是个冷战时代的产物,它是应美国国防部的战争考量而提出开发的。TCP/IP 当初是用来配合 ARPANET (Advanced Research Projects Agency Network) 来处理不同硬体之间的连接问题的﹐比如 Sun 系统和 Mainframe﹑Mainframe 和个人电脑之间的连接。

事实上,TCP/IP 所指的是一整套庞大的通讯协定家族,其中以 Transmission Control Protocol(TCP) 及 Internet Protocol (IP) 这两套协定最具代表性。IP 协议工作于网络层(以后会继续和大家探讨 OSI 的网络层级)﹐它提供了一套标准让不同的网路有规则可循。当然﹐前提是您想使用 IP 从一个网路将封包路由到另一个网络。IP 在设计上可用来在 LAN-LAN 及 PC-PC 之间进行传输的。

您可以把 IP 看成是游戏规则﹐而 TCP 则用来诠释这些规则的。虽然 TCP/IP 原先是专门为几所大学和机构的使用而设计的﹐但现在 TCP/IP 已经成为最流行的通讯协定了﹐我们使用的 Internet 就是用 TCP/IP 来传送封包的了。下面就让我们看看 TCP/IP 是怎样工作的﹕

假如您的公司在好些地方都有分公司﹐各自都有著自己的本地网路(LAN)﹐在总公司跑的是 PC 网路﹐但分公司大部份都是用麦金塔电脑。当 Mac 有数据要传送给 PC 的时候将会如何呢﹖

首先﹐TCP 会在这两个平台建立起一个可以提供全双工检错(对双向的数据都进行错误检测)的连接。

接著﹐IP 制定好 Mac 和 PC 之间的沟通规则,TCP 与上层协议制定用以连接的端口( port )。到这里为止﹐Mac 端已经淮备好数据了﹐如果数据太大﹐就将之分拆成几分较小的封包﹐并且在封包上面加上一个新的 header (内含传送位址)﹐确保封包会被正确传送。TCP/IP 还会加上标签说明数据的种类及其长度。

再下来﹐IP 协议将负责将封包传送给 PC。

最后﹐在 PC 上面的 TCP 将封包解码并翻译成 PC 能够懂的格式﹐也就是它自己所使用的网络协议。您可以从下图看到这个过程﹕

TCP/IP 可说是现行协定中用途最广的协定之一﹐它尝试在所有硬体上实现所有事情。不过﹐它也是最慢的传输协定之一﹐在某些情形之下﹐它的传送速度只有 NetBEUI 的七成。然而,由于 TCP/IP 在设计上可供多种硬件部件使用﹐所以它是一个可路由协议。

DLC

Data Link Control 协定﹐为国际标准 IEEE802.2 协定﹐它的使用主要基于两个原因﹕

第一﹐许多 Token Ring 网路是使用 DLC 来让 PC 工作站和 mainframe 网关(gateway)沟通的。如果您使用 Token Ring 而且在 CONFIG.SYS 裡面又有三个装置驱动程式是以 DXM 开头的﹐那您就是使用 DLC 驱动程式了。

第二﹐如果您有一些网路印表机本身直接通过 JetDirect 网卡连上网路的﹐那麽您或许需要 DLC 来控制印表机了。

IPX/SPX

Internetwork Packet Exchange (IPX) 是一个由 Novell 公司制定的协定﹐可以在网路设备之间建立﹑维持和终止通讯连接﹐他既负责数据的传出﹐也负责传入。当数据抵达的时候﹐IPX 会读取数据的位址﹐和将之搬运到网路伺服器或工作站的正确地方。如果伺服器或工作站需要送出数据﹐IPX 则会确定好数据封包位址﹐然后再通过网路路由出去。

Sequenced Packet Exchange (SPX) 协定则是用来控制网路处理过程﹐诸如处理丢失封包或其它状况。

虽然 IPX 和 SPX 都是属于 Novell 的﹐但他们的使用并不限制于 Novell 网路。作为一个传输协定﹐IPX/SPX 可以被用在许多不同的硬体上面﹐所以 IPX/SPX 也是一个可路由协定。

多种传输堆迭(Multiple Transport Stack)

到现在﹐有两件事情是最明显不过的﹕首先﹐没有任何一个协定说得上是最好的﹔其次﹐您或者很想将上面所说的四个协定全跑上﹐而好消息是﹕您可以这样做﹗

现行网路模式是可以支持多传输协定的﹐我们称之为协定堆叠(protocol stack)。比如﹐您可以在 client 机器上面安装多个协定﹐而 server 机器却只装一个协定。如果您的 client 同时连接好几个 server ﹐这完全是可能的﹕IPX 可以和 Novell server 沟通﹑DLC 可以让工作站和 mainframe gateway 对讲﹑和 TCP/IP 可以使用 Internet mail 路由﹑等等。

但要让以上这些协定同时工作﹐我们还需要用一个方法将网路卡和协定堆叠连接在一起﹐也就是将网路传输层和网路卡驱动程式捆绑(bind)在一起﹐即在 NIC driver 和 transport stack 之间建立一个软体连接﹐这样在它们之间就需要一个很重要的标准界面了。

通常有两个竞争者在争拼这一战场﹕Novell 的 Open Datalink Interface (ODI) 和 Mircosoft 的 Network Driver Interface Specification (NDIS)。下面我们就探讨一下网路捆绑界面和应用程式界面是如何工作的。

网络捆绑界面 (Network Binding Interface, NBI)

由于网卡驱动程序的不足﹐您还必须额外的软件来令到通讯协议工作﹐因为 NIC driver 在设计上只会和一个协议对讲﹕IPX/SPX 或 NetBEUI 或 TCP/IP。这时﹐ Network Binding Interface (NBI) 就派得上用场了﹐NBI 可以提供一个共同的前端界面给设备驱动程序﹐ ODI 和 NDIS 都可以做到这点。这样﹐NIC driver 就无需再直接和什麽 IPX﹑TCP/IP 或 NetBEUI 之类的协议打交到了﹐它只需要一个 ODI 或 NDIS 界面就可以了﹐因为它们可以将这些协议“翻译”给 NIC 听。

我们可以从下图看看client和server的传输过程中﹐网络软件中各组件之间的关系﹕

网络应用程序界面 (API)

        正如您在上面所读到的﹐大多数应用程式其实都不为意到网路的存在。不过﹐有些程式﹐如果 e-mail 或群组程式﹐是必须认知到网路﹐更可以说﹐它们是应网路而生的。它们要能够“插入”到网路中﹐并和其它在网路机器上面跑的程式沟通。程式设计者建立的网路应用程式﹐都要适应于网路给应用程式的一套指令﹐这些指令就是所谓的 API 了。如果您懂得开汽车的话﹐您一定知道当初学开车的时候是先学如何踏油门﹑如何踩煞车﹑如何转向等基本动作。我们可以将这些动作看成是一些“原始命令”﹐通过这些命令我们就可以做出将汽车倒出车库然后开到目的地﹐虽然,学车的时候是没有诸如“倒出车库”的动作。那麽我们就可以将 API 当成是那些学车的“基本动作”,也就是所谓的操作界面。在那些网路服务中﹐比如 redirector ﹐可以居于各种不同的传输协定之上﹐如果没有 API ﹐您的网路软体程式就要开发一个 redirector 程式来接通 IPX/SPX ﹐又要另外一个 redirector 程式接通 TCP/IP 了。其实来来去去都是同一个 redirector ﹐只是和不同的协定连接而已﹐而 API 则提供了一个共同的界面给所有网路服务使用。这样﹐我们就算开 BMW 或 Benz 都知道如何操作了﹐但您未必会开游艇哦﹐因为汽车和游艇 API 是不同的。当然﹐如果有台汽车的油门是在左边﹑煞车在右边﹑离合器却在中间﹑不用方向盘而是用摇竿﹗我们也可以说这台车的 API 是不同的。刚才说的 redirector 并不是写来供通讯协定使用﹐而是给一个 API 使用(在我们的例子中是 NetBIOS ) ﹕NetBIOS 可以居于 IPX/SPX﹑NetBEUI﹑和 TCP/IP 这些协定之上。这样有个好处是﹐您可以改变您的通讯协定﹐而无需重写您的网路服务﹐因为您的网路服务是针对API来写的。API 会接管您的网路请求﹐然后运用正确的通讯协定进行工作。您或许听过 socket 这个词﹐它其实就是 API 啦。在网路世界中﹐有三种 API 您或许会接触到的﹕

  • Novell Sockets
  • NetBIOS
  • TCP/IP Sockets (用来和Internet上面的其它网络沟通)


OSI 模型

        有好几个主要电脑厂家﹐如 IBM﹑DEC﹑Burroughs 等﹐都有设计它们各自的网路结构和通讯协定﹐如果採用这些设计的机器﹐在其各自的网路上面运作良好﹐但却不能在不同厂家的机器之间进行沟通。为了解决这个问题﹐International Standardization Organisation (ISO) 于 1978 年开始开发一套标淮架构﹐终于成功推出 Reference Model for Open System Interconnection (OSI) 作为其标淮﹐它提供了一个很有用的模型去解释各个不同层面的网络协议。OSI 模型共有七个层面﹐且它们可以被划分为两组﹕网络群组﹕由实体层﹑资料连接层﹑和网络层组成。
使用者群组﹕由传送层﹑会谈层﹑表现层﹑和应用层组成。
您也可以从下图看到些协议层的排列﹕

应用层 (Application)
表现层 (Presentation)
会谈层 (Session)
传送层(Transport)
网络层 (Network)
资料连接层 (Data Link)
实体层 (Physical)

前面我们集中讨论的就是其中的低层协议﹐也就是网络协议﹐这些功能是保障数据在网络中能够迅速且淮确的传送。

实体层
        在这层里面您必须作出一些机械和电子方面的决定﹐也就是要定义出在终端和网络之间要使用的设备。同时﹐采用何种布线也要在这里决定出来。
资料连接层
         在这层指定了要采用的信息单元(message unit)是什么﹐通常在 LAN 上面的信息单元被称为frame 。以及它们的格式﹑和如何穿越网络。每一个 packet 都会被赋予一个位址码和侦错监测值(checksum)。有一个 二元同步通信(Binary synchronous communications) 协议﹐会判定出一个封包如果在丢失的情况下﹐要等待多久会被重新发送﹐这个协定也是在这层裡面定义。总体来说﹐这层的工作就是保证一个无错误的物理上的数据传送。
网络层
        这层就好比是一个中间人界乎于网络功能和使用者功能之间。它会定义出封包在网路中移动的路由和其处理过程﹐这层还决定了网路是如何进行管理功能的﹐比如﹐发送状态信息给节点和规范封包的流动等。一个有趣的事情是﹐网络层还能将低层协议(网路功能)对上层协议(使用者功能)隐藏起来。这样﹐在网络的使用者就可以使用不同种类的硬件了。假如您用来建置网的材料都不尽相同的话,这是非常好的事情。
在底下的三层之上﹐还有四层是属于使用者功能范围的﹐不过他们也常常会被整合在一起。您要记住的一点是﹕无论程序设计者如何定义这些协议﹐(例如﹐把他们分为两层或四层)﹐这四层在实际上都会被执行的。

传送层
        在这层﹐将会设定节点位址的传送﹐还有错误检测和修正的方法。
会谈层
         这层定义了如何连接和挂断连接﹐和在网络上面的数据如何交换。
表现层
         在这层﹐定义了数据的语法syntax)﹑变更﹑和格式。当应用程序的语法和格式都不同的时候﹐这层还将定义了如何翻译这些不同。
应用层
         这是最后一层了﹐它定义了应用程序是如何进入OSI 模式进行传送。它自己并不属于应用程序﹐但它支持使用者的应用程序﹐如﹕档案传送﹑密码验证﹑和网络工具等。
        以上所列举的协议层并非是他们的详细定义﹐只是一个框架而已。您可以把 OSI 模型当成是大体的骨架﹐当您套上这个框架之后﹐您就差不多可以描绘出大致形状了﹐虽然外表会有所不同﹐但骨子里还是一样的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注