运输层是整个网络体系结构中的关键层次之一。一定要弄清以下重要概念:
(1) 用户数据报协议 UDP (User Datagram Protocol) [RFC 768]
(2) 传输控制协议 TCP (Transmission Control Protocol) [RFC 793]
按照 OSI 的术语,两个对等运输实体在通信时传送的数据单元叫做运输协议数据单元 TPDU (Transport Protocol Data Unit)。但在 TCP/IP 体系中,则根据所使用的协议是 TCP 或 UDP,分别称之为 TCP 报文段 (segment) 或 UDP 用户数据报。
UDP 的主要特点:
如果接收方 UDP 发现收到的报文中的目的端口号不正确,就丢弃该报文,并由 ICMP 协议发送“端口不可达”差错报文给发送发。
在计算检验和时,要在 UDP 用户数据报之前增加 12 个字节的伪首部。这种伪首部不是 UDP 用户数据报真正的首部。只是在计算检验和时,临时添加在 UDP 用户数据报前面,得到一个临时的 UDP 用户数据报。检验和是按照这个临时的 UDP 用户数据报来计算的。伪首部既不向下传送也不向上递交,仅仅是为了计算检验和。
UDP 计算检验和的方法和计算 IP 数据报首部检验和的方法相似。不同的是:UDP 的检验和是把首部和数据部分一起都检验。
这种简单的差错检验方法的检错能力并不强,但它的好处是简单,处理起来较快。
★ \bigstar ★ 5-01 试说明运输层在协议栈中的地位和作用。运输层的通信和网络层的通信有什么重要的区别?为什么运输层是必不可少的?
从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
两台主机进行通信是两台主机中的应用进程互相通信。IP 协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付主机中的应用进程。从运输层的角度看,通信的真正端点并不是主机而是主机中的进程。也就是说,端到端的通信是应用进程之间的通信。
运输层提供应用进程间的逻辑通信。“逻辑通信”的意思是:从应用层来看,只要把应用层报文交给下面的运输层,运输层就可以把这报文传送到对方的运输层,好像这种通信就是沿着水平方向直接传送数据。但事实上这两个运输层之间并没有一条水平方向的物理连接。
网络层为主机之间提供逻辑通信,运输层为应用进程之间提供端到端的逻辑通信。运输层还具有网络层无法代替的许多其他重要功能。
运输层还要对收到的报文进行差错检测。
运输层向高层用户屏蔽了下面网络核心的细节 (如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道,但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别。
当运输层采用面向连接的 TCP 协议时,尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于一条全双工的可靠信道。
当运输层采用无连接的 UDP 协议时,这种逻辑通信信道仍然是一条不可靠信道。
5-02 网络层提供数据报或虚电路服务对上面的运输层有何影响?
虚电路服务的思路是:可靠通信应当由网络来保证。它规定属于同一条虚电路的分组按照同一路由进行转发,而且转发的方式总是按发送顺序以此到达终点。虽然这样做会使得中间的网络造价比端点造价高,但这样能基本保证报文无差错、不丢失、不重复且按序地进行交付,因而运输协议就可以很简单。
数据报服务的思路是:可靠通信由用户主机来保证。它对运输层只提供简单灵活,无连接的,尽最大努力交付的数据报服务,没有服务质量的承诺。因此,若要保证通信的质量,要求主机有一个复杂的运输协议,这个协议就交由运输层。
5-03 当应用程序使用面向连接的 TCP 和无连接的 IP 时,这种传输是面向连接的还是无连接的?
解:都是。这要在不同层次来看。在运输层是面向连接的,在网络层是无连接的。
5-04 试画图解释运输层的复用。画图说明许多个运输用户复用到一条运输连接上,而这条运输连接又复用到 IP 数据报上。
在一台主机中经常有多个应用进程分别和另一台主机中的多个应用进程通信。
在图 5-1 中,主机 A 的应用进程 AP1 和 主机 B 的应用进程 AP3 通信,而与此同时,AP2 也和对方的 AP4 通信。这表明运输层有一个很重要的功能——复用 (multiplexing) 和分用 (demultiplexing)。
IP 层也有复用和分用的功能。即,在发送方不同协议的数据都可以封装成 IP 数据报发送出去,而在接收方的 IP 层根据 IP 首部中的协议字段进行分用,把剥去首部后的数据交付应当接收这些数据的协议。
5-05 试举例说明有些应用程序愿意采用不可靠的 UDP,而不愿意采用可靠的 TCP。
很多的实时应用 (如 IP 电话、实时视频会议等) 要求源主机以恒定的速率发送数据,并且允许在网络发送拥塞时丢失一些数据,但却不允许数据有太大的时延。UDP 正好适合这种要求。
一些使用 UDP 的实时应用,需要对 UDP 的不可靠的传输进行适当的改进,以减少数据的丢失。在这种情况下,应用进程本身可以在不影响应用的实时性的前提下,增加一些提高可靠性的措施,如采用前向纠错或重传已丢失的报文。
5-06 接收方收到有差错的 UDP 用户数据报时应如何处理?
解:丢弃。
5-07 如果应用程序愿意使用 UDP 完成可靠传输,这可能吗?请说明理由。
解:可能。可靠传输并不一定需要运输层实现,当运输层使用 UDP 协议进行传输时,传输的可靠性可由应用层相关协议来保证。
5-08 为什么说 UDP 是面向报文的,而 TCP 是面向字节流的?
UDP 是面向报文的。发送发的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。UDP 一次交付一个完整的报文。
TCP 面向字节流。虽然应用程序和 TCP 的交互是一次一个数据块 (大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
★ \bigstar ★ 5-09 端口的作用是什么?为什么端口号要划分为三种?
为了使运行不同操作系统的计算机的应用进程能够互相通信,必须用统一的方法对 TCP/IP 体系的应用进程进行标志。另外,我们往往需要利用目的主机提供的功能来识别终点,而不需要知道具体实现这个功能的进程是哪一个。
解决这个问题的方法是在运输层使用协议端口号 (protocol port number),或简称为端口 (port)。这就是说,虽然通信的终点是应用进程,但只要把所传送的报文交到目的主机的某个合适的目的端口,剩下的工作就由 TCP 或 UDP 来完成。
这种在协议栈层间的抽象的协议端口是软件端口,和路由器或交换机上的硬件端口是完全不同的概念。硬件端口是不同硬件设备进行交互的接口,软件端口是应用层的各种协议进程域运输实体进行层间交互的一种地址。
TCP/IP 的运输层用一个 16 位端口号来标志一个端口。注意,端口号只具有本地意义,它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。在互联网不同计算机中,相同的端口号是没有关联的。
互联网上的计算机通信是采用客户-服务器方式。客户在发起通信请求时,必须先知道对方服务器的 IP 地址和端口号。
运输层的端口号分为两大类。
(1) 服务器端使用的端口号。这又分为两类:
(2) 客户端使用的端口号。数值为 49152~65535。由于这类端口号仅在客户进程运行时才动态选择,因此又叫做短暂端口号。这类端口号留给客户进程选择暂时使用。通信结束后,刚才已使用过的客户端口号就不复存在,这个端口号可供其他客户进程使用。
5-10 试说明运输层伪首部的作用。
解:计算检验和。
5-11 某个应用进程使用运输层的用户数据报 UDP,然后继续向下交给 IP 层后,又封装成 IP 数据报。既然都是数据报,是否可以跳过 UDP 而直接交给 IP 层?哪些功能 UDP 提供了但 IP 没有提供?
解:不能。IP 数据报只能找到目的主机而无法找到目的进程。
UDP 提供对应用进程的复用和分用功能,并提供对数据部分的差错检验。
5-12 一个应用程序用 UDP,到了 IP 层把数据报再划分为 4 个数据报片发送出去。结果前两个数据报片丢失,后两个到达目的站。过了一段时间应用程序重传 UDP,而 IP 层仍然划分为 4 个数据报片来传送。结果这次前两个到达目的站而后两个丢失。试问:在目的站能否将这两次传输的 4 个数据报片组装成为完整的数据报?假定目的站第一次收到的后两个数据报片仍然保存在目的站的缓存中。
解:不行。重传时,IP 数据报的标识字段会有另一个标识符。标识符相同的 IP 数据报片才能组装成一个 IP 数据报。前两个 IP 数据报片的标识符与后两个 IP 数据报片的标识符不同,因此不能组装成一个 IP 数据报。
5-13 一个 UDP 用户数据报的数据字段为 8192 字节。在链路层要使用以太网来传送。试问应当划分为几个 IP 数据报片?说明每一个 IP 数据报片的数据字段长度和片偏移字段的值。
解:一个 UDP 用户数据报的首部是 8 个字节。故 IP 数据报的数据字段长度为 8200 个字节。
以太网帧的数据字段长度最长为 1500 字节。IP 数据报的固定首部长度为 20 个字节。故 IP 数据报片的数据字段长度最长为 1480 字节。
应当划分为 6 个 IP 数据报片。IP 数据报片的数据字段长度:前 5 个是 1480 字节,最后一个是 800 字节。片偏移字段的值分别是:0,185,370,555,740 和 925。
5-14 一个 UDP 用户数据报的首部的十六进制表示是:06 32 00 45 00 1C E2 17。试求源端口、目的端口、用户数据报的总长度、数据部分长度。这个用户数据报是从客户发送给服务器还是从服务器发送给客户?使用 UDP 的这个服务器程序是什么?
解:源端口号为 0x0632,即 1586。目的端口号为 0x0045,即 69。
用户数据报的总长度为 0x001C,即 28 个字节。其首部长度为 8 个字节。故数据部分长度为 20 个字节。
此 UDP 用户数据报是从客户发给服务器的,因为目的端口号 < 1023,是熟知端口。
从表 5-2 中可知服务器程序是 TFTP。
5-15 使用 TCP 对实时话音数据的传输会有什么问题?使用 UDP 在传送数据文件时会有什么问题?
UDP 不保证可靠交付,但 UDP 比 TCP 的开销要小很多。因此只要应用程序接受这样的服务质量就可以使用 UDP。如果话音数据不是实时播放 (边接收边播放) 就可以使用 TCP,因为 TCP 传输可靠。接收端用 TCP 将话音数据接收完毕后,可以在以后的任何时间进行播放。但假定是实时传输,则必须使用 UDP。
5-49 下面是以十六进制格式存储的一个 UDP 首部:CB84000D001C001C
试问:
(1) 源端口号是什么?
(2) 目的端口号是什么?
(3) 这个用户数据报的总长度是什么?
(4) 数据长度是多少?
(5) 这个分组是从客户到服务器方向的,还是从服务器到客户方向的?
(6) 客户进程是什么?
解:(1) 源端口号是 0xCB84,即 52100。
(2) 目的端口号是 0x000D,即 13。
(3) 用户数据报的总长度是 0x001C,即 28 字节。
(4) 首部长度是 8 字节,数据长度是 20 字节。
(5) 目的端口号是熟知端口号,故分组是从客户到服务器方向。
(6) 根据 RFC 1340,知端口号为 13 的服务器程序是 Daytime,所以客户进程是 Daytime。
5-50 把图 5-7 计算 UDP 检验和的例子自己具体演算一下,看是否能够得出书上的计算结果。
二进制反码求和运算:从低位到高位逐列进行计算。0 + 0 = 0;0 + 1 = 1;1 + 1 = 0,产生一个进位 1,加到下一列。若最高位相加后产生进位,则最后得到的结果要加 1。
将 14 行的 16 位数据两行两行地相加 (即二进制反码求和)。
第 1 行和第 2 行相加,得 10100001 01111011。
再和第 3 行相加,得 1 01001100 011111110。注意,最左边 (最高位) 的 1 是进位得到的 1,这要和最低位相加。因此和第 3 行相加后,得 01001100 01111111。最低位的 1 就是由最高位的进位得到的。这叫做 “回卷”。
再将 01001100 01111111 和第 4 行相加,依次继续。
UDP 用户数据报传送到接收端后,再进行检验和计算。这就是把收到的 UDP 用户数据报连同伪首部 (以及可能的填充全零字节) 一起,按二进制反码求这些 16 位字的和。当无差错时其结果应当全 1。否则就表明有差错出现,接收方就应丢弃这个 UDP 用户数据报 (也可以上交应用层,但附上出现差错的警告)。
5-51 在以下几种情况下,UDP 的检验和在发送时数值分别是多少?
(1) 发送方决定不使用检验和。
(2) 发送方使用检验和,检验和的数值是全 1。
(3) 发送方使用检验和,检验和的数值是全 0。
解:(1) 置为全 0。
UDP 规定,UDP 的上层用户可以关闭检验和的计算 (即在 UDP 的传送过程中,不使用检验和这个检错功能)。这样做的好处是可以提高 UDP 的传送速度 (但要牺牲一些可靠性)。如果发送方决定不使用检验和,那么发送方的检验和的值应当置为全 0。这表示这个数值不是计算出来的,而是发送方关闭了检验和这个功能。
(2) 全 0。
(3) 全 1。
如果发送方使用检验和,但检验和的数值是全 1,表明得出这个结果的前一个步骤 (即二进制反码求和) 的结果是全 0。
在什么情况下,伪首部和整个 UDP 按 16 位字进行二进制反码求和的结果是全 0?这就是伪首部和整个 UDP 的所有字段都是 0。但很明显,这是不可能的。
两个 1 相加按二进制反码求和的结果是 1 0。这里的 1 是进位。因此按照计算检验和的规矩来计算,对真实的 UDP 用户数据报不可能得出检验和的数值是全 1。
但是,计算检验和时的倒数第二步,即按二进制反码求和的结果却有可能是全 1。在这种情况下,最后一步求反码,就会得出检验和是全 0。
但是前面已经讲过,检验和置为全 0 是表示发送方不使用检验和。这样就产生了疑问:如果检验和是全 0,是发送方不使用检验和?还是使用了检验和但检验和的结果碰巧全是 0?无法确定。
于是 UDP 协议就规定:如果计算检验和的结果刚好是全 0,那么就把它人为的置为全 1。因为前面已经讲过,全 1 的检验和是不可能由计算出来的。因此接收方一旦收到检验和为全 1 的 UDP 用户数据报,就知道这是人为的,真正地检验和其实是全 0。
发送方使用检验和,检验和的数值是全 0。前面已经讲过,这是不可能的。如果发送方计算出来的检验和是全 0,那也要把它变成全 1 再发送出去。
5-52 UDP 和 IP 的不可靠程度是否相同?请加以解释。
解:不相同。
UDP 用户数据报的检验和既检验 UDP 用户数据报的首部又检验整个的 UDP 用户数据报的数据部分,而 IP 数据报的检验和仅仅检验 IP 数据报的首部。
UDP 用户数据报的检验和还增加了伪首部,即还检验了下面的 IP 数据报的源 IP 地址和目的 IP 地址。
5-53 UDP 用户数据报的最小长度是多少?用最小长度的 UDP 用户数据报构成的最短 IP 数据报的长度是多少?
解:UDP 用户数据报的首部长度是 8 字节,故 UDP 的最小长度是 8 字节。
IP 数据报的固定首部长度是 20 字节,故最短 IP 数据报的长度是 28 字节。
5-54 某客户使用 UDP 将数据发送给一服务器,数据共 16 字节。试计算在运输层的传输效率 (有用字节与总字节之比)。
解:UDP 首部长度是 8 字节,总长度是 24 字节。
传输效率是 16 / 24 = 0.667。
5-55 重做习题 5-54,但在 IP 层计算传输效率。假定 IP 首部无选项。
解:IP 固定首部长度是 20 字节,IP 数据报总长度是 44 字节。
传输效率为 16 / 44 = 0.364。
5-56 重做习题 5-54,但在数据链路层计算传输效率。假定 IP 首部无选项,在数据链路层使用以太网。
解:MAC帧首部有 14 字节,尾部有 4 字节。加上数据部分 44 字节,一共有 62 字节。但以太网所容许的最短的帧长度为 64 字节,所以需要加上 2 字节填充。
传输效率为 16 / 64 = 0.25。
如果考虑 MAC 帧的前同步码的 8 字节,传输效率为 16 / 72 = 0.222。
5-57 某客户有 67000 字节的分组。试说明怎样使用 UDP 用户数据报将这个分组进行传送。
解:UDP 首部中“长度”字段占 2 字节,故一个 UDP 用户数据报的最大长度为 2 16 − 1 2^{16}-1 216−1,即 65535 字节。现在的长度超过了这个限度,因此不能使用一个 UDP 用户数据报来传送。必须进行切割 (例如,分割为两个 UDP 用户数据报),使其长度不超过以上的限度。
【计算机网络 (谢希仁) 习题题解】目录