TCP/IP工作模型

介绍 OSI 模型

我们已经知道 TCP/IP 能够应用在不同的网路﹐这就必须要有一套大家都遵守的的标准才能保证彼此能够沟通。因为数据通讯领域的专用术语和技术实在太广泛了﹐没有任何一位电脑专家能够熟悉全部的内容。因此必须有一套公认而且通用的参考架构以供厘清各项标准。在我们了解 TCP/IP 协定之前﹐有一个公认的网路模型我们必须要先了解的﹐它就是由 International Standardization Organisation (ISO) 于1978年开始开发的一套标准架构﹕Reference Model for Open System Interconnection (OSI) 模型。OSI 常被引用来说明数据通讯协定的结构及功能﹐成为讨论通讯时代共同依据﹐已经被通讯界广泛实用且有一致的认知了。

OSI 把数据通讯的各种功能分为七个层级﹐各司其职﹐但有相互依存﹑合作。但在功能上﹐它们又可以被划分为两组﹕

网路群组﹕由实体层﹑资料连接层(数据链路层)﹑和网路层组成。
使用者群组﹕由传送层﹑会谈层(会话层)﹑表现层(表示层)﹑和应用层组成。
您可以从下图看各个协定层的排列关系﹕

 

应用层 (Application)
表(现)示层 (Presentation)
会(谈)话层 (Session)
传输层 (Transport)
网络层 (Network)
(数据连接层)数据链路层 (Data Link)
(实体层)物理层 (Physical)

OSI 参考模型

OSI 提供了一个很有用的模式去解释各个不同层面的网路协定﹐这些协定就像堆积木一样﹐层层叠上去﹐因此此一架构常被称为堆叠(stack)﹐或是协定堆叠。每一个协定都只和与之对应的协定沟通﹐然后将结构向相邻的协定解释。彼此之间如何传送资料都有必然的协定﹐而且层层相扣﹐共同协力完成任务。各层无需知道其他层是如何工作的﹐只关心相同层级的协定就行﹔但层与层之间却有一套既定协议相互交换处理结果。这样有一个很明显的好处是﹕这留给各层都有自己的设计与发展空间﹐当某一层要进行协定更新﹐其他层无需同时被修改。

下面分别对各个曾经做一个简单的描述﹕

实体层(Physical Layer)

在这层裡面您必须作出一些机械和电子方面的决定﹐也就是要定义出在终端和网络之间要使用的设备。同时﹐採用何种佈线也要在这裡决定出来>这层实际是定义了应用在网路传输中的各种设备规格﹐以及如何将硬体所携载的信号转换成电脑可以理解的电子信号( 0 和 1 )﹐这通常都是设备上面之韧体(Firmware)的功能。这些规格一般是由硬体的生产厂商制定的﹐比如﹕数据线的接脚﹑电压﹑波长﹑相位﹑等等。
例如网线﹑网路卡﹑电话线﹐等等﹐都是属于实体层的范畴﹐也就是用来连接两台电脑的可以携带数据的媒体﹕可以是铜线﹑也可以是红外线﹑也可以是光学纤维。我们常见的实体层是用来连接办公室网路的 Ethernet 和 Token Ring 线路﹐或者是连接 modem 的电话线。而机器上的网路卡﹐或是连接远端的 modem ﹐都能够将物理媒体上面的电子脉冲转换成电脑所能读得懂的 0 和 1。

资料连接层(Data Link Layer)

在这层指定了要採用的信息单元 (message unit﹐通常在 LAN上面的信息单元被称为 frame﹐翻译为“讯框”或“框包”)﹐还有它们的格式﹑以及如何通过网络。每一个 frame 都会被赋予一个 MAC 位址码和侦错监测值(checksum)。
Ethernet 的 Data Link Layer Frame 看起来如下图﹕

序言
(Preamble)
目的地位址
(Destination)
来源位址
(Source)
信息类型
(Message Type)
数据
(Data)
封包监测资料
(Frame check sequence)
8 bytes 6 bytes 6 bytes 2 bytes 46-1500 bytes 4 bytes

Data Link Layer Frame 结构

数据在实体层是以bit为单位来传输的﹐资料连接层要制定不同网路形态的资料框包格式﹐确保数据能够在不同的网路实体(比如﹕同轴电缆﹑双绞线﹑光纤﹑电话数据线﹑等等)上进行资料传送。有一个 Binary Synchronous Communications 协定﹐会判定出一个框包如果在丢失的情况下﹐要等待多久会被重新发送﹐以及如何处理重发的框包和封包确认。这个协定也是在这层裡面定义。我们通常用来拨接上网的 PPP 协定就是在这层裡面定义的﹔同时﹐一般给 Mainframe 使用的 xDLC 协定也属于这裡的范围。

资料连接层通常会管辖以下的功能﹕

网路卡的实体位址(Physical Address)﹐也被称为MAC(Media Access Control) Address
虚拟电路(Virtual Circuit)连接和逻辑连结(Logical Link)的建立和结束
控制框包的传送和错误检测方式
框包的传送及接收顺序和传递方式
判定框包的建立及重组分界
检测框包的确认﹐以及在得不到回应或重複发送的情形下进行修复的程序
处理实体层的转换和管理
对接收框包进行检错和确认
检查发送框包的实体位址以确保资料能正确的被送抵目的地之网路层
在 IEEE802 标准裡面﹐还将资料连接层再划分为两层﹕Media Access Control 和 Logical Link Control ﹐请参阅下表﹕

OSI
模式

 

IEEE 802
模式

 

IEEE 802 标准

数据链路层

Logical Link Control

802.2

其它802

標準

Media Access Control

CSMA/CD

Token Bus

Token Ring

实体层

Physical

802.3

802.4

802.5

IEEE 802 / 803.x 标准

总体来说﹐这层的工作就是保证一个无错误的物理上的数据传输。

网路层(Network Layer)


这层就好比是一个中间人界乎于网络功能和使用者功能之间。它会定义出封包在网路中移动的路由和其处理过程﹐这层还决定了网路是如何进行管理功能的﹐比如﹐发送状态信息给接点和规范封包的流动等。
网路层的主要功能是让封包(packet)在不同的网路之间成功地进行传递。它规定了网路的定址方式﹐及处理资料在不同网路之间的传递方式﹑处理子网路之间的传递﹑决定路由路径﹑网路环境﹑资料处理顺序﹑等等工作。

发送端电脑在封包被传送出去之前﹐都会先为其建立 header ﹐作为在网路或子网间进行路由的依据。网路层在辨认和处理资料的时候﹐会忽略由高层协定制定的定义﹐只负责为数据在一个或多个网路间建立﹑维护﹑和终止连接。

网路层通常都有如下的这些功能﹕

如果封包不是属于同一个网路的时候﹐会将之交由 router 处理
控制数据流量﹐当 router 的缓衝区饱和的时候﹐会通知数据传输设备使用其它路径或暂停发送封包
当封包体积超过 router 的 MTU (Maximum Transmission Unit) 数值的时候﹐允许 router 对封包进行重组后再进行传送。(一些所谓的增加 modem上网速度的软体﹐就是因为可以对电脑的 MTU 数值进行最佳化﹐儘量减少 router 的封包重组﹐以达到最高的数据传输效率。)
负责 MAC 位址和网路位址(如 IP 位址﹑IPX 位址)之间的解释和转换
一个有趣的事情是﹐网路层还能将底层协定(网路功能)对上层协定(使用者功能)躲起来。这样﹐在网路的使用者就可以使用不同种类的硬体了。这是非常好的事情﹐假如您用来建网的材料都不尽相同的话。

传送层(Transport Layer)


在这层﹐将会设定如何控制节点之间的资料传递﹐还有错误检测和修正的方法。
由于大多数网路﹐如 Ethernet 和 Token Ring等﹐由于物理上面的限制﹐一次所通过的数据流通常只有数千 byte 而已(IP 封包最大体积为 65536 bytes)﹐然而许多需要在网路中传输的资料都会超过这个数值。传送层的主要功能是确保电脑资料正确的传送到目的地。它的工作就是“打包”﹐也就是将电脑资料变成封包的形态﹐再赋以一定的检测手段﹐将资料正确的传到目的电脑﹐然后再将封包重组回资料。封包如果残缺则进行重发﹐也能够将重複的封包剔除。

传送层可以等资料收集到足够大的数量的时候才发送出去,并非应用程式每次产生一个数据就进行一次传送,也就能减少了不必要的传输次数﹐以保证高效率的传输﹔反之,当应用程式产生大资料量数据时,则将之分拆成较小的封包再进行传送。

传送层的主要功能有﹕

接管由上层协定传来的资料﹐并进行“分拆”和“打包”等工作。
利用点对点的方式进行资料传送和回应的确认。
在得到接收端之资料缓衝区饱和信息之后﹐暂时停止资料发送。
能在单一位址上处理不同的程式协定(如ftp﹑http﹑telnet等)﹐并分别进行追踪及转换。


会谈层(Session Layer)


这层定义了如何连接和挂断连接﹐和在网路上面的数据如何交换。
这层所负责的是建立和管理电脑与电脑之间的沟通模式﹐也就是在资料真正进行传送之前设定并建立好连线。这裡定义了连线的请求和结束﹑传送和接收状态的设定﹑等等动作。

当节点 A 要建立和节点 B 的连线的时候﹐ 会先发出“连线请求”讯息, 若对方接受连线,则回应“建立请求”讯息﹐然后双方就建立好一个会谈了﹔当会谈结束的时候﹐也是先由节点 A 送出一个“结束请求”信息﹐等对方确认这个请求之后﹐那麽会谈也就真正结束了。

会谈层的功能主要有这些﹕

允许程式以电脑名称注册成为网路上唯一的位址。
在电脑之间建立﹑监测﹑和结束虚拟电路(Virtual Circuit)。
负责电脑之间的信息同步﹐监测资料沟通状态﹐并对错误信息做出处理。
会谈层为不同的程式以及与之对应的位于另一台电脑的程式﹐提供了可靠的沟通渠道。在某些沟通渠道中使用的是 half-duplex(半双工﹐即单向) 的模式﹐有些则使用 full-duplex(全双工﹐即双向) 的模式﹐为程式之间协定好共同认可的模式﹐并进行同步和管理等责任﹐都是会谈层所肩负起的。

表现层(Presentation Layer)


在这层﹐定义了数据的语法(syntax)﹑变更﹑和格式。当应用程式的语法和格式都不同的时候﹐这层还将定义了如何翻译这些不同。
如果您想将您的 PC 通过网路连接 mainframe 电脑﹐那您就必须使用合适的 mainframe 文字串﹐通常会是 EBCDIS(External Binary Coded Decimal for Interchange Code)﹐然而您的 PC 使用的却是 ASCII 码(American Standard Code for Information Interchange)﹐这两种编码格式是截然不同的。表现层则是主要负责在不同机器之间进行编码转换。当应用程式产生资料要进行传送的时候﹐表现层会将之换成网路的标准编码格式再交由下层协定处理﹔然后当资料抵达目的地﹐表现层也会将网路的编码换成对方应用程式所需的格式。

表现层的主要功能如下﹕

字元码转换﹐例如﹕ASCII 码和 EDCDIC 码之间的转换。
资料形态转换﹐例如﹕CR 码和 CR-LF 码﹑整数和浮点数之间的转换。
对资料进行压缩和加密﹐以提高速度和增加安全性。
应用层(Application Layer)
刚才谈到的表现层是负责将传入来的资料种类转换成 PC 的资料种类﹐不过﹐应用层则只转换应用程式相关的档案格式。表现层的转换与应用层的转换之间﹐最大的分别是﹕表现层是针对特定的主机的 CPU 类型﹐而应用层则针对特定应用程式。
在 TCP/IP 协定家族中,应用层所定义的还有一些应用程式功能﹐例如 FTP﹐HTTP﹐TELNET 等﹐主要负责客户端和伺服端的连接。相信您对这些程式或多或少接触过﹐比如您要从网上下载资料﹐可以通过 FTP 客户程式﹐也可以通过流览器将资料拿到。但在您的机器和在网路上面的伺服器﹐都必须使用相应的应用程式功能才可以做到﹐这在 TCP/IP 的网路环境裡面﹐通常都会是以不同的 port 号码来让不同的程式进行沟通。Port 号码可以随你喜欢来定﹐只要你知道号码是多少就可以用相对的程式来进行交谈了﹐不过﹐为了不至于太混乱﹐让大家有规可寻﹐TCP/IP 也指定了一些常用的 port 来给常用的程式使用﹐例如﹐HTTP 使用 80﹑FTP使用 21﹑TELNET使用 23﹑诸如此类… 不过﹐需要知道的是﹕在 TCP/IP 协定中,进行 port 连接的功能却应该是传送层的事情。对应用程式而言,它是与 socket 作沟通,一个 socket 就是一个罗辑位址和 port 了。

应用层是整个 OSI 模型的最后一层﹐它定义了应用程式是如何进入 OSI 模式,但它自己并不属于应用程式。

以上所列举的协定层并非是他们的详细定义﹐只是一个框架而已。您可以把OSI的协定模式当成是人体的骨架﹐当您套上这个框架之后﹐您就差不多可以描绘出大致形状了﹐虽然外表会有所不同﹐但骨子裡还是一样的。比方说﹐TCP/IP 和 Microsoft 网路也有其对应的协定层﹐我们可以从下面列表中看看它们的比较﹕

Open System Interconnection Internet Protocol Suite Microsoft Network
  (Application) 应用层
(Application)
应用界面层
(Application Interface)
表示层 (Presentation)
会话层 (Session)
传送层 (Transport) 传送层 (Transport) 传送设备界面层
(Transport Device Interface)
网络层 (Network) 网络层 (Network)
数据链路层 (Data Link) 实体层 (Physical) 网络驱动界面层
(Network Driver Interface)
实体层(Physical) 实体网络层
(Physical Network Layer)

网路协定层级裡面﹐每一层都可以说是作为其连接的上下层的界面。这样﹐在和网路另端的节点沟通的时候﹐只需和相同层级沟通就可以了﹐而无需理会其它层级使用的是什麽协定。在发送端机器上﹐各个层级对会对数据封包加上自己的header﹐然后再传给下一级协定﹔当封包抵达接收端﹐各层级也只关心相对应的header﹐并根据协定对封包进行处理﹐完毕之后则将header除去﹐然后传给上级协定则可。

封装的概念 ( Encapsulation )

我们要知道,OSI 只是一个模形,其主要功能是定议了网路传输方面的参考模式。在其分层的结构中,可以从下图看出 OSI 层级的资料流情况﹕

OSI 層級資料流
         在这裡带给大家的是一个网路传送技术中的一个很重要的盖念﹕封装。或许我们可以用邮局系统来更形象的看看封装过程是怎样工作的﹕

         当您有一份报价单( data )要寄给海外的客户﹐将之交给秘书之后﹐秘书会帮你把信封( header1 )打好﹐然后贴好邮票投进邮筒﹐然后邮局将信件分好类﹐再把相同地区的邮件放进更大的邮包( header2 )附运﹐然后航空公司也会把邮件和其它货物一起用飞机货柜( hearder3 )运达目的机场﹔好了﹐目的地机场只接管不同飞机所运来的货物﹐然后把邮包( header2 )交给对方邮局﹐邮局把邮件分好类之后﹐把信封( header1 )递送到客户那裡﹐然后客户打开信封就可以看到报价单( data )了。

         由此可见﹐网路的层级分工﹐其实跟我们日常的生活模式也有许多相似的功能﹕

        上例子中的飞机好比是“实体层”﹐我们当然也可以选择使用轮船或汽车等运输工具﹔
我们也可以把机场管理局﹐或码头﹑车站的管理机构看成是“资料连接层”﹐他们会规定了不同的交通工具使用的不同规则﹐例如﹕班次﹑泊位﹑进场/出场时间间隔﹑接管/分发货物﹑等等﹔
邮局可以说是“网路层”﹐到底使用那个机场﹑港口﹑车站﹐或是货物经由哪条路径传递最迅速﹐这些都由邮局来管好了﹔
要是您寄的资料有一本书那麽厚﹐但邮局一次最多只能帮你寄十页﹐那麽您就得将资料拆开﹐编好序号﹐分装在好几个信封裡﹐再进行邮寄﹐这和“传送层”的“打包”功能差不多。如果您同时还和好几个客户洽谈好几样事务﹐您也得分辨出哪些资料是属于哪个客户的﹐“传送层”也有类似的追踪功能﹔
“会谈层”相信也不难理解﹐先假设您和客户之间的沟通都必须使用邮件(没有电话﹐传真﹐更没有email)﹐您总不会茂茂然的就先把报价单寄出去吧﹖您会先征询对方的同意﹐才会开始寄出去﹐然后您可以告诉对方报价单全部寄送完毕﹐那麽得到对方确认之后﹐就可以说完成一次“会谈”了﹔
如果您的秘书聪明能干﹐还能够帮您翻译各国语言和文件格式﹐那您以经有了“表现层”了﹔
“应用层”更不用多说了﹐您和您的客户不会只收发报价单吧﹖还有很多合同啦﹑预算啦﹑策略啦﹑邀请啦﹑等一大堆东西﹐可能除了生意上的﹐间或还会聊聊男人和女人呢!
这裡我们不难看出﹕每一个上层封包对下层来说﹐都是下层封包的数据﹔下层协定无需理会上层如何进行封装﹐一律照单全收﹐然后加以自己的封装﹐再把整个加封后的封包传给更下一层。

        OSI 协定模型可以说是网路通讯的基石﹐尤其是层级与层级之间﹑上层和下层的关系﹐更是网路学习中的关键概念。对 OSI 模型的理解程度﹐将直接影响日后整个网路管理生涯﹐这包括软硬体的选择以及通讯服务程式的开发和日常的网路管理。

分层协定的缺点

        从前面的说明中﹐我们可以体会到分层协定设计的一个基本构思﹕让协定设计者将复杂的问题分成数个子问题﹐然后再分别处理。然而﹐所付出的代价是﹕会令到分层的软体变得非常低效。比方说﹕应用程序将一串位元组交到传送层﹐经过封包切割之后﹐再传到网路上。在此一过程中﹐传送层会选择最大的封包体积﹐以达到传输的最佳化﹐以配合讯框在实体网路中传送的最佳化。倘若软件的分层过严的话﹐传送层就无法知道底层的路由状况﹐也不知道与之直接相连的网路有哪些。更甚者﹐传送层也不可能知道讯框的格式﹐也就不能知道如何界定封包体积的大小。所以﹐分层过严反而会成为传送最佳化的障碍。

        因此﹐协定设计者在设计协定软件时﹐通常会略为放宽限制﹐以允许路由选择、MTU 之类的讯息广播。同时在分配缓冲区的时候﹐会预先留下标头空间让低层填充资讯﹐或在高层协定传送讯框时保留标头资讯。如此设计便能在最佳化与分层结构中取得平衡。

Internet Protocol Suit 模型

        在上面提到的七层协定﹐在实作应用中﹐某些层级常常会被整合在一起。但您要记住的一点是﹕无论程序设计者如何定义这些协定﹐(例如﹐把它们分为两层或四层)﹐这些层级在实际上都会被执行的。下面所介绍的 Internet Protocol Suit 模型﹐就是这样的一个例子。 事实上﹐国际间并没有一套公认的层级模型来描述 TCP/IP﹐但许多技术文件都把 OSI 的七层架构精简为三到五层不等。我们这裡所描述的将采用四层架构模型﹐如下图﹕

应用层 (Application Layer)
传输层 (Transport Layer)
网际网路层 (Internet Layer)
网络访问层 (Network Access Layer)

TCP/IP 层级模型

各层的定义如下﹕

应用层

        这层是 TCP/IP 模型与应用程式之间的界面﹐向使用者提供应用程式服务所需的连接﹐然后透过其下的传送层来发送和接收资料。应用程式根据传送层所需的形态来选用资料格式﹐例如一串独立的资料﹐或是一连续位元的组流。
TCP/IP 协定家族中,本身就定义了众多的应用工具与协定,例如:HTTP、TELNET、NFS、等等。不同的协定使用不同的穿送层协定。

传送层


传送层的主要目的向应用程式之间提供点对点的通讯。它规划了资料流量﹐也提供一可靠传输以确保资料能正确的抵达目的地。传送层必须能够提供一套机制来控制和检测资料传送的正确性﹐例如安排接收端传回确认信息﹑重发遗失资料﹑以及剔除重複资料﹑等等。
传送层软体会将应用程式送下来的资料切割分包﹐以符合下层传输要求的一定体积﹐交由网际网路层处理。传送层协定会在每一个资料包上面加上一个标头 (header)﹐记录一些资讯﹐用来辨识该资料包属于哪个个程式和由哪个程式来接收。再配以检测和供接收机器来检测资料是否完整。               
TCP/IP 的传送层协定主要分为 TCP 与 UDP 两种,前者为可靠性传输、后者为非可靠性传输。

网际网路层

        这裡处理的是机器之间的通讯﹐为每一个传送层交下来的封包加上 IP 标头。网际网路层协定会根据传送层的位址资料﹐使用路由演算法进行路由判断﹐然后在 IP 标头上填上路由资讯﹐以及其它相关的传送选项资讯﹔再把封包交由下层处理。
这层协定的处理关键是路由﹐假如资料包的目的地是本机﹐则将标头去除﹐将剩下部份交给合适的传送协定处理﹔否则﹐就要判断封包是直接传送到本地网路节点﹐还是要传送给路由器。如有需要﹐还会送出 ICMP 错误和控制讯息﹐同时也要处理接收到的 ICMP 讯。

网路存取层


本层的主要功能是把资料直接送给网路装置。它定义了如何用网路来传送 IP 资料段﹐它必须知道底层网路的细节。相对于 OSI 模型﹐TCP/IP 模型的网路存取层整合了 OSI 的实体层﹑资料连接层﹑和网路层的功能。但大部份底层标准是有厂商或 IEEE 制定的。
针对不同的网路实体标准﹐网路存取层有许多不同种类的协定与之对应。正如我们从前面的 OSI 学到的层级观念来理解﹐就算其中某些协定得到更新﹐但对于上层协定来说﹐是没影响的。因为TCP/IP 的设计刻意隐藏了较底层的功能。

        网路存取层的功能﹐除了把 IP 资料段封装到网路传送的实体讯框(frame)之外﹐它还同时负责把 IP 对应到网路设备的实体位址。这样才能让以 IP 位址为传送依据的资料﹐能透过底层网路传送。

与 OSI 模型一样﹐TCP/IP 的资料流也是逐层传递的﹐请参考下图﹕

 

TCP/IP 层级资料流
        事实上 TCP/IP 模型和 OSI 模式的原理和概念都是一样的﹐只是在定义上和细节处理上的不同而已。关于 TCP/IP 分层协定的资料﹐可以参考 RFC-791 和 RFC-817。

习题﹕

OSI 模型一共有哪些层级﹖并说明各层级的功能。
TCP/IP 模型有哪些层级﹖说明各层级的功能﹐并比较与 OSI 模型的差异。
请用封装的概念来说明 OSI 层级和 TCP/IP 层级的资料流状况。
请指出分层协定的缺点以及解决方法。

发表评论