TCP/IP详解

1 概述


以太网数据帧的物理特性是其长度必须在4 6~1 5 0 0字节之间。

U D P数据与T C P数据基本一致。唯一的不同是U D P传给I P的信息单元称作U D P数据报(UDP datagram),而且U D P的首部长为8字节。

由于T C P、U D P、I C M P和I G M P都要向I P传送数据,因此I P必须在生成的I P首部中加入某种标识,以表明数据属于哪一层。为此, I P在首部中存入一个长度为8 b i t的数值,称作协议域。1表示为I C M P协议, 2表示为I G M P协议, 6表示为T C P协议, 1 7表示为U D P协议。

类似地,许多应用程序都可以使用T C P或U D P来传送数据。运输层协议在生成报文首部时要存入一个应用程序的标识符。T C P和U D P都用一个1 6 b i t的端口号来表示不同的应用程序。T C P和U D P把源端口号和目的端口号分别存入报文首部中。

网络接口分别要发送和接收I P、A R P和R A R P数据,因此也必须在以太网的帧首部中加入某种形式的标识,以指明生成数据的网络层协议。为此,以太网的帧首部也有一个16 bit的帧类型域。
一般来说, T C P服务器是并发的,而U D P服务器是重复的。

知名端口号介于1~1023之间。大多数T C P / I P实现给临时端口分配1 0 2 4~5 0 0 0之间的端口号。大于5 0 0 0的端口号是为其他服务器预留的( I n t e r n e t上并不常用的服务)。

常见的知名端口:

FTP(TCP,UDP) 21

TELNET             23

TFTP(UDP)       69



2 链路层

在第3章和第1 7章中,我们将看到I P首部和T C P首部及其数据始终都有校验和。在第11章中,将看到U D P首部及其数据的检验和却是可选的。

以太网的链路层对IP segment或RAP datagram或RARP datagram进行封装。头部加了14字节,尾部加入4个字节。头部14个字节包括:目的主机的硬件地址(6个字节),源头、主机的硬件地址(6个字节),用来指明数据类型的2个字节(是IP数据还是ARP数据还是RARP数据)。尾部的4个字节是CRC校验。

SLIP跟串口通信差不多,仅仅是对IP数据前面和后面加了个END。

A类网络号1 2 7就是为环回接口预留的。根据惯例,大多数系统把I P地址1 2 7 . 0 . 0 . 1分配给这个接口,并命名为l o c a l h o s t。一个传给环回接口的I P数据报不能在任何网络上出现。

MTU:以太网和8 0 2 . 3对数据帧的长度都有一个限制,其最大值分别是1 5 0 0和1 4 9 2字节。链路层的这个特性称作M T U,最大传输单元。不同类型的网络大多数都有一个上限。

如果I P层有一个数据报要传,而且数据的长度比链路层的M T U还大,那么I P层就需要进行分片( f r a g m e n t a t i o n),把数据报分成若干片,这样每一片都小于M T U。

当在同一个网络上的两台主机互相进行通信时,该网络的M T U是非常重要的。但是如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的M T U。重要的不是两台主机所在网络的M T U的值,重要的是两台通信主机路径中的最小M T U。它被称作路径M T U。

两台主机之间的路径M T U不一定是个常数。它取决于当时所选择的路由。而选路不一定是对称的(从A到B的路由可能与从B到A的路由不同),因此路径M T U在两个方向上不一定是一致的。


3 IP:网际协议

首部检验和字段是根据I P首部计算的检验和码。它不对首部后面的数据进行计算。I C M P、I G M P、U D P和T C P在它们各自的首部中均含有同时覆盖首部和数据检验和码。

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



5 RARP:逆地址解析协议

对应于A R P,R A R P请求以广播方式传送,而R A R P应答一般是单播( u n i c a s t )传送的。

在第3行中,我们可以看到,一旦s u n收到I P地址,它就发送一个T F T P读请求( R R Q)给文件8 C F C 0 D 2 1 . S U N 4 C。

R A R P服务器的复杂性在于,服务器一般要为多个主机(网络上所有的无盘系统)提供硬件地址到I P地址的映射。该映射包含在一个磁盘文件中(在U n i x系统中一般位于/ e t c / e t h e r s目录中)。由于内核一般不读取和分析磁盘文件,因此R A R P服务器的功能就由用户进程来提供,而不是作为内核的T C P / I P实现的一部分。

由于发送和接收这些数据帧与系统有关,因此R A R P服务器的实现是与系统捆绑在一起的。


6 ICMP:Internet控制报文协议

下面各种情况都不会导致产生I C M P差错报文:
1) ICMP差错报文(但是,I C M P查询报文可能会产生I C M P差错报文)。
2) 目的地址是广播地址(见图3 - 9)或多播地址(D类地址,见图1 - 5)的I P数据报。
3) 作为链路层广播的数据报。
4) 不是I P分片的第一片(将在11 . 5节介绍分片)。
5) 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。

这些规则是为了防止过去允许I C M P差错报文对广播分组响应所带来的广播风暴。

I C M P地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。

I C M P的一个规则是, I C M P差错报文(参见图6 - 3的最后一列)必须包括生成该差错报文的数据报I P首部(包含任何选项),还必须至少包括跟在该I P首部后面的前8个字节。

当I C M P报文返回时,为什么T F T P客户程序还要继续重发请求呢?这是由于网络编程中的一个因素,即B S D系统不把从插口( s o c k e t )接收到的I C M P报文中的U D P数据通知用户进程,除非该进程已经发送了一个c o n n e c t命令给该插口。


7 Ping程序

当路由器(根据定义应该是多穴的)在清单中记录I P地址时,它应该记录哪个地址呢?是入口地址还是出口地址?为此, RFC 791 [Postel 1981a]指定路由器记录出口I P地址。当原始主机(运行p i n g程序的主机)收到带有R R选项的I C M P回显应答时,它也要把它的入口I P地址放入清单中。

利用Ping程序可以实现:IP的记录路由选项和IP时间戳选项。


8 Traceroute程序

尽管不能保证从源端发往目的端的两份连续的I P数据报具有相同的路由,但是大多数情况下是这样的。

When a router gets an IP datagram whose TTL is either 0 or 1 it must not forward the datagram. (A destination host that receives a datagram like this can deliver it to the application, since the datagram does not have to be routed. Normally, however, no system should receive a datagram with a TTL of 0.) Instead the router throws away the datagramand sends back to the originating host an ICMP "time exceeded" message. The key to Traceroute is that the IP datagram containing this ICMP message has the router's IP address as the source address.

第三,返回的I C M P报文中的信源I P地址是U D P数据报到达的路由器接口的I P地址。这与I P记录路由选项( 7 . 3节)不同,记录的I P地址指的是发送接口地址。

源站选路(source routing)的思想是由发送者指定路由。它可以采用以下两种形式:
• 严格的源路由选择。发送端指明I P数据报所必须采用的确切路由。如果一个路由器发现源路由所指定的下一个路由器不在其直接连接的网络上,那么它就返回一个“源站路
由失败”的I C M P差错报文。
• 宽松的源站选路。发送端指明了一个数据报经过的I P地址清单,但是数据报在清单上指明的任意两个地址之间可以通过其他路由器。

Tr a c e r o u t e程序提供了一个查看源站选路的方法,我们可以在选项中指明源站路由,然后检查其运行情况。


9 IP选路

在本章中,我们主要的目的是了解单个I P层如何作出路由决策。

在3 . 3节中,我们列出了I P搜索路由表的几个步骤:
1) 搜索匹配的主机地址;
2) 搜索匹配的网络地址;
3) 搜索默认表项(默认表项一般在路由表中被指定为一个网络表项,其网络号为0)。
匹配主机地址步骤始终发生在匹配网络地址步骤之前。

I P层进行的选路实际上是一种选路机制,它搜索路由表并决定向哪个网络接口发送分组。这区别于选路策略,它只是一组决定把哪些路由放入路由表的规则。I P执行选路机制,而路由守护程序则一般提供选路策略。

对于一个给定的路由器,可以打印出五种不同的标志( f l a g):
U 该路由可以使用。
G 该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地是直接相连的。
H 该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号,或者网
络号与子网号的组合。
D 该路由是由重定向报文创建的( 9 . 5节)。
M 该路由已被重定向报文修改( 9 . 5节)

标志G是非常重要的,因为由它区分了间接路由和直接路由(对于直接路由来说是不设置标志G的)。其区别在于,发往直接路由的分组中不但具有指明目的端的I P地址,还具有其链路层地址(见图3 - 3)。当分组被发往一个间接路由时, I P地址指明的是最终的目的地,但是链路层地址指明的是网关(即下一站路由器)。

理解G和H标志之间的区别是很重要的。G标志区分了直接路由和间接路由,如上所述。但是H标志表明,目的地址( n e t s t a t命令输出第一行)是一个完整的主机地址。没有设置H标志说明目的地址是一个网络地址(主机号部分为0)。当为某个目的I P地址搜索路由表时,主机地址项必须与目的地址完全匹配,而网络地址项只需要匹配目的地址的网络号和子网号就可以了。

当I P数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送I C M P重定向差错报文给I P数据报的发送端。重定向一般用来让具有很少选路信息的主机逐渐建立更完善的路由表。

关于I C M P重定向报文有很多规则。首先,重定向报文只能由路由器生成,而不能由主机生成。另外,重定向报文是为主机而不是为路由器使用的。

一般认为,主机在引导以后要广播或多播传送一份路由器请求报文。一台或更多台路由器响应一份路由器通告报文。另外,路由器定期地广播或多播传送它们的路由器通告报文,允许每个正在监听的主机相应地更新它们的路由表。

当路由器启动时,它定期在所有广播或多播传送接口上发送通告报文。准确地说,这些通告报文不是定期发送的,而是随机传送的,以减小与子网上其他路由器发生冲突的概率。一般每两次通告间隔4 5 0秒和6 0 0秒。一份给定的通告报文默认生命周期是3 0分钟。

除了定期发送主动提供的通告报文以外,路由器还要监听来自主机的请求报文,并发送路由器通告报文以响应这些请求报文。
如果子网上有多台路由器,由系统管理员为每个路由器设置优先等级。例如,主默认路由器就要比备份路由器具有更高的优先级。

路由器发现报文一般由用户进程(守护程序)创建和处理。

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


10 动态选路协议

当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路。路由器之间必须采用选路协议进行通信,这样的选路协议有很多种。路由器上有一个进程称为路由守护程序( routing daemon),它运行选路协议,并与其相邻的一些路由器进行通信。正如图9 - 1所示,路由守护程序根据它从相邻路由器接收到的信息,更新内核中的路由表。

动态选路并不改变我们在9 . 2节中所描述的内核在I P层的选路方式。这种选路方式称为选路机制( routing mechanism)。内核搜索路由表,查找主机路由、网络路由以及默认路由的方式并没有改变。仅仅是放置到路由表中的信息改变了—当路由随时间变化时,路由是由路由守护程序动态地增加或删除,而不是来自于自引导程序文件中的r o u t e命令。

每个自治系统可以选择该自治系统中各个路由器之间的选路协议。这种协议我们称之为内部网关协议I G P(Interior Gateway Protocol)或域内选路协议(intradomain routing protocol)。最常用的I G P是选路信息协议R I P。一种新的I G P是开放最短路径优先O S P F(Open Shortest Path First)协议。它意在取代R I P。外部网关协议E G P(Exterier Gateway Protocol)或域内选路协议的分隔选路协议用于不同自治系统之间的路由器。

RIP报文包含中在UDP数据报中。

跳数的最大值是1 5,这意味着R I P只能用在主机间最大跳数值为1 5的A S内。度量为1 6表示到无路由到达该I P地址。


11 UDP:用户数据报协议

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

U D P长度字段指的是U D P首部和U D P数据的字节长度。该字段的最小值为8字节(发送一份0字节的U D P数据报是O K)。这个U D P长度是有冗余的。I P数据报长度指的是数据报全长(图3 - 1),因此U D P数据报长度是全长减去I P首部的长度。

U D P检验和覆盖U D P首部和U D P数据。回想I P首部的检验和,它只覆盖I P的首部—并不覆盖I P数据报中的任何数据。U D P和T C P在首部中都有覆盖它们首部和数据的检验和。U D P的检验和是可选的,而T C P的检验和是必需的。

其次, U D P数据报和T C P段都包含一个1 2字节长的伪首部,它是为了计算检验和而设置的。伪首部包含I P首部一些字段。其目的是让U D P两次检查数据是否已经正确到达目的地。

如果发送端没有计算检验和而接收端检测到检验和有差错,那么U D P数据报就要被悄悄地丢弃。不产生任何差错报文(当I P层检测到I P首部检验和有差错时也这样做)。

把一份I P数据报分片以后,只有到达目的地才进行重新组装。重新组装由目的端的I P层来完成,其目的是使分片和重新组装过程对运输层( T C P和U D P)是透明的,除了某些可能的越级操作外。已经分片过的数据报有可能会再次进行分片(可能不止一次)。I P首部中包含的数据为分片和重新组装提供了足够的信息。

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

即使只丢失一片数据也要重传整个数据报。使用U D P很容易导致I P分片。

IP在分片时,除最后一片外,其他每一片中的数据部分(除I P首部外的其余部分)必须是8字节的整数倍。

另外需要解释几个术语: I P数据报是指I P层端到端的传输单元(在分片之前和重新组装之后),分组是指在I P层和链路层之间传送的数据单元。一个分组可以是一个完整的I P数据报,也可以是I P数据报的一个分片。

发生I C M P不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在I P首部又设置了不分片( D F)的标志比特。

尽管大多数的系统不支持路径M T U发现功能,但可以很容易地修改t r a c e r o u t e程序(第8章),用它来确定路径M T U。要做的是发送分组,并设置“不分片”标志比特。发送的第一个分组的长度正好与出口M T U相等,每次收到I C M P“不能分片”差错时就减小分组的长度。如果路由器发送的I C M P差错报文是新格式,包含出口的M T U,那么就用该M T U值来发送,否则就用下一个最小的M T U值来发送。

理论上,I P数据报的最大长度是6 5 5 3 5字节,这是由I P首部(图3 - 1)1 6比特总长度字段所限制的。去除2 0字节的I P首部和8个字节的U D P首部, U D P数据报中用户数据的最长长度为6 5 5 0 7字节。但是,大多数实现所提供的长度比这个最大值小。


12 广播和多播

Broadcasting and multicasting only apply to UDP, where it makes sense for an application to send a single message to multiple recipients. TCP is a connection-oriented protocol that implies a connection between two hosts (specified by IP addresses) and one process on each host (specified by port numbers).

First, the interface card sees every frame that passes by on the cable and makes a decision whether to receive the frame and deliver it to the device driver.Normally the interface card receives only those frames whose destination address is either the hardware address of the interface or the broadcast address. Additionally, most interfaces can be placed into a promiscuous mode whereby they receive a copy of every frame.Today most interfaces can also be configured to receive frames whose destination address is a multicast address, or some subset of multicast addresses.

广播的硬件地址是ff:ff:ff:ff:ff:ff!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

If the interface card receives the frame, it is passed to the device driver. (One reason the interface card might discard the frame is if the Ethernet checksum is incorrect.) Additional filtering is performed by the device driver. First, the frame type must specify a protocol that is supported (IP, ARP, etc.). Second, additional multicast filtering may be performed, to check whether the host belongs to the addressed multicast group.

The device driver then passes the frame to the next layer, such as IP, if the frame type specifies an IP datagram. IP performs more filtering, based on the source and destination IP addresses, and passes the datagram up to the next layer (such as TCP or UDP) if all is well.

Each time UDP receives a datagram from IP, it performs filtering based on the destination port number, and sometimes the source port number too. If no process is currently using the destination port number, the datagram is discarded and an ICMP port unreachable message is normally generated. (TCP performs similar filtering based on its port numbers.) If the UDP datagram has a checksum error, UDP silently discards it. 

目前,大多数的网卡经过配置都能接收目的地址为多播地址或某些子网多播地址的帧。对于以太网,当地址中最高字节的最低位设置为1时表示该地址是一个多播地址,用十六进制可表示为0 1 : 0 0 : 0 0 : 0 0 : 0 0 : 0 0(以太网广播地址ff : ff : ff : ff : ff : ff可看作是以太网多播地址的特例)。

在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。

一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。

为了指明一个多播地址,任何一个以太网地址的首字节必须是0 1,这意味着与I P多播相对应的以太网地址范围从0 1 : 0 0 : 5 e : 0 0 : 0 0 : 0 0到0 1 : 0 0 : 5 e : 7 f : ff : ff。这种地址分配将使以太网多播地址中的2 3 b i t与I P多播组号对应起来,通过将多播组号中的低位2 3 b i t映射到以太网地址中的低位2 3 b i t实现。由于多播组号中的最高5 bit在映射过程中被忽略,因此每个以太网多播地址对应的多播组是不唯一的。3 2 个不同的多播组号被映射为一个以太网地址。

单个物理网络的多播是简单的。多播进程将目的I P地址指明为多播地址,设备驱动程序将它转换为相应的以太网地址,然后把数据发送出去。这些接收进程必须通知它们的I P层,它们想接收的发往给定多播地址的数据报,并且设备驱动程序必须能够接收这些多播帧。这个过程就是“加入一个多播组”(使用“接收进程”复数形式的原因在于对一确定的多播信息,在同一主机或多个主机上存在多个接收者,这也是为什么要首先使用多播的原因)。当一个主机收到多播数据报时,它必须向属于那个多播组的每个进程均传送一个复制。这和单个进程收到单播U D P数据报的U D P不同。使用多播,一个主机上可能存在多个属于同一多播组的进程。


14 DNS:域名系统

域名系统( D N S)是一种用于T C P / I P应用程序的分布式数据库,它提供主机名字和I P地址之间的转换及有关电子邮件的选路信息。这里提到的分布式是指在I n t e r n e t上的单个站点不能拥有所有的信息。每个站点(如大学中的系、校园、公司或公司中的部门)保留它自己的信息数据库,并运行一个服务器程序供I n t e r n e t上的其他系统(客户程序)查询。D N S提供了允许服务器和客户程序相互通信的协议。

以点“ .”结尾的域名称为绝对域名或完全合格的域名F Q D N(Full Qualified Domain N a m e),例如s u n . t u c . n o a o . e d u .。如果一个域名不以点结尾,则认为该域名是不完全的。

一旦一个区域的授权机构被委派后,由它负责向该区域提供多个名字服务器。当一个新系统加入到一个区域中时,该区域的D N S管理者为该新系统申请一个域名和一个I P地址,并将它们加到名字服务器的数据库中。这就是授权机构存在的必要性。

一个名字服务器负责一个或多个区域。一个区域的管理者必须为该区域提供一个主名字服务器和至少一个辅助名字服务器。主、辅名字服务器必须是独立和冗余的,以便当某个名字服务器发生故障时不会影响该区域的名字服务。

一个独立管理的D N S子树称为一个区域( z o n e )。一个常见的区域是一个二级域,如n o a o . e d u。许多二级域将它们的区域划分成更小的区域。例如,大学可能根据不同的系来划分区域,公司可能根据不同的部门来划分区域。

当一个名字服务器没有请求的信息时,它将如何处理?它必须与其他的名字服务器联系。(这正是D N S的分布特性)。然而,并不是每个名字服务器都知道如何同其他名字服务器联系。相反,每个名字服务器必须知道如何同根的名字服务器联系。1 9 9 3年4月时有8个根名字服务器,所有的主名字服务器都必须知道根服务器的I P地址(这些I P地址在主名字服务器的配置文件中,主服务器必须知道根服务器的I P地址,而不是它们的域名)。根服务器则知道所有二级域中的每个授权名字服务器的名字和位置(即I P地址)。这意味着这样一个反复的过程:正在处理请求的名字服务器与根服务器联系,根服务器告诉它与另一个名字服务器联系。

当名字解析器发出一个查询请求,并且返回响应中的T C(删减标志)比特被设置为1时,它就意味着响应的长度超过了5 1 2个字节,而仅返回前5 1 2个字节。在遇到这种情况时,名字解析器通常使用T C P重发原来的查询请求,它将允许返回的响应超过5 1 2个字节(回想在11 . 1 0节讨论的U D P数据报的最大长度)。既然T C P能将用户的数据流分为一些报文段,它就能用多个报文段来传送任意长度的用户数据。

此外,当一个域的辅助名字服务器在启动时,将从该域的主名字服务器执行区域传送。我们也说过辅助服务器将定时(通常是3小时)向主服务器进行查询以便了解主服务器数据是否发生变动。如果有变动,将执行一次区域传送。区域传送将使用T C P,因为这里传送的数据远比一个查询或响应多得多。


17 TCP:传输控制协议

T C P将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错, T C P将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。

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

我们说T C P缺少选择确认是因为T C P首部中的确认序号表示发方已成功收到字节,但还不包含确认序号所指的字节。当前还无法对数据流中选定的部分进行确认。例如,如果1~1 0 2 4字节已经成功收到,下一报文段中包含序号从2 0 4 9~3 0 7 2的字节,收端并不能确认这个新的报文段。它所能做的就是发回一个确认序号为1 0 2 5的A C K。它也无法对一个报文段进行否认。例如,如果收到包含1 0 2 5~2 0 4 8字节的报文段,但它的检验和错, T C P接收端所能做的就是发回一个确认序号为1 0 2 5的A C K。

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


18 TCP连接的建立与终止

MSS是选项数据,只有在SYN位设置的时候才会有,否则TCP head是不包括MSS。

最大报文段长度( M S S)表示T C P传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的M S S。

当建立一个连接时,每一方都有用于通告它期望接收的M S S选项(M S S选项只能出现在S Y N报文段中)。

一般说来,如果没有分段发生, M S S还是越大越好(这也并不总是正确,参见图2 4 - 3和图2 4 - 4中的例子)。报文段越大允许每个报文段传送的数据就越多,相对I P和T C P首部有更高的网络利用率。当T C P发送一个S Y N时,或者是因为一个本地应用进程想发起一个连接,或者是因为另一端的主机收到了一个连接请求,它能将M S S值设置为外出接口上的M T U长度减去固定的I P首部和T C P首部长度。对于一个以太网, M S S值可达1 4 6 0字节。使用IEEE 802.3的封装(参见2 . 2节),它的M S S可达1 4 5 2字节。

T I M E WA I T状态也称为2 M S L等待状态。每个具体T C P实现必须选择一个报文段最大生存时间M S L(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。

对一个具体实现所给定的M S L值,处理的原则是:当T C P执行一个主动关闭,并发回最后一个A C K,该连接必须在T I M E WA I T状态停留的时间为2倍的M S L。这样可让T C P再次发送最后的A C K以防这个A C K丢失(另一端超时并重发最后的F I N)。这种2 M S L等待的另一个结果是这个T C P连接在2 M S L等待期间,定义这个连接的插口(客户的I P地址和端口号,服务器的I P地址和端口号)不能再被使用。这个连接只能在2 M S L结束后才能再被使用。

对于来自某个连接的较早替身的迟到报文段, 2 M S L等待可防止将它解释成使用相同插口对的新连接的一部分。但这只有在处于2 M S L等待连接中的主机处于正常工作状态时才有效。如果使用处于2 M S L等待端口的主机出现故障,它会在M S L秒内重新启动,并立即使用故障前仍处于2 M S L的插口对来建立一个新的连接吗?如果是这样,在故障前从这个连接发出而迟到的报文段会被错误地当作属于重启后新连接的报文段。无论如何选择重启后新连接的初始序号,都会发生这种情况。为了防止这种情况,RFC 793指出T C P在重启动后的M S L秒内不能建立任何连接。这就称为平静时间(quiet time)。

对于U D P,当一个数据报到达目的端口时,该端口没在使用,它将产生一个I C M P端口不可达的信息。而T C P则使用复位。

一个同时打开的连接需要交换4个报文段,比正常的三次握手多一个。此外,要注意的是我们没有将任何一端称为客户或服务器,因为每一端既是客户又是服务器。

同时关闭与正常关闭使用的段交换数目相同。两端都同时进入TIME_WAIT状态。

另外,在三个使用端口2 3的进程中,只有处于L I S T E N的进程能够接收新的连接请求。处于E S TA B L I S H E D的进程将不能接收S Y N报文段,而处于L I S T E N的进程将不能接收数据报文段。


19 TCP的交互数据流

通常T C P在接收到数据时并不立即发送A C K;相反,它推迟发送,以便将A C K与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带A C K)。绝大多数实现采用的时延为200 ms,也就是说,T C P将以最大200 ms 的时延等待是否有数据一起发送。

Nagle算法要求一个T C P连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反, T C P收集这些少量的分组,并在确认到来时以一个分组的方式发出去。该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。


20 TCP的成块数据流

本章我们将介绍T C P所使用的被称为滑动窗口协议的另一种形式的流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。

使用T C P的滑动窗口协议时,接收方不必确认每一个收到的分组。在T C P中,A C K是累积的—它们表示接收方已经正确收到了一直到确认序号减1的所有字节。

发送方使用PUSH标志通知接收方将所收到的数据全部提交给接收进程。这里的数据包括与P U S H一起传送的数据以及接收方T C P已经为接收进程收到的其他数据。

当服务器的T C P接收到一个设置了P U S H标志的报文段时,它需要立即将这些数据递交给服务器进程而不能等待判断是否还会有额外的数据到达。

然而,目前大多数的A P I没有向应用程序提供通知其T C P设置P U S H标志的方法。的确,许多实现程序认为P U S H标志已经过时,一个好的T C P实现能够自行决定何时设置这个标志。如果待发送数据将清空发送缓存,则大多数的源于伯克利的实现能够自动设置P U S H标志。

迄今为止,在本章所有的例子中,发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。但是如果在发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。一些中间路由器必须缓存分组,并有可能耗尽存储器的空间。

慢启动为发送方的T C P增加了另一个窗口:拥塞窗口(congestion window),记为c w n d。当与另一个网络的主机建立T C P连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个A C K,拥塞窗口就增加一个报文段( c w n d以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。


21 TCP的超时与重传

T C P超时与重传中最重要的部分就是对一个给定连接的往返时间( RT T)的测量。由于路由器和网络流量均会变化,因此我们认为这个时间可能经常会发生变化, T C P应该跟踪这些变化并相应地改变其超时时间。

首先T C P必须测量在发送一个带有特别序号的字节和接收到包含该字节的确认之间的RT T。

当一个超时和重传发生时,在重传数据的确认最后到达之前,不能更新RT T估计器,因为我们并不知道A C K对应哪次传输(也许第一次传输被延迟而并没有被丢弃,也有可能第一次传输的A C K被延迟)。

在发送一个报文段时,如果给定连接的定时器已经被使用,则该报文段不被计时。

源于伯克利的T C P实现对收到的重复A C K进行计数,当收到第3个时,就假定一个报文段已经丢失并重传自那个序号起的一个报文段。这就是J a c o b s o n的快速重传算法,该算法通常与他的快速恢复算法一起配合使用。

拥塞避免算法假定由于分组受到损坏引起的丢失是非常少的(远小于1 %),因此分组丢失就意味着在源主机和目的主机之间的某处网络上发生了拥塞。有两种分组丢失的指示:发生超时和接收到重复的确认。

拥塞避免算法和慢启动算法是两个目的不同、独立的算法。但是当拥塞发生时,我们希望降低分组进入网络的传输速率,于是可以调用慢启动来作到这一点。在实际中这两个算法通常在一起实现。

拥塞避免算法和慢启动算法需要对每个连接维持两个变量:一个拥塞窗口c w n d和一个慢启动门限s s t h re s h。

拥塞避免算法要求每次收到一个确认时将c w n d增加1 /c w n d。与慢启动的指数增加比起来,这是一种加性增长(additive increase)。我们希望在一个往返时间内最多为c w n d增加1个报文段(不管在这个RT T中收到了多少个A C K),然而慢启动将根据这个往返时间中所收到的确认的个数增加c w n d。

由于我们不知道一个重复的A C K是由一个丢失的报文段引起的,还是由于仅仅出现了几个报文段的重新排序,因此我们等待少量重复的A C K到来。假如这只是一些报文段的重新排序,则在重新排序的报文段被处理并产生一个新的A C K之前,只可能产生1 ~ 2个重复的A C K。如果一连串收到3个或3个以上的重复A C K,就非常可能是一个报文段丢失了(我们在2 1 . 5节中见到过这种现象)。于是我们就重传丢失的数据报文段,而无需等待超时定时器溢出。这就是快速重传算法。接下来执行的不是慢启动算法而是拥塞避免算法。这就是快速恢复算法。



22 TCP的坚持定时器

如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据(因为它已经向发送方通告了一个非0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器(persist timer)来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查( w i n d o w p r o b e )。

在报文段1 3中,服务器确认了前面4个数据报文段,然后通告窗口为0,从而使客户停止发送任何其他的数据。这就引起客户设置其坚持定时器。如果在该定时器时间到时客户还没有接收到一个窗口更新,它就探查这个空的窗口以决定窗口更新是否丢失。由于服务器进程处于休眠状态,所以T C P缓存9 2 1 6字节的数据并等待应用进程读取。

坚持状态与第2 1章中介绍的重传超时之间一个不同的特点就是T C P从不放弃发送窗口探查。这些探查每隔6 0秒发送一次,这个过程将持续到或者窗口被打开,或者应用进程使用的连接被终止。

糊涂窗口综合症现象可发生在两端中的任何一端:接收方可以通告一个小的窗口(而不是一直等到有大的窗口时才通告),而发送方也可以发送少量的数据(而不是等待其他的数据以便发送一个大的报文段)。可以在任何一端采取措施避免出现糊涂窗口综合症的现象。

1) 接收方不通告小窗口。通常的算法是接收方不通告一个比当前窗口大的窗口(可以为0),除非窗口可以增加一个报文段大小(也就是将要接收的M S S)或者可以增加接收方缓存空间的一半,不论实际有多少。
2) 发送方避免出现糊涂窗口综合症的措施是只有以下条件之一满足时才发送数据: ( a )可以发送一个满长度的报文段; ( b )可以发送至少是接收方通告窗口大小一半的报文段; ( c )可以发送任何数据并且不希望接收A C K(也就是说,我们没有还未被确认的数据)或者该连接上不能使用N a g l e算法(见第1 9 . 4节)。

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


23 TCP的保活定时器

保活并不是T C P规范中的一部分。

如果一个给定的连接在两个小时之内没有任何动作,则服务器就向客户发送一个探查报文段(我们将在随后的例子中看到这个探查报文段看起来像什么)。客户主机必须处于以下4个状态之一。
1) 客户主机依然正常运行,并从服务器可达。客户的T C P响应正常,而服务器也知道对方是正常工作的。服务器在两小时以后将保活定时器复位。如果在两个小时定时器到时间之前有应用程序的通信量通过此连接,则定时器在交换数据后的未来2小时再复位。
2) 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的T C P都没有响应。服务器将不能够收到对探查的响应,并在7 5秒后超时。服务器总共发送1 0个这样的探查,每个间隔7 5秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
3) 客户主机崩溃并已经重新启动。这时服务器将收到一个对其保活探查的响应,但是这个响应是一个复位,使得服务器终止这个连接。
4) 客户主机正常运行,但是从服务器不可达。这与状态2相同,因为T C P不能够区分状态4与状态2之间的区别,它所能发现的就是没有收到探查的响应。

服务器不用关注客户主机被关闭和重新启动的情况(这指的是一个操作员的关闭,而不是主机崩溃)。当系统被操作员关闭时,所有的应用进程也被终止(也就是客户进程),这会使客户的T C P在连接上发出一个F I N。接收到F I N将使服务器的T C P向服务器进程报告文件结束,使服务器可以检测到这个情况。
在第1种情况下,服务器的应用程序没有感觉到保活探查的发生。T C P层负责一切。这个过程对应用程序都是透明的,直至第2、3或4种情况发生。在这三种情况下,服务器应用程序将收到来自它的T C P的差错报告。



TCP和UDP的接收端如果发现校验和错误,会丢弃该datagram,且不返回任何错误报告,TCP也不会发送该数据表的确认信息,希望发送端发生超时并重新发送。

UDP的接收端如果发现端口不存在,会返回一个端口不可到达的ICMP错误数据,而TCP会设置RST位,使对方reset。

如果接收方通告窗口为0,然后没有发送通告窗口更新,发送方会在坚持定时器的节拍下发送窗口探查,询问对方窗口是否有变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值