TCP/IP: TCP/IP详解 读记

第三章 IP:网际协议

IP路由选择

从概念上说, I P路由选择是简单的,特别对于主机来说。如果目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那么I P数据报就直接送到目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。大多数的主机都是采用这种简单机制。

在一般的体制中,I P可以从T C PU D PICMPI G M P接收数据报(即在本地生成的数据报)并进行发送,或者从一个网络接口接收数据报(待转发的数据报)并进行发送。

I P层在内存中有一个路由表。当收到一份数据报并进行发送时,它都要对该表搜索一次。当数据报来自某个网络接口时, I P首先检查目的I P地址是否为本机的I P地址之一或者I P广播地址。如果确实是这样,数据报就被送到由I P首部协议字段所指定的协议模块进行处理。如果数据报的目的不是这些地址,那么( 1)如果I P层被设置为路由器的功能,那么就对数据报进行转发(也就是说,像下面对待发出的数据报一样处理);否则( 2)数据报被丢弃。

路由表中的每一项都包含下面这些信息:

目的I P地址。它既可以是一个完整的主机地址,也可以是一个网络地址,由该表目中的标志字段来指定。

主机地址有一个非0的主机号,以指定某一特定的主机,而网络地址中的主机号为0,以指定网络中的所有主机(如以太网,令牌环网)。

下一站(或下一跳)路由器( next-hop router)的I P地址,或者有直接连接的网络I P地址。下一站路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报。下一站路由器不是最终的目的,但是它可以把传送给它的数据报转发到最终目的。

标志。其中一个标志指明目的I P地址是网络地址还是主机地址,另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口。

为数据报的传输指定一个网络接口。

IP并不知道到达任何目的的完整路径(当然,除了那些与主机直接相连的目的)。所有的I P路由选择只为数据报传输提供下一站路由器的I P地址。它假定下一站路由器比发送数据报的主机更接近目的,

而且下一站路由器与该主机是直接相连的。

I P路由选择主要完成以下这些功能:

1) 搜索路由表,寻找能与目的I P地址完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。

2) 搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。目的网络上的所有主机都可以通过这个表目来处置。例如,一个以太网上的所有主机都是通过这种表目进行寻径的。

这种搜索网络的匹配方法必须考虑可能的子网掩码。关于这一点我们在下一节中进行讨论。

3) 搜索路由表,寻找标为“默认( d e f a u l t)”的表目。如果找到,则把报文发送给该表目指定的下一站路由器。

如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。完整主机地址匹配在网络号匹配之前执行。只有当它们都失败后才选择默认路由。默认路由,以及下一站路由器发送的ICMP间接报文(如果我们为数据报选择了错误的默认路由),是I P路由选择机制中功能强大的特性。我们在第9章对它们进行讨论。

为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是I P路由选择机制的另一个基本特性。这样做可以极大地缩小路由表的规模,比如I n t e r n e t上的路由器有只有几千个表目,而不会是超过1 0 0万个表目。

小结

本章开始描述了I P首部的格式,并简要讨论了首部中的各个字段。我们还介绍了I P路由选择,并指出主机的路由选择可以非常简单:如果目的主机在直接相连的网络上,那么就把数据报直接传给目的主机,否则传给默认路由器。

在进行路由选择决策时,主机和路由器都使用路由表。在表中有三种类型的路由:特定主机型、特定网络型和默认路由型。路由表中的表目具有一定的优先级。在选择路由时,主机路由优先于网络路由,最后在没有其他可选路由存在时才选择默认路由。

I P路由选择是通过逐跳来实现的。数据报在各站的传输过程中目的I P地址始终不变,但是封装和目的链路层地址在每一站都可以改变。大多数的主机和许多路由器对于非本地网络的数据报都使用默认的下一站路由器。

A类和B类地址一般都要进行子网划分。用于子网号的比特数通过子网掩码来指定。我们为此举了一个实例来详细说明,即作者所在的子网,并介绍了变长子网的概念。子网的划分缩小了I n t e r n e t路由表的规模,因为许多网络经常可以通过单个表目就可以访问了。接口和网络的有关信息通过i f c o n f i gnetstat命令可以获得,包括接口的I P地址、子网掩码、广播地址以及M T U等。

在本章的最后,我们对I n t e r n e t协议族潜在的改进建议—下一代I P进行了讨论。

子网寻址

现在所有的主机都要求支持子网编址( RFC 950 [Mogul and Postel 1985])。不是把I P地址看成由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。

这样做的原因是因为A类和B类地址为主机号分配了太多的空间,可分别容纳的主机数为22 4-221 6-2。事实上,在一个网络中人们并不安排这么多的主机(各类I P地址的格式如图1 - 5所示)。由于全0或全1的主机号都是无效的,因此我们把总数减去2

I n t e r N I C获得某类I P网络号后,就由当地的系统管理员来进行分配,由他(或她)来决定是否建立子网,以及分配多少比特给子网号和主机号。例如,这里有一个B类网络地址(1 4 0 . 2 5 2),在剩下的16 bit中,8 bit用于子网号, 8 bit用于主机号,格式如图3 - 5所示。这样就允许有2 5 4个子网,每个子网可以有2 5 4台主机。

 

第四章 ARP: 地址解析协议

当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48 bit的以太网地址来确定目的接口的。设备驱动程序从不检查I P数据报中的目的I P地址。

 

一个以太网中的经典例子(摘录)

任何时候我们敲入下面这个形式的命令:

% ftp bsdi

都会进行以下这些步骤。这些步骤的序号如图4 - 2所示。

1) 应用程序FTP客户端调用函数g e t h o s t b y n a m e(3)把主机名(bsdi)转换成32 bitIP地址。

这个函数在D N S(域名系统)中称作解析器,我们将在第1 4章对它进行介绍。这个转换过程或者使用DNS,或者在较小网络中使用一个静态的主机文件(/e t c / h o s t s)。

2) F T P客户端请求T C P用得到的I P地址建立连接。

3) T C P发送一个连接请求分段到远端的主机,即用上述I P地址发送一份I P数据报(在第1 8章我们将讨论完成这个过程的细节)。

4) 如果目的主机在本地网络上(如以太网、令牌环网或点对点链接的另一端),那么I P数据报可以直接送到目的主机上。如果目的主机在一个远程网络上,那么就通过I P选路函数来确定位于本地网络上的下一站路由器地址,并让它转发I P数据报。在这两种情况下,I P数据报都是被送到位于本地网络上的一台主机或路由器。

5) 假定是一个以太网,那么发送端主机必须32 bitI P地址变换成48 bit的以太网地址。从逻辑Internet地址到对应的物理硬件地址需要进行翻译。这就是ARP的功能。

ARP本来是用于广播网络的,有许多主机或路由器连在同一个网络上。

6) ARP发送一份称作ARP请求的以太网数据帧给以太网上的每个主机。这个过程称作广播.如图4 - 2中的虚线所示。ARP请求数据帧中包含目的主机的I P地址(主机名为b s d i),其意思是“如果你是这个I P地址的拥有者,请回答你的硬件地址。”

7) 目的主机的ARP层收到这份广播报文后,识别出这是发送端在寻问它的I P地址,于是发送一个ARP应答。这个ARP应答包含I P地址及对应的硬件地址。

8) 收到ARP应答后,使ARP进行请求—应答交换的I P数据报现在就可以传送了。

9) 发送I P数据报到目的主机。

ARP背后有一个基本概念,那就是网络接口有一个硬件地址(一个48 bit的值,标识不同的以太网或令牌环网络接口)。在硬件层次上进行的数据帧交换必须有正确的接口地址。但是,TCP/IP有自己的地址: 32 bitI P地址。知道主机的I P地址并不能让内核发送一帧数据给主机。内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。ARP的功能是在32 bitI P地址和采用不同网络技术的硬件地址之间提供动态映射。

ARP代理

如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托ARPARP代理(Proxy ARP)

免费ARP

我们可以看到的另一个ARP特性称作免费ARP (gratuitous ARP)。它是指主机发送ARP查找自己的I P地址。通常,它发生在系统引导期间进行接口配置的时候。

 

第五章 RARP: 逆地址解析协议

RARP协议是许多无盘系统在引导时用来获取I P地址的。RARP分组格式基本上与ARP分组一致。一个RARP请求在网络上进行广播,它在分组中标明发送端的硬件地址,以请求相应I P地址的响应。应答通常是单播传送的。

RARP带来的问题包括使用链路层广播,这样就阻止大多数路由器转发RARP请求,只返回很少信息:只是系统的I P地址。在第1 6章中,我们将看到B O O T P在无盘系统引导时会返回更多的信息:I P地址和引导主机的名字等。

虽然R ARP在概念上很简单,但是R ARP服务器的实现却与系统相关。因此,并不是所有的TCP/IP实现都提供R ARP服务器。

 

第六章 ICMP: Internet控制报文协议

 小结

本章对每个系统都必须包括的Internet控制报文协议进行了讨论。图6 - 3列出了所有的ICMP报文类型,其中大多数都将在以后的章节中加以讨论。

我们详细讨论了ICMP地址掩码请求和应答以及时间戳请求和应答。这些是典型的请求—应答报文。二者在ICMP报文中都有标识符和序列号。发送端应用程序在标识字段内存入一个唯一的数值,以区别于其他进程的应答。序列号字段使得客户程序可以在应答和请求之间进行匹配。

我们还讨论了ICMP端口不可达差错,一种常见的ICMP差错。对返回的ICMP差错信息进行了分析:导致差错的I P数据报的首部及后续8个字节。这个信息对于ICMP差错的接收方来说是必要的,可以更多地了解导致差错的原因。这是因为T C PU D P都在它们的首部前8个字节中存入源端口号和目的端口号。

最后,我们第一次给出了按时间先后的tcpdump输出,这种表示方式在本书后面的章节中会经常用到。

 

第七章 Ping程序

小结

Ping程序是对两个TCP/IP系统连通性进行测试的基本工具。它只利用ICMP回显请求和回显应答报文,而不用经过传输层(TCP/UDP)Ping服务器一般在内核中实现ICMP的功能。

我们分析了在L A NWA N以及S L I P链路(拨号和线路)上运行p i n g程序的输出结果,并对串行线路上的S L I P链路吞吐量进行了计算。我们还讨论并使用了Ping程序的I P记录路由选项。利用该I P选项,可以看到它是如何频繁使用默认路由的。在第9章我们将再次回到这个讨论主题。另外,还讨论了IP 时间戳选项,但它在实际使用时有所限制。

 

第八章 Traceroute程序

每个处理数据报的路由器都需要把TTL的值减1或减去数据报在路由器中停留的秒数。由于大多数的路由器转发数据报的时延都小于1秒钟,因此TTL最终成为一个跳站的计数器,所经过的每个路由器都将其值减1

TTL字段的目的是防止数据报在选路时无休止地在网络中流动。例如,当路由器瘫痪或者两个路由器之间的连接丢失时,选路协议有时会去检测丢失的路由并一直进行下去。在这段时间内,数据报可能在循环回路被终止。TTL字段就是在这些循环传递的数据报上加上一

个生存上限。

当路由器收到一份I P数据报,如果其TTL字段是01,则路由器不转发该数据报(接收到这种数据报的目的主机可以将它交给应用程序,这是因为不需要转发该数据报。但是在通常情况下,系统不应该接收TTL字段为0的数据报)。相反,路由器将该数据报丢弃,并给信源

机发一份ICMP“超时”信息。Traceroute程序的关键在于包含这份ICMP信息的I P报文的信源地址是该路由器的I P地址。

我们现在可以猜想一下Traceroute程序的操作过程。它发送一份TTL字段为1I P数据报给目的主机。处理这份数据报的第一个路由器将TTL值减1,丢弃该数据报,并发回一份超时ICMP报文。这样就得到了该路径中的第一个路由器的地址。然后Traceroute程序发送一份TTL值为2的数据报,这样我们就可以得到第二个路由器的地址。继续这个过程直至该数据报到达目的主机。但是目的主机哪怕接收到TTL值为1I P数据报,也不会丢弃该数据报并产生一份超时ICMP报文,这是因为数据报已经到达其最终目的地。那么我们该如何判断是否已经到达目的主机了呢?

Traceroute程序发送一份U D P数据报给目的主机,但它选择一个不可能的值作为U D P端口号(大于30 000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的U D P模块产生一份“端口不可达”错误(见6 . 5节)的ICMP报文。

这样,Traceroute程序所要做的就是区分接收到的ICMP报文是超时还是端口不可达,以判断什么时候结束。

小结

在一个TCP/IP网络中, Traceroute程序是不可缺少的工具。其操作很简单:开始时发送一个TTL字段为1U D P数据报,然后将TTL字段每次加1,以确定路径中的每个路由器。

每个路由器在丢弃U D P数据报时都返回一个ICMP超时报文2,而最终目的主机则产生一个ICMP端口不可达的报文。

我们给出了在L A NWA N上运行Traceroute程序的例子,并用它来考察I P源站选路。

我们用宽松的源站选路来检测发往目的主机的路由是否与从目的主机返回的路由一样。

 

第九章 IP选路

几个要注意的地方

简单路由表

对于一个给定的路由器,可以打印出五种不同的标志( f l a g):

U   该路由可以使用。

G   该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地是直接相连的。

H   该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号,或者网络号与子网号的组合。

D   该路由是由重定向报文创建的( 9 . 5节)。

M   该路由已被重定向报文修改( 9 . 5节)。

标志G是非常重要的,因为由它区分了间接路由和直接路由(对于直接路由来说是不设置标志G的)。

其区别在于,发往直接路由的分组中不但具有指明目的端的I P地址,还具有其链路层地址(见图3 - 3)。当分组被发往一个间接路由时, I P地址指明的是最终的目的地,但是链路层地址指明的是网关(即下一站路由器)。我们在图3 - 4已看到这样的例子。在这个路由表例子中,有一个间接路由(设置了标志G),因此采用这一项路由的分组其I P地址是最终的目的地(1 4 0 . 2 5 2 . 1 3 . 6 5),但是其链路层地址必须对应于路由器1 4 0 . 2 5 2 . 1 3 . 3 5

理解GH标志之间的区别是很重要的。G标志区分了直接路由和间接路由,如上所述。

但是H标志表明,目的地址(netstat命令输出第一行)是一个完整的主机地址。没有设置H标志说明目的地址是一个网络地址(主机号部分为0)。当为某个目的I P地址搜索路由表时,主机地址项必须与目的地址完全匹配,而网络地址项只需要匹配目的地址的网络号和子网号就可以了。另外,大多数版本的netstat命令首先打印出所有的主机路由表项,然后才是网络路由表项。

ICMP重定向差错

I P数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送ICMP重定向差错报文给I P数据报的发送端。这在概念上是很简单的,正如图9 - 3所示的那样。只有当主机可以选择路由器发送分组的情况下,我们才可能看到ICMP重定向报文(回忆我们在图7 - 6中看过的例子)。

1) 我们假定主机发送一份I P数据报给R 1。这种选路决策经常发生,因为R 1是该主机的默认路由。

2) R1收到数据报并且检查它的路由表,发现R 2是发送该数据报的下一站。当它把数据报发送给R 2时,R 1检测到它正在发送的接口数据报到达接口是相同的(即主机和两个路由器所在的L A N)。这样就给路由器发送重定向报文给原始发送端提供了线索。

3) R1 发送一份ICMP重定向报文给主机,告诉它以后把数据报发送给R 2而不是R 1

 

小结

I P路由操作对于运行TCP/IP的系统来说是最基本的,不管是主机还是路由器。路由表项的内容很简单,包括: 5 bit标志、目的I P地址(主机、网络或默认)、下一站路由器的I P地址(间接路由)或者本地接口的I P地址(直接路由)及指向本地接口的指针。主机表项比网络表项具有更高的优先级,而网络表项比默认项具有更高的优先级。

系统产生的或转发的每份I P数据报都要搜索路由表,它可以被路由守护程序或ICMP重定向报文修改。系统在默认情况下不转发数据报,除非进行特殊的配置。用r o u t e命令可以进入静态路由,可以利用新ICMP路由器发现报文来初始化默认表项,并进行动态修改。主机在启动时只有一个简单的路由表,它可以被来自默认路由器的ICMP重定向报文动态修改。

 

第十章 动态选路协议

 引言

在前面各章中,我们讨论了静态选路。在配置接口时,以默认方式生成路由表项(对于直接连接的接口),并通过r o u t e命令增加表项(通常从系统自引导程序文件),或是通过I C M P重定向生成表项(通常是在默认方式出错的情况下)。

在网络很小,且与其他网络只有单个连接点且没有多余路由时(若主路由失败,可以使用备用路由),采用这种方法是可行的。如果上述三种情况不能全部满足,通常使用动态选路。

本章讨论动态选路协议,它用于路由器间的通信。我们主要讨论R I P,即选路信息协议(Routing Infromation Protocol),大多数T C P / I P实现都提供这个应用广泛的协议。然后讨论两种新的选路协议, O S P FB G P。本章的最后研究一种名叫无分类域间选路的新的选路技术,现在I n t e r n e t上正在开始采用该协议以保持B类网络的数量。

动态选路

当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路。路由器之间必须采用选路协议进行通信,这样的选路协议有很多种。路由器上有一个进程称为路由守护程序( routing daemon),它运行选路协议,并与其相邻的一些路由器

进行通信。正如图9 - 1所示,路由守护程序根据它从相邻路由器接收到的信息,更新内核中的路由表。

动态选路并不改变我们在9 . 2节中所描述的内核在I P层的选路方式。这种选路方式称为选路机制( routing mechanism)。内核搜索路由表,查找主机路由、网络路由以及默认路由的方式并没有改变。仅仅是放置到路由表中的信息改变了—当路由随时间变化时,路由是由路

由守护程序动态地增加或删除,而不是来自于自引导程序文件中的r o u t e命令。

正如前面所描述的那样,路由守护程序将选路策略( routing policy)加入到系统中,选择路由并加入到内核的路由表中。如果守护程序发现前往同一信宿存在多条路由,那么它(以某种方法)将选择最佳路由并加入内核路由表中。如果路由守护程序发现一条链路已经断

开(可能是路由器崩溃或电话线路不好),它可以删除受影响的路由或增加另一条路由以绕过该问题。

小结

有两种基本的选路协议,即用于同一自治系统各路由器之间的内部网关协议( I G P)和用于不同自治系统内路由器通信的外部网关协议( E G P)。

最常用的I G P是路由信息协议(R I P),而O S P F是一个正在得到广泛使用的新I G P。一种新近流行的E G P是边界网关协议( B G P)。在本章中,我们讨论了R I P及其交换的报文类型。第2R I P是其最近的一个改进版,它支持子网,还有一些其他改进技术。同时也对O S P FB G P和无类型域间选路( C I D R)进行了描述。C I D R是一种新技术,可以减小I n t e r n e t路由表的大小。

动态选路仍然是一个网间互连的研究热点。对使用的选路协议和运行的路由守护程序进行选择,是一项复杂的工作。

 

第十一章 UDP: 用户数据包协议

U D P是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个U D P数据报,并组装成一份待发送的I P数据报。

这与面向流字符的协议不同,如T C P,应用程序产生的全体数据与真正发送的单个I P数据报可能没有什么联系。

应用程序必须关心I P数据报的长度。如果它超过网络的M T U2 . 8节),那么就要对I P数据报进行分片。如果需要,源端到目的端之间的每个网络都要进行分片,并不只是发送端主机连接第一个网络才这样做(我们在2 . 9节中已定义了路径M T U的概念)。在11 . 5节中,我们将讨论I P分片机制。

UDP检验和

U D P检验和覆盖U D P首部和U D P数据。回想I P首部的检验和,它只覆盖I P的首部—并不覆盖I P数据报中的任何数据。

U D PT C P在首部中都有覆盖它们首部和数据的检验和。U D P的检验和是可选的,而T C P的检验和是必需的。

尽管U D P检验和的基本计算方法与我们在3 . 2节中描述的I P首部检验和计算方法相类似(16 bit字的二进制反码和),但是它们之间存在不同的地方。首先, U D P数据报的长度可以为奇数字节,但是检验和算法是把若干个16 bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送)。

其次, U D P数据报和T C P段都包含一个1 2字节长的伪首部,它是为了计算检验和而设置的。伪首部包含I P首部一些字段。其目的是让U D P两次检查数据是否已经正确到达目的地(例如, I P没有接受地址不是本主机的数据报,以及I P没有把应传给另一高层的数据报传给U D P.

我们特地举了一个奇数长度的数据报例子,因而在计算检验和时需要加上填充字节。注意,U D P数据报的长度在检验和计算过程中出现两次。

如果检验和的计算结果为0,则存入的值为全16 5 5 3 5),这在二进制反码计算中是等效的。如果传送的检验和为0,说明发送端没有计算检验和。

就像数据回显一样。这再次表明U D P检验和(事实上,TCP/IP协议簇中所有的检验和)是简单的16 bit和。它们检测不出交换两个16 bit的差错。

一些统计结果

注意, T C P发生检验和差错的比例与U D P相比要高得多。这很可能是因为在该系统中的T C P连接经常是“远程”连接(经过许多路由器和网桥等中间设备),而U D P一般为本地通信。

从最后一行可以看出,不要完全相信数据链路(如以太网,令牌环等)的C R C检验。应该始终打开端到端的检验和功能。而且,如果你的数据很有价值,也不要完全相信U D PT C P的检验和,因为这些都只是简单的检验和,不能检测出所有可能发生的差错。

IP分片

分片可以发生在原始发送端主机上,也可以发生在中间路由器上。

把一份I P数据报分片以后,只有到达目的地才进行重新组装(这里的重新组装与其他网络协议不同,它们要求在下一站就进行进行重新组装,而不是在最终的目的地)。重新组装由目的端的I P层来完成,其目的是使分片和重新组装过程对运输层( T C PU D P)是透明的,除了某些可能的越级操作外。已经分片过的数据报有可能会再次进行分片(可能不止一次)。

I P首部中包含的数据为分片和重新组装提供了足够的信息。

回忆I P首部(图3 - 1),下面这些字段用于分片过程。对于发送端发送的每份I P数据报来说,其标识字段都包含一个唯一值。该值在数据报分片时被复制到每个片中(我们现在已经看到这个字段的用途)。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。

另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。

尽管I P分片过程看起来是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报。为什么会发生这种情况呢?因为I P层本身没有超时重传的机制——由更高层来负责超时和重传(T C P有超时和重传机制,但U D P没有。一些U D P应用程序本身也执行超时和重传)。当来自T C P报文段的某一片丢失后,T C P在超时后会重发整个T C P报文段,该报文段对应于一份I P数据报。没有办法只重传数据报中的一个数据报片。事实上,如果对数据报分片的

是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何被分片的。就这个原因,经常要避免分片。

小结

U D P是一个简单协议。它的正式规范是RFC 768 [Postel 1980],只包含三页内容。它向用户进程提供的服务位于I P层之上,包括端口号和可选的检验和。我们用U D P来检查检验和,并观察分片是如何进行的。

接着,我们讨论了I C M P不可达差错,它是新的路径M T U发现功能中的一部分( 2 . 9节)。

Tr a c e r o u t eU D P来观察路径M T U发现过程。还查看了U D PA R P之间的接口,大多数的A R P实现在等待A R P应答时只保留最近传送给目的端的数据报。

当系统接收I P数据报的速率超过这些数据报被处理的速率时,系统可能发送I C M P源站抑制差错报文。使用U D P时很容易产生这样的I C M P差错。

 

第十二章 广播和多播

引言

在第1章中我们提到有三种I P地址:单播地址、广播地址和多播地址。本章将更详细地介绍广播和多播。

广播和多播仅应用于U D P,它们对需将报文同时传往多个接收者的应用来说十分重要。

T C P是一个面向连接的协议,它意味着分别运行于两主机(由I P地址确定)内的两进程(由端口号确定)间存在一条连接。

考虑包含多个主机的共享信道网络如以太网。每个以太网帧包含源主机和目的主机的以太网地址(4 8 b i t)。通常每个以太网帧仅发往单个目的主机,目的地址指明单个接收接口,因而称为单播( u n i c a s t )。在这种方式下,任意两个主机的通信不会干扰网内其他主机(可能引起争夺共享信道的情况除外)。

然而,有时一个主机要向网上的所有其他主机发送帧,这就是广播。通过A R PR A R P可以看到这一过程。多播(multicast) 处于单播和广播之间:帧仅传送给属于多播组的多个主机。

为了弄清广播和多播,需要了解主机对由信道传送过来帧的过滤过程。图1 2 - 1说明了这一过程。

首先,网卡查看由信道传送过来的帧,确定是否接收该帧,若接收后就将它传往设备驱动程序。通常网卡仅接收那些目的地址为网卡物理地址或广播地址的帧。另外,多数接口均被设置为混合模式,这种模式能接收每个帧的一个复制。作为一个例子, t c p d u m p使用这种模式。目前,大多数的网卡经过配置都能接收目的地址为多播地址或某些子网多播地址的帧。对于以太网,当地址中最高字节的最低位设置为1时表示该地址是一个多播地址,用十六进制可表示为0 1 : 0 0 : 0 0 : 0 0 : 0 0 : 0 0(以太网广播地址ff : ff : ff : ff : ff : ff可看作是以太网多播地址的特例)。

如果网卡收到一个帧,这个帧将被传送给设备驱动程序(如果帧检验和错,网卡将丢弃该帧)。设备驱动程序将进行另外的帧过滤。首先,帧类型中必须指定要使用的协议( I PA R P等等)。其次,进行多播过滤来检测该主机是否属于多播地址说明的多播组。

设备驱动程序随后将数据帧传送给下一层,比如,当帧类型指定为I P数据报时,就传往I P层。I P根据I P地址中的源地址和目的地址进行更多的过滤检测。如果正常,就将数据报传送给下一层(如T C PU D P)。

每次U D P收到由I P传送来的数据报,就根据目的端口号,有时还有源端口号进行数据报过滤。如果当前没有进程使用该目的端口号,就丢弃该数据报并产生一个I C M P不可达报文(T C P根据它的端口号作相似的过滤)。如果U D P数据报存在检验和错,将被丢弃。

使用广播的问题在于它增加了对广播数据不感兴趣主机的处理负荷。拿一个使用U D P广播应用作为例子。如果网内有5 0个主机,但仅有2 0个参与该应用,每次这2 0个主机中的一个发送U D P广播数据时,其余3 0个主机不得不处理这些广播数据报。一直到U D P层,收到的

U D P广播数据报才会被丢弃。这3 0个主机丢弃U D P广播数据报是因为这些主机没有使用这个目的端口。

多播的出现减少了对应用不感兴趣主机的处理负荷。使用多播,主机可加入一个或多个多播组。这样,网卡将获悉该主机属于哪个多播组,然后仅接收主机所在多播组的那些多播帧。

多播

I P多播提供两类服务:

1) 向多个目的地址传送数据。有许多向多个接收者传送信息的应用:例如交互式会议系统和向多个接收者分发邮件或新闻。如果不采用多播,目前这些应用大多采用T C P来完成(向每个目的地址传送一个单独的数据复制)。然而,即使使用多播,某些应用可能继续采用

T C P来保证它的可靠性。

2) 客户对服务器的请求。例如,无盘工作站需要确定启动引导服务器。目前,这项服务是通过广播来提供的(正如第1 6章的B O O T P),但是使用多播可降低不提供这项服务主机的负担。

多播组地址到以太网地址的转换

I A N A拥有一个以太网地址块,即高位24 bit0 0 : 0 0 : 5 e(十六进制表示),这意味着该地址块所拥有的地址范围从0 0 : 0 0 : 5 e : 0 0 : 0 0 : 0 00 0 : 0 0 : 5 e : ff : ff : ffI A N A将其中的一半分配为多播地址。为了指明一个多播地址,任何一个以太网地址的首字节必须是0 1,这意味着与I P多播相对应的以太网地址范围从0 1 : 0 0 : 5 e : 0 0 : 0 0 : 0 00 1 : 0 0 : 5 e : 7 f : ff : ff

这里对C S M A / C D或令牌网使用的是I n t e r n e t标准比特顺序,和在内存中出现的比特顺序一样。这也是大多数程序设计员和系统管理员采用的顺序。I E E E文档采用了这种比特传输顺序。Assigned Numbers RFC给出了这些表示的差别。

这种地址分配将使以太网多播地址中的2 3 b i tI P多播组号对应起来,通过将多播组号中的低位2 3 b i t映射到以太网地址中的低位2 3 b i t实现,这个过程如图1 2 - 3所示。

由于多播组号中的最高5 bit在映射过程中被忽略,因此每个以太网多播地址对应的多播组是不唯一的。3 2 个不同的多播组号被映射为一个以太网地址。例如,多播地址2 2 4 . 1 2 8 . 6 4 . 3 2(十六进制e 0 . 8 0 . 4 0 . 2 0)和2 2 4 . 0 . 6 4 . 3 2(十六进制e 0 . 0 0 . 4 0 . 2 0)都映射为同一以太网地址0 1 : 0 0 : 5 e : 0 0 : 4 0 : 2 0

既然地址映射是不唯一的,那么设备驱动程序或I P层(见图1 2 - 1)就必须对数据报进行过滤。因为网卡可能接收到主机不想接收的多播数据帧。另外,如果网卡不提供足够的多播数据帧过滤功能,设备驱动程序就必须接收所有多播数据帧,然后对它们进行过滤。

小结

广播是将数据报发送到网络中的所有主机(通常是本地相连的网络),而多播是将数据报发送到网络的一个主机组。这两个概念的基本点在于当收到送往上一个协议栈的数据帧时采用不同类型的过滤。每个协议层均可以因为不同的理由丢弃数据报。

目前有四种类型的广播地址:受限的广播、指向网络的广播、指向子网的广播和指向所有子网的广播。最常用的是指向子网的广播。受限的广播通常只在系统初始启动时才会用到。

试图通过路由器进行广播而发生的问题,常常是因为路由器不了解目的网络的子网掩码。结果与多种因素有关:广播地址类型、配置参数等等。

DI P地址被称为多播组地址。通过将其低位23 bit映射到相应以太网地址中便可实现多播组地址到以太网地址的转换。由于地址映射是不唯一的,因此需要其他的协议实现额外的数据报过滤。

 

13IGMPInternet组管理协议

本章将介绍用于支持主机和路由器进行多播的I n t e r n e t组管理协议( I G M P)。它让一个物理网络上的所有系统知道主机当前所在的多播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。

正如I C M P一样, I G M P 也被当作I P 层的一部分。

I G M P报文通过I P数据报进行传输。不像我们已经见到的其他协议, I G M P有固定的报文长度,没有可选数据。图1 3 - 1显示了I G M P报文如何封装在I P数据报中。

I G M P报文通过I P首部中协议字段值为2来指明。I G M P类型为1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文。检验和的计算和I C M P协议相同。

组地址为DI P地址。在查询报文中组地址设置为0,在报告报文中组地址为要参加的组地址。在下一节中,当介绍I G M P如何操作时,我们将会更详细地了解它们。

IGMP 报告和查询

多播路由器使用I G M P报文来记录与该路由器相连网络中组成员的变化情况。使用规则如下:

1) 当第一个进程加入一个组时,主机就发送一个I G M P报告。如果一个主机的多个进程加入同一组,只发送一个I G M P报告。这个报告被发送到进程加入组所在的同一接口上。

2) 进程离开一个组时,主机不发送I G M P报告,即便是组中的最后一个进程离开。主机知道在确定的组中已不再有组成员后,在随后收到的I G M P查询中就不再发送报告报文。

3) 多播路由器定时发送I G M P查询来了解是否还有任何主机包含有属于多播组的进程。多播路由器必须向每个接口发送一个I G M P查询。因为路由器希望主机对它加入的每个多播组均发回一个报告,因此I G M P查询报文中的组地址被设置为0

4) 主机通过发送I G M P报告来响应一个I G M P查询,对每个至少还包含一个进程的组均要发回I G M P报告。

小结

多播是一种将报文发往多个接收者的通信方式。在许多应用中,它比广播更好,因为多播降低了不参与通信的主机的负担。简单的主机成员报告协议( I G M P )是多播的基本模块。

在一个局域网中或跨越邻近局域网的多播需要使用本章介绍的技术。广播通常局限在单个局域网中,对目前许多使用广播的应用来说,可采用多播来替代广播。

然而,多播还未解决的一个问题是在广域网内的多播。[Deering and Cheriton 1990] 提出扩展目前的路由协议来支持多播。9 . 1 3节中的[Perlman 1992]讨论了广域网多播的一些问题。

[Casner and Deering 1992] 介绍了使用多播和一个称为M B O N E(多播主干)的虚拟网络在整个I n t e r n e t上传送I E T F会议的情况。

 

14DNS:域名系统

一个例子

让我们通过另一个例子将已经介绍的许多D N S特性作一个综合性回顾。先启动Rlogin 客户程序,然后连接到一个位于其他域的R l o g i n服务器。图1 4 - 1 6显示了发生的分组交换过程。

下面发生的11个步骤都假定客户和服务器的高速缓存中没有任何信息。

1) 客户程序启动后,调用它的名字解析器函数将我们键入的主机名转换为一个I P地址。一个A类型的查询请求被送往一个根服务器。

2) 由根服务器返回的响应中包含为该服务器所在域服务的名字服务器名。

3) 客户端的名字解析器将向该服务器的名字服务器重发上述A类型查询,这个查询通常是将期望递归标志设置为1

4) 返回的应答中包含R l o g i n服务器的I P地址。

5) Rlogin客户和R l o g i n服务器建立一个T C P连接(第1 8章将提供该步骤的细节)。客户和服务器的T C P模块间将交换3个分组。

6) Rlogin服务器收到来自客户的连接请求后,调用它的名字解析器通过T C P连接请求中的I P地址获得客户主机名。这是一个P T R查询请求,由一个根名字服务器处理。这个根名字服务器可以不同于步骤1中客户使用的根名字服务器。

7) 这个根名字服务器的响应中含有为客户的i n - a d d r . a r p a域的名字服务器。

8) 服务器上的名字解析器将向客户的名字服务器重传上述P T R查询。

9) 返回的P T R应答中含有客户主机的F Q D N

10) 服务器的名字解析器向客户的名字服务器发送一个A类型查询请求,查找前一步返回的名字对应的I P地址。这可能由服务器中的g e t h o s t b y a d d r函数自动完成,正如我们在1 4 . 5节中介绍的那样,否则R l o g i n服务器将完成这一步。此外,客户的名字服务器常常就是客户的i n - a d d r . a r p a名字服务器,但这不是必需的。

11) 从客户的名字服务器返回的响应含有客户主机的A记录。R l o g i n服务器将客户的T C P连接请求中的I P地址与A记录作比较。高速缓存将减少这个图中交换的分组数目。

小结

D N S是任何与I n t e r n e t相连主机必不可少的一部分,同时它也广泛用于专用的互联网。层次树是组成D N S域名空间的基本组织形式。

应用程序通过名字解析器将一个主机名转换为一个I P地址,也可将一个I P地址转换为与之对应的主机名。名字解析器将向一个本地名字服务器发出查询请求,这个名字服务器可能通过某个根名字服务器或其他名字服务器来完成这个查询。

所有的D N S查询和响应都有相同的报文格式。这个报文格式中包含查询请求和可能的回答资源记录、授权资源记录和附加资源记录。通过许多例子了解了名字解析器的配置文件以及D N S的优化措施:指向域名的指针(减少报文的长度)、查询结果的高速缓存、i n - a d d r . a r p a域(查找I P地址对应的域名)以及返回的附加资源记录(避免主机重发同一查询请求)。

 

15TFTP:简单文件传送协议

 引言

T F T P ( Trivial File Transfer Protocol)即简单文件传送协议,最初打算用于引导无盘系统(通常是工作站或X终端)。和将在第2 7章介绍的使用T C P的文件传送协议( F T P)不同,为了保持简单和短小, T F T P将使用U D PT F T P的代码(和它所需要的U D PI P和设备驱动程序)都能适合只读存储器。

本章对T F T P只作一般介绍,因为在下一章引导程序协议 Bootstrap Protocol)中还会遇到T F T P。在图5 - 1中,当从网络上引导s u n主机时,也曾遇到过T F T Ps u n主机通过R A R P获得它的I P地址后,将发出一个T F T P请求。

RFC 1350 [Sollins 1992]是第2T F T P的正式规范。第1 2[Stevens 1990] 提供了实现T F T P客户和服务器的全部源代码,并介绍了一些使用T F T P的编程技术。

小结

T F T P是一个简单的协议,适合于只读存储器,仅用于无盘系统进行系统引导。它只使用几种报文格式,是一种停止等待协议。

为了允许多个客户端同时进行系统引导, T F T P服务器必须提供一定形式的并发。因为U D P在一个客户与一个服务器之间并不提供唯一连接( T C P也一样),T F T P服务器通过为每个客户提供一个新的U D P端口来提供并发。这允许不同的客户输入数据报,然后由服务器中的U D P模块根据目的端口号进行区分,而不是由服务器本身来进行区分。

T F T P协议没有提供安全特性。大多数执行指望T F T P服务器的系统管理员来限制客户的访问,只允许它们访问引导所必须的文件。

2 7章介绍的文件传输协议( F T P)是设计用于一般目的的、高吞吐量的文件传输。

 

16BOOTP:引导程序协议

引言

在第5章我们介绍了一个无盘系统,它在不知道自身I P地址的情况下,在进行系统引导时能够通过R A R P来获取它的I P地址。然而使用R A R P有两个问题:(1I P地址是返回的唯一结果;( 2)既然R A R P使用链路层广播, R A R P请求就不会被路由器转发(迫使每个实际网络设置一个RARP 服务器)。本章将介绍一种用于无盘系统进行系统引导的替代方法,又称为引导程序协议,或B O O T P

小结

B O O T P使用U D P,它为引导无盘系统获得它的I P地址提供了除R A R P外的另外一种选择。

B O O T P还能返回其他的信息,如路由器的I P地址、客户的子网掩码和名字服务器的I P地址。

既然B O O T P用于系统引导过程,一个无盘系统需要下列协议才能在只读存储器中完成:B O O T PT F T PU D PI P和一个局域网的驱动程序。

B O O T P服务器比R A R P服务器更易于实现,因为B O O T P请求和应答是在U D P数据报中,而不是特殊的数据链路层帧。一个路由器还能作为真正B O O T P服务器的代理,向位于不同网络的真正B O O T P服务器转发客户的B O O T P请求。

 

17TCP:传输控制协议

序号用来标识从T C P发端向T C P收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则T C P用序号对每个字节进行计数。序号是32 bit的无符号数,序号到达23 21后又从0开始。

当建立一个新的连接时, S Y N标志变1。序号字段包含由这个主机选择的该连接的初始序号I S NInitial Sequence Number)。该主机要发送数据的第一个字节序号为这个I S N1,因为S Y N标志消耗了一个序号(将在下章详细介绍如何建立和终止连接,届时我们将看到F I N标志也要占用一个序号)。

既然每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加1。只有A C K标志(下面介绍)为1时确认序号字段才有效。

发送A C K无需任何代价,因为32 bit的确认序号字段和A C K标志一样,总是T C P首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置, A C K标志也总是被设置为1

T C P为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。

T C P可以表述为一个没有选择确认或否认的滑动窗口协议(滑动窗口协议用于数据传输将在2 0 . 3节介绍)。我们说T C P缺少选择确认是因为T C P首部中的确认序号表示发方已成功收到字节,但还不包含确认序号所指的字节。当前还无法对数据流中选定的部分进行确认。例如,如果11 0 2 4字节已经成功收到,下一报文段中包含序号从2 0 4 93 0 7 2的字节,收端并不能确认这个新的报文段。它所能做的就是发回一个确认序号为1 0 2 5A C K。它也无法对一个

报文段进行否认。例如,如果收到包含1 0 2 52 0 4 8字节的报文段,但它的检验和错, T C P接收端所能做的就是发回一个确认序号为1 0 2 5A C K。在2 1 . 7节我们将看到重复的确认如何帮

助确定分组已经丢失。首部长度给出首部中32 bit字的数目。需要这个值是因为任选字段的长度是可变的。这个字段占4 bit,因此T C P最多有6 0字节的首部。然而,没有任选字段,正常的长度是2 0字节。

T C P首部中有6个标志比特。它们中的多个可同时被设置为1。我们在这儿简单介绍它们的用法,在随后的章节中有更详细的介绍。

U R G 紧急指针( u rgent pointer)有效(见2 0 . 8节)。

A C K 确认序号有效。

P S H 接收方应该尽快将这个报文段交给应用层。

R S T 重建连接。

S Y N 同步序号用来发起一个连接。这个标志和下一个标志将在第1 8章介绍。

F I N 发端完成发送任务。

T C P的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个16 bit字段,因而窗口大小最大为6 5 5 3 5字节。在2 4 . 4节我们将看到新的窗口刻度选项,它允许这个值按比例变化以提供更大的窗口。

检验和覆盖了整个的T C P报文段: T C P首部和T C P数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。T C P检验和的计算和U D P检验和的计算相似,使用如11 . 3节所述的一个伪首部。

只有当U R G标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。T C P的紧急方式是发送端向另一端发送紧急数据的一种方式。我们将在2 0 . 8节介绍它。

最常见的可选字段是最长报文大小,又称为MSS (Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置S Y N标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。我们将在1 8 . 4节更详细地介绍M S S选项,T C P的其他选项中的一些将在第2 4章中介绍。

从图1 7 - 2中我们注意到T C P报文段中的数据部分是可选的。我们将在1 8章中看到在一个连接建立和一个连接终止时,双方交换的报文段仅有T C P首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

小结

T C P提供了一种可靠的面向连接的字节流运输层服务。我们简单地介绍了T C P首部中的各个字段,并在随后的几章里详细讨论它们。

T C P将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据; T C P提供端到端的流量控制,并计算和验证一个强制性的端到端检验和。

许多流行的应用程序如Te l n e tR l o g i nF T PS M T P都使用T C P

 

18TCP连接的建立与终止

小结

两个进程在使用T C P交换数据之前,它们之间必须建立一条连接。完成后,要关闭这个连接。本章已经详细介绍了如何使用三次握手来建立连接以及使用4个报文段来关闭连接。

我们用t c p d u m p程序显示了T C P首部中的各个字段。也了解了连接建立是如何超时,连接复位是如何发送,使用半打开连接发生的情况以及T C P是如何提供半关闭、同时打开和同时关闭。

弄清T C P操作的关键在于它的状态变迁图。我们跟踪了连接建立与关闭的步骤以及它们的状态变迁过程。还讨论了在设计T C P并发服务器时T C P连接建立的具体实现方法。

一个T C P连接由一个4元组唯一确定:本地I P地址、本地端口号、远端I P地址和远端端口号。无论何时关闭一个连接,一端必须保持这个连接,我们看到T I M E WA I T状态将处理这个问题。处理的原则是执行主动打开的一端在进入这个状态时要保持的时间为T C P实现中规定的M S L值的两倍。

 

19TCP的交互数据流

小结

交互数据总是以小于最大报文段长度的分组发送。在R l o g i n中通常只有一个字节从客户发送到服务器。Te l n e t允许一次发送一行输入数据,但是目前大多数实现仍然发送一个字节。

对于这些小的报文段,接收方使用经受时延的确认方法来判断确认是否可被推迟发送,以便与回送数据一起发送。这样通常会减少报文段的数目,尤其是对于需要回显用户输入字符的R l o g i n会话。

在较慢的广域网环境中,通常使用N a g l e算法来减少这些小报文段的数目。这个算法限制发送者任何时候只能有一个发送的小报文段未被确认。但我们给出的一个例子也表明有时需要禁止N a g l e算法的功能。

 

20TCP的成块数据流

小结

正如我们在本章一开始时讲的那样,没有一种单一的方法可以使用T C P进行成块数据的交换。这是一个依赖于许多因素的动态处理过程,有些因素我们可以控制(如发送和接收缓存的大小),而另一些我们则没有办法控制(如网络拥塞、与实现有关的特性等)。在本章,

我们已经考察了许多T C P的传输过程,介绍了所有我们能够看到的特点和算法。

进行成块数据有效传输的最重要的方法是T C P的滑动窗口协议。我们考察了T C P为使发送方和接收方之间的管道充满来获得最可能快的传输速度而采用的方法。我们用带宽时延乘积衡量管道的容量,并分析了该乘积与窗口大小之间的关系。在2 4 . 8节介绍T C P性能的时候将再次涉及这个概念。

我们还介绍了T C PP U S H标志,因为在跟踪结果中总是观察到它,但我们无法对它的设置与否进行控制。本章最后一个主题是T C P的紧急数据,人们常常错误地称其为“带外数据”。

T C P的紧急方式只是一个从发送方到接收方的通知,该通知告诉接收方紧急数据已被发送,并提供该数据最后一个字节的序号。应用程序使用的有关紧急数据部分的编程接口常常都不是最佳的,从而导致更多的混乱。

 

21TCP的超时与重传

小结

本章提供了对T C P超时和重传机制的详细研究。使用的第1个例子是一个丢失的建立连接的S Y N,并观察了在随后的重传和超时中怎样使用指数退避方式。

T C P计算往返时间并使用这些测量结果来维护一个被平滑的RT T估计器和被平滑的均值偏差估计器。这两个估计器用来计算下一个重传时间。许多实现对每个窗口仅测量一次RT T

K a r n算法在分组丢失时可以不测量RT T就能解决重传的二义性问题。

详细例子包括3个丢失的分组,使我们看到T C P的许多实际算法:慢启动、拥塞避免、快速重传和快速恢复。我们也能够使用拥塞窗口和慢启动门限来手工计算TCP RT T估计器,并将这些值与跟踪输出的实际数据进行比较。

以多种I C M P差错对T C P连接的影响以及T C P怎样允许对数据进行重新分组来结束本章。

我们观察到“软”的I C M P差错没有引起T C P连接终止,但这些差错被保存以便在连接非正常中止时能够报告这些软差错。

 

22TCP的坚持定时器

小结

在连接的一方需要发送数据但对方已通告窗口大小为0时,就需要设置T C P的坚持定时器。发送方使用与第2 1章类似的重传间隔时间,不断地探查已关闭的窗口。这个探查过程将一直持续下去。

当运行一个例子来观察坚持定时器时,我们还观察到了T C P的避免出现糊涂窗口综合症的现象。这就是使T C P避免通告小的窗口大小或发送小的报文段。在我们的例子中,可以观察到发送方和接收方为避免糊涂窗口综合症所使用的策略。

 

23TCP的保活定时器

小结

正如我们在前面提到的,对保活功能是有争议的。协议专家继续在争论该功能是否应该归入运输层,或者应当完全由应用层来处理。

在连接空闲两个小时后,在一个连接上发送一个探查分组来完成保活功能。可能会发生4种不同的情况:对端仍然运行正常、对端已经崩溃、对端已经崩溃并重新启动以及对端当前无法到达。我们使用一个例子来观察每一种情况,并观察到在最后三个条件下返回的不同差错。

在前两个例子中,如果没有提供这种功能,并且也没有应用层的定时器,则客户将永远

无法知道对端已经崩溃或崩溃并重新启动。可是在最后一个例子中,两端都没有发生差错,只是它们之间的连接临时中断。我们在使用保活时必须关注这个限制。

 

24TCP的未来和性能

小结

本章已经讨论了五个新的T C P特征:路径M T U发现、窗口扩大选项、时间戳选项、序号回绕保护以及使用改进的T C P事务处理。我们观察到中间的三个特征是为在长肥管道——具有大的带宽时延乘积的网络—上优化性能所需要的。

路径M T U发现在M T U较大时,对于非本地连接,允许T C P使用比默认的5 3 6大的窗口。这样可以提高性能。

窗口扩大选项使最大的T C P窗口从6 5 5 3 5增加到1千兆字节以上。时间戳选项允许多个报文段被精确计时,并允许接收方提供序号回绕保护( PAW S)。这对于高速连接是必须的。这些新的T C P选项在连接时进行协商,并被不理解它们的旧系统忽略,从而允许较新的系统与旧的系统进行交互。

为事务用的T C P扩展,即T / T C P,允许一个客户/服务器的请求-应答序列在通常的情况下只使用三个报文段来完成。它避免使用三次握手,并缩短了T I M E WA I T状态,其方法是为每个主机高速缓存少量的信息,这些信息曾用来建立过一个连接。它还在包含数据报文段中使用S Y NF I N标志。

由于还有许多关于T C P能够运行多快的不精确的传闻,因此我们以对T C P性能的分析来结束本章。对于一个使用本章介绍的较新特征、协调得非常好的实现而言, T C P的性能仅受最大的1千兆字节窗口和光速(也就是往返时间)的限制。

 

26TelnetRlogin:远程登录

小结

本章我们介绍了R l o g i nTe l n e t操作。两者都提供了从客户进程远程登录到服务器进程,是我们能够在服务器端运行程序的方法。

这两个应用是不同的。R l o g i n假定连接的双方都是U n i x系统,所以只提供一个选项,它是1个简单的协议。Te l n e t则不同,它用于在不同类型的主机之间建立连接。

为了支持这种多机环境, Te l n e t提供客户进程和服务器进程的选项协商机制。如果连接的双方都支持这些选项,则可以增强一些功能。对于比较简单的客户进程和服务器进程,它可以提供Te l n e t的基本功能,而当双方都支持某些选项时,它又可以充分利用双方的新特性。

我们介绍了Te l n e t的选项协商机制,也介绍了3种数据传输的方式:单字符方式、准行方式和实行方式。现在的趋势是只要有可能,就尽量工作在准行方式下。这样可以减少网络上的数据量,同时为交互用户提供更好的行编辑和回显的响应。

2 6 - 1 8概括并比较了R l o g i nTe l n e t的不同特性。

R l o g i n服务器和Te l n e t服务器通常都将设置T C P的保活选项以检测客户主机是否崩溃(如果服务器的T C P实现支持,见第2 3章)。这两种应用都采用了T C P紧急方式,以便即使从服务器到客户的数据传输被流量控制所终止,服务器仍然可以向客户发送命令。

 

27FTP:文件传送协议

FTP协议

F T P与我们已描述的另一种应用不同,它采用两个T C P连接来传输一个文件。

1) 控制连接以通常的客户服务器方式建立。服务器以被动方式打开众所周知的用于F T P的端口( 2 1),等待客户的连接。客户则以主动方式打开T C P端口2 1,来建立连接。控制连接始终等待客户与服务器之间的通信。该连接将命令从客户传给服务器,并传回服务器的应答。

由于命令通常是由用户键入的,所以I P对控制连接的服务类型就是“最大限度地减小迟延”。

2) 每当一个文件在客户与服务器之间传输时,就创建一个数据连接。(其他时间也可以创建,后面我们将说到)。

由于该连接用于传输目的,所以I P对数据连接的服务特点就是“最大限度提高吞吐量”。

2 7 - 1描述了客户与服务器以及它们之间的连接情况从图中可以看出,交互式用户通常不处理在控制连接中转换的命令和应答。这些细节均由两个协议解释器来完成。标有“用户接口”的方框功能是按用户所需提供各种交互界面(全屏幕菜单选择,逐行输入命令,等等),并把它们转换成在控制连接上发送的F T P命令。

类似地,从控制连接上传回的服务器应答也被转换成用户所需的交互格式。

从图中还可以看出,正是这两个协议解释器根据需要激活文件传送功能。

小结

F T P是文件传输的I n t e r n e t标准。与多数其他T C P应用不同,它在客户进程和服务器进程之间使用两个T C P连接—一个控制连接,它一直持续到客户进程与服务器进程之间的会话完成为止;另一个按需可以随时创建和撤消的数据连接。

F T P使用的关于数据连接的连接管理让我们更详细地了解T C P连接管理需求。我们看到T C P在不发出P O RT命令的客户进程上对2 M S L等待状态的作用。

F T P使用NVT ASCII码做跨越控制连接的所有远程登录命令和应答。数据传输的默认方式通常也是NVT ASCII码。我们看到较新的U n i x客户进程会自动发送命令来查看服务器是否是8b i t字节的U n i x主机,并且如果是,那么就使用二进制方式来传输所有文件,那将带来更高的效率。

我们也展示了匿名F T P的一个例子,它是在I n t e r n e t上分发软件的常用形式。

 

28SMTP: 简单邮件传送协议

电子邮件( e - m a i l)无疑是最流行的应用程序。[Caceres et al.1991]说明,所有T C P连接中大约一半是用于简单邮件传送协议SMTP (Simple Mail Transfer Protocol)的(以比特计算为基础,F T P连接传送更多的数据)。[Paxson 1993] 发现,平均每个邮件中包含大约1 5 0 0字节的数据,但有的邮件中包含兆比特的数据,因为有时电子邮件也用于发送文件。

2 8 - 1显示了一个用T C P / I P交换电子邮件的示意图。

用户与用户代理( user agent)打交道,可能会有多个用户代理可供选择。常用的U n i x上的用户代理包括M HBerkeley Mail, ElmM u s h

T C P进行的邮件交换是由报文传送代理M TAMessage Transfer Agent)完成的。最普通的U n i x系统中的M TAS e n d m a i l。用户通常不和M TA打交道,由系统管理员负责设置本地的M TA。通常,用户可以选择它们自己的用户代理。

本章研究在两个M TA之间如何用T C P交换邮件。我们不考虑用户代理的运行或实现。

RFC 821 [Postel 1982] 规范了S M T P协议,指定了在一个简单T C P连接上,两个M TA如何进行通信。RFC 822 [Crocker 1982] 指定了在两个M TA之间用RFC 821 发送的电子邮件报文的格式。

SMTP协议

两个M TA之间用NVT ASCII进行通信。客户向服务器发出命令,服务器用数字应答码和可选的人可读字符串进行响应。这与上一章的F T P类似。

客户只能向服务器发送很少的命令:不到1 2个(相比较而言, F T P超过4 0个)。我们用简单的例子说明发送邮件的工作过程,并不仔细描述每个命令。

小结

电子邮件包括在两端(发送方和接收方)都有的一个用户代理以及两个或多个报文传送代理。可以把一个邮件报文分成三个部分:信封、首部和正文。我们已经看到这三个部分用S M T PI n t e r n e t标准是如何进行交换的。所有都作为NVT ASCII字符进行交换。

我们也看到了一些新的扩充:用于信封和非A S C I I首部的扩充S M T P,以及使用M I M E的正文增加了结构。M I M E的结构和编码允许使用已有的7bit SMTP MTA交换任意二进制数据。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值