表7. 从计算机D到计算机E以太帧示意图
因为计算机D和计算机E可以直接通信。我们可以看到,在直接通信时,目的IP地址和以太地址都是接收者的,而在非直接通信时,目的IP地址是接收者的,而目的以太地址却是路由器的。上面的例子比较简单,真实的路由要比这个复杂得多,因为现实中的网络十分大,要许多路由器同时工作,这时的情况就比较复杂了。
5.3 IP路由规则
对于要发出的IP包,IP必须决定如何发送,是采用直接发送还是非直接发送,这是在路由表的帮助下完成的。对于传入的IP包,IP模块必须能够识别它是不是自己需要的包,如果是自己需要的,就把数据传送到上一层协议中,如果不需要则进行转发。在IP包达到目的地址后,它不再转发了。
5.4 IP地址
IP地址是由网络管理者为一台计算机指定的地址,IP地址的一部分作为网络号,另一部分作为网络中的主机号。具体内容请大家查询相关资料。IP地址是由NIC管理的,所有直接连接到Internet上的计算机如果需要IP地址,必须和NIC联系,则它指定;如果您需要建立自己的网络,那相应的网络号也需要从NIC取得。
5.5 名称
人们喜欢使用计算机的名称,而不喜欢使用数字来标记一台计算机,对于小型网络,计算机名和IP地址的对应表可以保存在每台计算机上,如果是一个大型网络,则需要一台专用的计算机来负责IP地址到计算机名的转换。下面就是一个IP地址和计算机名的对应表。
223.1.2.1 alpha
223.1.2.2 beta
223.1.2.3 gamma
223.1.2.4 delta
223.1.3.2 epsilon
223.1.4.2 iota
前一列是IP地址,后一列是计算机名。您可以为一个计算机名指定多个IP地址,那么通过哪一个IP地址都可以访问这台计算机。这个拥有多个IP地址的计算机在接收到包后,可以根据目的地址知道是不是发向自己的包,这个目的地址可以是自己的任何一个地址。名称也用于网络号,下面就是一个例子:
223.1.2 development
223.1.3 accounting
223.1.4 factory
前一列是IP地址,后一列是网络名。我们可以这个表上面的表对比一下,看看各个计算机属于什么网络。
5.6 IP路由表
我们上面已经提到过路由表这个名词,下面我们就仔细看一下这张表。它通常是由下面几列构成的:IP网络号,直接/非直接标记,路由器IP地址和接口号。这张表一般由管理员负责维护,因为是他为你的计算机指定了IP地址。
5.7 直接路由
下面我们仔细看一下我们上面看过的直接路由的例子。
在计算机alpha内的路由表如下所示:
网络 直接/非直接标记 路由器 接口号
development 直接 (空) 1
表8. 路由表范例
我们可能通过UNIX下的"netstat -r"命令看到类似这样的结果。
5.8 实例
Alpha发送IP包到beta,alpha中的IP包的目的地址是beta的地址(223.1.2.2)。IP取得网络号部分,查询路由表中的第一部分,看这个包应该包到什么地方,它发现这个网络和表中的第一个项目一致。而这个项目中的其它信息表示,目的计算机可以直接通信,于是直接进行ARP翻译(解析),通过接口1发送数据。
5.9 非直接路由
下面我们仔细看一下我们上面看过的非直接路由的例子。
计算机alpha内的路由表如下所示:
网络 直接/非直接标记 路由器 接口号
development 直接 (空) 1
accounting 非直接 devnetrouter 1
factory 非直接 devnetrouter 1
表10. Alpha内的路由表
5.10 实例
Alpha发送IP包到epsilon,IP包内的目的地址是epsilon的(223.1.3.2)。IP分析目的地址的网络号部分,查询路由表中的第一列,发现第二个项目符合条件。此项目中的信息表示计算机可以由路由器devnetrouter达到,Alpha的IP模块进行ARP解析,将数据通过接口1传送到devnetrouter的IP地址上。这个包仍然包括着目的机IP地址223.1.3.2。这个包到达development网络接口,传送到delta计算机的IP模块,delta计算机发现这个包不是给它的,于是决定转发。Delta的IP模块从目的地址中解析出网络号,查询路由表,Delta的路由表如下所示:
网络 直接/非直接标记 路由器 接口号
development 直接 (空) 1
factory 直接 (空) 3
accounting 直接 (空) 2
表11. Delta的路由表
第二条符合条件,于是IP模块接口3将数据发送到计算机epsilon,IP包到达epsilon时,epsilon的IP模块发现目的地址和自己的一致,于是将接收到的数据向上一层协议传送。
5.11 路由总结
在一个大型网络中,IP包在到达目的计算机前一般需要经过多个路由器,它前进的路线不是事先定好的,而是在各个路由器上一步步查询出来的,每个计算机只管一段,只保证把数据传送到下一站,至于下一站怎么办,它就不管了。
5.12 管理路由
在大型网络的每台机器上支持一张路由表可不是件容易事,路由器如果出了问题会对网络传输不能进行。我们也可以使用ICMP协议对网络进行监控。一台机器从一个地方移到另一个地方必须更改计算机的IP地址,如果要更新主机地址文件,这简单是不可能的,而DNS帮助解决这个问题。
6. 用户数据报协议(UDP)
UDP是在IP上的两个重要协议之一,它为用户的网络应用程序提供服务,我们经常使用的NFS,SNMP就是使用UDP协议的。UDP协议不是面向连接的。这一点是和TCP协议不同的。UDP在IP包上加上了端口号和校验码两个参数。
6.1 端口
一台计算机上的客户程序如何达到服务器呢?应用程序和UDP的通信线路是通过UDP端口一样的,这些端口是数字的,以0开始,一个端口一般和一个服务对应。服务器和客户就在这个端口等待对方的请求(或应答)。UDP保留由应用程序定义的消息边界。它决不把两个消息连接起来,或把一个消息分成两部分。
6.2 校验码
如果接收到的IP包内有一个标记“UDP”,IP模块就把数据传送到UDP,UDP检查校验码,如果运算得出的结果为0,数据是正确的。UDP的校验码可以产生也可以不产生。传送来的UDP包如果超过了上层应用程序的处理能力,就会暂时保存起来,如果保存的数据已经超过一定限制,则把UDP丢弃。
7. 传输控制协议(TCP)
TCP提供的服务不同于UDP,它们的最大区别在于TCP是面向连接的,TCP保证数据一定传送到接收者,而UDP可不保证。TCP用于一定要保证数据传输的场合,我们通常知道的FTP,TELNET是基于TCP协议的,而其它的一些TCP网络应用程序包括X-Window系统,rcp(远程复制)和R系列命令也是使用TCP的,TCP提供这样好的服务也是有代价的,它需要更多的CPU处理时间和网络带宽,TCP模块的复杂度也比UDP大得多。
与UDP相同的是,应用程序必须和TCP端口连接请求服务,接收和发送数据。在应用程序开始运行时,服务器和客户机上的TCP模块开始相互通信,这两个TCP包含了状态信息,维持一条虚链路,这条虚链路是全双工的。TCP可以任意打包数据,不必管什么边界。例如,应用程序可以在一个端口写5次,远方的应用程序可以读10次把数据读完,这和UDP不同,在UDP下,在一个端口写几次,远程应用程序就要读几次。
TCP支持滑动窗口协议,双方都进行流量控制,因此不会让缓冲区满。这也和UDP不同,在UDP的情况下,缓冲区可能因为应用程序的处理能力不足而变满。对于滑动窗口协议,它指定了一个窗口大小,这个大小指的是,在未接收到确认信息之前允许发送的数据数,在TCP中,窗口的大小是以字节为单位的。
8. 网络应用程序
TCP和UDP提供不同的服务,不同的应用程序会选择不同的协议,这里请您注意,如果您选择使用UDP进行可靠传输,那只能在UDP上层来提供可靠性。下面我们举出几个常用的应用程序。
TELNET使用TCP提供远程登录。TELNET工作得非常好,它虽然古老,但是现在仍然在广泛使用,它经常用于在不同的作系统间进行互连。
FTP协议和TELNET岁数差不多大了,它也使用TCP服务,在FTP时,您好象登录到远程计算机上,但您能够使用的命令却不那么多,FTP提供用户在计算机间复制文件的服务。UNIX中的远程命令一般都以R开始,这些命令一般都通过网络进行,我们就称它们为R系列命令,这些命令通常在UNIX系统中使用,它对安全性考虑不多,但是非常好用。NFS由Sun公司开发,它使用UDP,它用于在不同的计算机上加载UNIX文件系统,在这一点上它做得非常好。NFS为网络加重了负担,在慢速连接的网络上工作得不好,但它的功能可却是不错。随着网络规模不断扩大,原来的网络管理协议ICMP已经不能提供满意的服务了,于是在这一要求下提出了SNMP协议,它检测网络中各种设备的情况,根据这种情况对网络进行监控。X
Window系统使用X Window协议,X Window协议也使用TCP服务。
TCP(Transmission Control Protocol)
传输控制协议
TCP协议主为了在主机间实现高可靠性的包交换传输协议。本文将描述协议标准和实现的一些方法。因为计算机网络在现代社会中已经是不可缺少的了,TCP协议主要在网络不可靠的时候完成通信,对军方可能特别有用,但是对于政府和商用部门也适用。TCP是面向连接的端到端的可靠协议。它支持多种网络应用程序。TCP对下层服务没有多少要求,它假定下层只能提供不可靠的数据报服务,它可以在多种硬件构成的网络上运行。下面的图是TCP在层次式结构中的位置,它的下层是IP协议,TCP可以根据IP协议提供的服务传送大小不定的数据,IP协议负责对数据进行分段,重组,在多种网络中传送。
TCP的上面就是应用程序,下面是IP协议,上层接口包括一系列类似于作系统中断的调用。对于上层应用程序来说,TCP应该能够异步传送数据。下层接口我们假定为IP协议接口。为了在并不可靠的网络上实现面向连接的可靠的传送数据,TCP必须解决可靠性,流量控制的问题,必须能够为上层应用程序提供多个接口,同时为多个应用程序提供数据,同时TCP必须解决连接问题,这样TCP才能称得上是面向连接的,最后,TCP也必须能够解决通信安全性的问题。
网络环境包括由网关(或其它设备)连接的网络,网络可以是局域网也可以是一些城域网或广域网,但无论它们是什么,它们必须是基于包交换的。主机上不同的协议有不同的端口号,一对进程通过这个端口号进行通信。这个通信不包括计算机内的I/O作,只包括在网络上进行的作。网络上的计算机被看作包传送的源和目的结点。特别应该注意的是:计算机中的不同进程可能同时进行通信,这时它们会用端口号进行区别,不会把发向A进程的数据由B进程接收的。
进程为了传送数据会调用TCP,将数据和相应的参数传送给TCP,于是TCP会将数据传送到目的TCP那里,当然这是通过将TCP包打包在IP包内在网络上传送达到的。接收方TCP在接收到数据后会通信上层应用程序,TCP会保证接收数据顺序的正确性。虽然下层协议可能不会保证顺序是正确的。这里需要说明的是网关在接收到这个包后,会将包解开,看看是不是已经到目的地了,如果没有到,应该走什么路由达到目的地,在决定后,网关会根据下一个网络内的协议情况再次将TCP包打包传送,如果需要,还要把这个包再次分成几段再传送。这个落地检查的过程是一个耗时的过程。从上面,我们可以看出TCP传送的基本过程,当然具体过程可能要复杂得多。
在实现TCP的主机上,TCP可以被看成是一个模块,和文件系统区别不大,TCP也可以调用一些作系统的功能,TCP不直接和网络打交道,控制网络的任务由专门的设备驱动模块完成。TCP只是调用IP接口,IP向TCP提供所有TCP需要的服务。
上面已经说过了,TCP连接是可靠的,而且保证了传送数据包的顺序,保证顺序是用一个序号来保证的。响应包内也包括一个序列号,表示接收方准备好这个序号的包。在TCP传送一个数据包时,它同时把这个数据包放入重发队列中,同时启动记数器,如果收到了关于这个包的确认信息,将此包从队列中删除,如果计时超时则需要重新发送此包。请注意,从TCP返回的确认信息并不保证最终接收者接收到数据,这个责任由接收方负责。
每个用于传送TCP的通道都有一个端口标记,因为这个标记是由每个TCP终端确定的,因此TCP可能不唯一,为了保证这个数值的唯一,要使用网络地址和端口号的组合达到唯一标识的目的,我们称这个为了套接字(Socket),一个连接由连接两端的套接字标识,本地的套接字可能和不同的外部套接字通信,这种通信是全双工的。
通过向本地端口发送OPEN命令及外部套接字参数建立连接,TCP返回一个标记这个连接的名称,以后如果用户需要使用这个名称标记这个连接。为了保存这个连接的信息,我们假设有一个称为传输控制块(Transmission
Control Block,TCB)的东西来保存。OPEN命令还指定这个连接的建立是主动请求还是被动等待请求。
这里对TCP所一个简单的介绍。TCP/IP协议是互联上的广泛使用的一种协议,了解它对了解网络作是十分有好处的。