(★★)代表非常重要的知识点,(★)代表重要的知识点。
运输层是整个网络体系结构中的关键层次之一。一定要弄清以下一些重要概念:
(1) 运输层为相互通信的应用进程提供逻辑通信。
(2) 端口和套接字的意义。
(3) 无连接的 UDP 的特点。
(4) 面向连接的 TCP 的特点。
(5) 在不可靠的网络上实现可靠传输的工作原理,停止等待协议和 ARQ 协议。
(6) TCP 的滑动窗口、流量控制、拥塞控制和连接管理。
一、传输层提供的服务
1. 传输层的功能
数据链路层提供链路上相邻结点之间的逻辑通信,网络层提供主机之间的逻辑通信。传输层位于网络层之上、应用层之下,它为运行在不同主机上的进程之间提供逻辑通信。传输层属于面向通信部分的最高层,同时也是用户功能中的最低层。显然,即使网络层协议不可靠(网络层协议使分组丢失、混乱或重复),传输层同样能为应用程序提供可靠的服务。
逻辑通信是指对等层之间的通信好像是沿水平方向传送的,但两个对等层之间并没有一条水平方向的物理连接。
从下图可看出,网络的边缘部分的两台主机使用网络的核心部分的功能进行端到端的通信时,只有主机的协议栈才有传输层,而路由器在转发分组时都只用到下三层的功能(即在通信子网中没有传输层,传输层只存在于通信子网以外的主机中)。
传输层的功能如下:
1)应用进程之间的逻辑通信
下面通过上图的示意图来说明运输层的作用。设局域网 LAN1 上的主机 A 和局域网 LAN2 上的主机 B 通过互连的广域网 WAN 进行通信。我们知道,IP 协议能够把源主机 A 发送出的分组,按照首部中的目的地址,送交到目的主机 B , 那么,为什么还需要运输层呢?
从 IP 层来说,通信的两端是两台主机。IP 数据报的首部明确地标志了这两台主机的 IP 地址。但"两台主机之间的通信"这种说法还不够清楚。这是因为,真正进行通信的实体是在主机中的进程,是这台主机中的一个进程和另一台主机中的一个进程在交换数据(即通信)。因此严格地讲,两台主机进行通信就是两台主机中的应用进程互相通信(应用进程之间的通信又称端到端的逻辑通信)。IP 协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层,而没有交付主机中的应用进程。从运输层的角度看,通信的真正端点井不是主机而是主机中的进程。也就是说,端到端的通信是应用进程之间的通信。
2)复用和分用
在一台主机中经常有多个应用进程同时分别和另一台主机中的多个应用进程通信。
例如,某用户在使用浏览器查找某网站的信息时,其主机的应用层运行浏览器客户进程。如果在浏览网页的同时,还要用电子邮件给网站发送反馈意见,那么主机的应用层就还要运行电子邮件的客户进程。在上图中,主机 A 的应用进程 AP~1~ 和主机 B 的应用进程 AP~3~ 通信,而与此同时,应用进程 AP~2~ 也和对方的应用进程 AP~4~ 通信。
这表明运输层有一个很重要的功能------复用(multiplexing)和分用(demultiplexing)。
-
这里的"复用"是指在发送方不同的应用进程都可以使用同一个运输层协议传送数据(当然需要加上适当的首部);
-
而"分用"是指接收方的运输层在剥去报文的首部后能够把这些数据正确交付目的应用进程。
上图中两个运输层之间有一个双向粗箭头,写明"运输层提供应用进程间的逻辑通信"。
"逻辑通信"的意思是:从应用层来看,只要把应用层报文交给下面的运输层,运输层就可以把这报文传送到对方的运输层(哪怕双方相距很远,例如几千公里),好像这种通信就是沿水平方向直接传送数据。但事实上这两个运输层之间井没有一条水平方向的物理连接。数据的传送是沿着图中的虚线方向(经过多个层次)传送的。
【即"逻辑通信"是"好像是这样通信,但事实上并非真的这样通信"。】
【注意】网络层也有复用和分用的功能,但网络层的复用是指发送方不同协议的数据都可被封装成 IP 数据报发送出去,分用是指接收方的网络层在剥去首部后把数据交付给相应的协议。
从这里可以看出网络层和运输层有明显的区别。网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。如下图所示。
3)检错检测
传输层要对收到的报文(首部和数据部分)进行差错检测。对于 TCP 协议,若接收方发现报文段出错,则要求发送方重发该报文段。对于 UDP 协议,若接收方发现数据报出错,则直接丢弃。在网络层,IP 数据报首部中的检验和字段只检验首部是否出错,而不检查数据部分。
4)提供面向连接和无连接的传输协议
面向连接服务是指通信双方在进行通信之前,要先建立一个完整的连接,在通信过程中,整个连接一直可以被实时地监控和管理。通信完毕后释放连接。面向连接的服务可以保证数据的可靠和顺序交付。
传输层向高层用户屏蔽了低层网络核心的细节(如网络拓扑、所采用的路由选择协议等),它使应用进程看见的是在两个传输层实体之间好像有一条端到端的逻辑通信信道,这条逻辑通信信道对上层的表现却因传输层协议不同而有很大的差别。当传输层采用面向连接的 TCP 协议时,尽管下面的网络是不可靠的(只提供尽最大努力的服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。但当传输层采用无连接的 UDP 协议时,这种逻辑通信信道仍然是一条不可靠信道。
而网络层无法同时实现两种协议(即在网络层要么只提供面向连接的服务,如虚电路;要么只提供无连接服务,如数据报,而不可能在网络层同时存在这两种方式)。
2. 传输层的寻址与端口
1)端口的作用
前面已经提到过运输层的复用和分用功能。其实在日常生活中也有很多复用和分用的例子。假定一个机构的所有部门向外单位发出的公文都由收发室负责寄出,这相当于各部门都"复用"这个收发室。当收发室收到从外单位寄来的公文时,则要完成"分用"功能,即按照信封上写明的本机构的部门地址把公文正确进行交付。
传输层的复用和分用功能也是类似的。应用层所有的应用进程都可以通过运输层再传送到 IP 层(网络层),这就是复用。传输层从 IP 层收到发送给各应用进程的数据后,必须分别交付指明的各应用进程,这就是分用。显然,给应用层的每个应用进程赋予一个非常明确的标志是至关重要的。
我们知道,在单个计算机中的进程是用进程标识符(一个不大的整数)来标志的。但是在互联网环境下,用计算机操作系统所指派的这种进程标识符来标志运行在应用层的各种应用进程则是不行的。这是因为在互联网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符。为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法(而这种方法必须与特定操作系统无关)对 TCP/IP 体系的应用进程进行标志。
但是,把一个特定机器上运行的特定进程,指明为互联网上通信的最后终点还是不可行的。这是因为进程的创建和撤销都是动态的,通信的一方几乎无法识别对方机器上的进程。另外,我们往往需要利用目的主机提供的功能来识别终点,而不需要知道具体实现这个功能的进程是哪一个(例如,要和互联网上的某个邮件服务器联系,并不一定要知道这个服务器功能是由目的主机上的哪个进程实现的)。
解决这个问题的方法就是在运输层使用协议端口号(protocol port number),或通常简称为端口(pOrt)。这就是说,虽然通信的终点是应用进程,但只要把所传送的报文交到目的主机的某个合适的目的端口,剩下的工作(即最后交付目的进程)就由 TCP 或 UDP 来完成。
端口能让应用层的各种进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。端口在传输层的作用类似于地址在网络层的作用,只不过 IP 地址标识的是主机,而端口标识的是主机中的应用进程。
数据链路层的服务访问点为帧的"类型"字段,网络层的服务访问点为数据报的"协议"字段,传输层的服务访问点为"端口号"字段,应用层的服务访问点为"用户界面"。
请注意,这种在协议栈层间的抽象的协议端口是软件端口,和路由器或交换机上的硬件端口是完全不同的概念。硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。传输层使用的是软件端口。不同的系统具体实现端口的方法可以是不同的(取决于系统使用的操作系统)。
在后面将讲到的 UDP 和 TCP 的首部格式中,我们将会看到它们都有源端口和目的端口这两个重要字段。当运输层收到 IP 层交上来的运输层报文时,就能够根据其首部中的目的端口号把数据交付应用层的目的应用进程。
2)端口号
应用进程通过端口号进行标识,TCP/IP 的运输层用一个 16 位端口号来标志一个端口。16 位的端口号可允许有 65536(2^16^)个不同的端口号,这个数目对一个计算机来说是足够用的。但请注意,端口号只具有本地意义,它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口,在互联网不同计算机中,相同的端口号是没有关联的。
由此可见,两个计算机中的进程要互相通信,不仅必须知道对方的 IP 地址(为了找到对方的计算机),而且要知道对方的端口号(为了找到对方计算机中的应用进程)。
这和我们寄信的过程类似。当我们要给某人写信时,就必须在信封上写明他的通信地址(这是为了找到他的住所,相当于 IP 地址),并且还要写上收件人的姓名(这是因为在同一住所中可能有好几个人,这相当于端口号)。在信封上还写明自己的地址。当收信人回信时,很容易在信封上找到发信人的地址。互联网上的计算机通信是采用客户-服务器方式。客户在发起通信请求时,必须先知道对方服务器的 IP 地址和端口号。
因此运输层的端口号分为下面的两大类:
- 服务器端使用的端口号。它又分为两类:
I、最重要的一类叫做熟知端口号(well-known port number)或系统端口号,数值为 0 至 1023 。IANA(互联网地址指派机构)把这些端口号指派给了 TCP/IP 最重要的一些应用程序,让所有的用户都知道。当一种新的应用程序出现后, IANA 必须为它指派一个熟知端口,否则互联网上的其他应用进程就无法和它进行通信。下图给出了一些常用的熟知端口号。
II、另一类称为登记端口号,数值为1024 至 49151 。这类端口号是为没有熟知端口号的应用程序使用的,使用这类端口号必须在IANA 按照规定的手续登记,以防止重复。
- 客户端使用的端口号。数值为 49152 至 65535 。由于这类端口号仅在客户进程运行时才动态选择,因此又叫做短暂端口号。这类端口号留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的端口号,因而可以把数据发送给客户进程。通信结束后,刚才已使用过的客户端口号就不复存在,这个端口号就可以供其他客户进程使用。
【总结】熟知端口号的数值为0 至 1023 ,登记端口号的数值是1024 至 49151 ,客户端使用的端口号的数值是 49152 至 65535 。
注:短暂端口(ephemeral port)表示这种端口的存在时间是短期的。客户进程并不在意操作系统给它分配的是哪一个端口号,因为客户进程之所以必须有一个端口号(在本地主机中必须是唯一的),是为了让运输层的实体能够找到自已。这和熟知端口不同。服务器机器一接通电源,服务器程序就运行起来。为了让互联网上所有的客户程序都能找到服务器程序,服务器程序所使用的端口(即熟知端口)就必须是固定的,并且是众所周知的。
3)套接字
在网络中通过 IP 地址来标识和区别不同的主机,通过端口号来标识和区分一台主机中的不同应用进程,端口号拼接到 IP 地址即构成套接字(Socket)。在网络中采用发送方和接收方的套接字来识别端点。套接字,实际上是一个通信端点,即:
套接字(Socket)=( IP地址 : 端口号 )
它唯一地标识网络中的一台主机上的一个应用进程。
在网络通信中,主机 A 发给主机 B 的报文包含目的端口号和源端口号,源端口号是"返回地址"的一部分,即当主机 B 需要发回一个报文给主机 A 时,主机 B 到主机 A 的报文中的目的端口号便是主机 A 到主机 B 的报文中的源端口号(完全的返回地址是主机 A 的 IP 地址和源端口号)。
3. 无连接服务与面向连接服务(关注)
TCP/IP 运输层的两个主要协议都是互联网的正式标准,即:
- 用户数据报协议 UDP(User Datagram Protocol);
- 传输控制协议 TCP(Transmission Control Protocol)。
下图给出了这两种协议在协议栈中的位置:
按照 OSI 的术语,两个对等运输实体在通信时传送的数据单位叫做运输协议数据单元TPDU(Transport Protocol Data Unit) 。但在 TCP/IP 体系中,则根据所使用的协议是 TCP 或 UDP ,分别称之为 TCP 报文段(segment)或 UDP 用户数据报。
若一个协议使用确认机制对传输的数据进行确认,则可以认为它是一个可靠的协议;若一个协议采用"尽力而为"的传输方式,则是不可靠的。例如,TCP 对传输的报文段提供确认,因此是可靠的传输协议;而 UDP 不提供确认,因此是不可靠的传输协议。
TCP/IP 协议族在 IP 层之上使用了两个传输协议:一个是面向连接的传输控制协议(TCP),采用 TCP 时,传输层向上提供的是一条全双工的可靠逻辑信道;另一个是无连接的用户数据报协议(UDP),采用 UDP 时,传输层向上提供的是一条不可靠的逻辑信道。
UDP 提供无连接的不可靠服务,通信双方在传送数据之前不需要建立连接,接收方的传输层在收到 UDP 用户数据报后,无须给发送方发回任何确认。UDP 在 IP 层之上仅提供两个附加服务:多路复用和对数据的错误检查。IP 层知道怎样把分组投递给一台主机,但不知道怎样把它们投递给主机上的具体应用。UDP 在传送数据之前不需要先建立连接,远程主机的传输层收到 UDP 报文后,不需要给出任何确认。因为 UDP 比较简单,所以执行速度比较快、实时性好。使用 UDP 的应用主要包括小文件传送协议(TFTP)、DNS、SNMP 和实时传输协议(RTP)。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 却是一种最有效的工作方式。
TCP 则提供面向连接的服务。通信双方在传送数据之前必须先建立连接,然后基于此连接进行可靠数据传输,数据传送结束后要释放连接。TCP 不提供广播或多播服务。由于 TCP 要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多的开销,如确认、流量控制、计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。因此 TCP 主要适用于可靠性更重要的场合,如:文件传输协议(FTP)、超文本传输协议(HTTP)、远程登录(TELNET)等。
下表所示为一些典型互联网应用所用的 TCP/IP 应用层协议和传输层协议(UDP 或 TCP):
【注意】:
I、IP 数据报和 UDP 数据报的区别: IP 数据报在网络层要经过路由器的存储转发;而 UDP 数据报在传输层的端到端的逻辑信道中传输,封装成 IP 数据报在网络层传输时,UDP 数据报的信息对路由器是不可见的。
II、TCP 和网络层虚电路的区别:TCP 报文段在传输层抽象的逻辑信道中传输,对路由器不可见;虚电路所经过的交换结点都必须保存虚电路状态信息。在网络层若采用虚电路方式,则无法提供无连接服务;而传输层采用 TCP 不影响网络层提供无连接服务。
4. 例题
① 关于 TCP 和 UDP 端口的下列说法中,正确的是( A )。
A. TCP 和 UDP 分别拥有自己的端口号,它们互不干扰,可以共存于同一台主机
B. TCP 和 UDP 分别拥有自己的端口号,但它们不能共存于同一台主机
C. TCP 和 UDP 的端口没有本质区别,但它们不能共存于同一台主机
D. 当一个 TCP 连接建立时,它们互不干扰,不能共存于同一台主机
【端口号只具有本地意义,即端口号只标识本计算机应用层中的各个进程,且同一台计算机中 TCP 和 UDP 分别拥有自己的端口号,它们互不干扰。】
② 以下说法错误的是( B )。
A. 传输层是 OSI 参考模型的第四层
B. 传输层提供的是主机间的点到点数据传输
C. TCP 是面向连接的,UDP 是无连接的
D. TCP 进行流量控制和拥塞控制,而 UDP 既不进行流量控制,又不进行拥塞控制
【TCP 是面向连接的,它提供流量控制和拥塞控制,保证服务可靠;UDP 是无连接的,不提供流量控制和拥塞控制,只能做出尽最大努力的交付。】
③ 某应用程序每秒产生一个 60B 的数据块,每个数据块被封装在一个 TCP 报文中,然后封装在一个 IP 数据报中,则最后每个数据报所包含的应用数据所占的百分比是( C )(注意:TCP 报文和 IP 数据报文的首部没有附加字段。)
A. 20%
B. 40%
C. 60%
D. 80%
【一个 TCP 报文的首部长度是 20B ,一个 IP 数据报的首部长度也是 20B 。】
④ 在 TCP/IP 参考模型中,若用户程序使用 UDP 进行数据传输,则( D )层协议必须承担可靠性方面的全部工作。
A. 数据链路层
B. 网际层
C. 传输层
D. 应用层
二、UDP 协议
传输层协议需要具有的主要功能包括:创建进程到进程的通信;提供流量控制机制。UDP 在一个低的水平上完成以上功能,使用端口号完成进程到进程的通信,但在传送数据时没有流量控制机制,也没有确认,而且只提供有限的差错控制。因此 UDP 是一个无连接、不可靠的传输层协议。若用户应用程序使用 UDP 进行数据传输,则必须在传输层的上层即应用层提供可靠性方面的全部工作。
1. UDP 数据报(★)
1)UDP 概述
UDP 仅在 IP 层的数据报服务之上增加了两个最基本的功能:复用和分用,以及差错检测。
虽然 UDP 协议和 IP 协议都是数据报协议,但是它们之间还是存在差别。其中,最大的差别是 IP 数据报只能找到目的主机而无法找到目的进程,UDP 提供端口功能及复用和分用功能,可以将数据报投递给对应的进程。
若应用开发者选择 UDP 而非 TCP ,则应用程序几乎直接与 IP 打交道。为什么应用开发者宁愿在 UDP 之上构建应用,也不选择 TCP ?既然 TCP 提供可靠的服务,而 UDP 不提供,则 TCP 总是首选吗?答案是否定的,因为有很多应用更适合用 UDP ,主要因为 UDP 具有如下优点:
-
UDP 是无连接的,即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此 UDP 不会引入建立连接的时延,从而减少了开销和发送数据之前的时延。试想若 DNS 运行在 TCP 而非 UDP 上,则 DNS 的速度会慢很多。HTTP 使用 TCP 而非 UDP ,是因为对于基于文本数据的 Web 网页来说,可靠性是至关重要的。
-
无连接状态。TCP 需要在端系统中维护连接状态。此连接状态包括接收和发送缓存、拥塞控制参数和序号与确认号的参数。而 UDP 使用尽最大努力交付,即不保证可靠交付,因此主机既不需要维持复杂的连接状态表(这里面有许多参数),也不跟踪这些参数。因此,当某些专用服务器使用 UDP 时,一般都能支持更多的活动客户机。
UDP 不保证可靠交付,但这并不意味着应用对数据的要求是不可靠的,所有维护可靠性的工作可由用户在应用层来完成。应用开发者可根据应用的需求来灵活设计自己的可靠性机制。
- UDP 是面向报文的。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这就是说,应用层交给 UDP 多长的报文, UDP 就照样发送,即一次发送一个报文,如下图所示。在接收方的 UDP ,对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程。也就是说, UDP 一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文。若报文太长, UDP 把它交给 IP 层后,IP 层在传送时可能要进行分片,这会降低 IP 层的效率。反之,若报文太短,UDP 把它交给 IP 层后,会使 IP 数据报的首部的相对长度太大,这也降低了 IP 层的效率。
-
UDP 没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很多的实时的多媒体应用(如 IP 电话、实时视频会议、流媒体等)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但却不允许数据有太大的时延。显然,可靠数据传输对这些应用来说并不是最重要的,UDP 正好适合这种要求。但 TCP 的拥塞控制会导致数据出现较大的延迟,这是它们不可容忍的。
-
UDP 常用于一次性传输较少数据的网络应用,如 DNS、SNMP 等。因为对于这些应用,若采用 TCP ,则将为连接创建、维护和拆除带来不小的开销。
-
UDP 支持一对一、一对多、多对一和多对多的交互通信。
-
UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
虽然某些实时应用需要使用没有拥塞控制的 UDP ,但当很多的源主机同时都向网络发送高速率的实时视频流时,网络就有可能发生拥塞,结果大家都无法正常接收。因此,不使用拥塞控制功能的 UDP 有可能会引起网络产生严重的拥塞问题。
还有一些使用 UDP 的实时应用,需要对 UDP 的不可靠的传输进行适当的改进,以减少数据的丢失。在这种情况下,应用进程本身可以在不影响应用的实时性的前提下,增加一些提高可靠性的措施,如采用前向纠错或重传已丢失的报文。
2)UDP 的首部格式
用户数据报 UDP 有两个字段:用户数据字段和首部字段。首部字段很简单,只有 8 个字节(如下图所示),由四个字段组成,每个字段的长度都是两个字节。各字段意义如下:
-
源端口:源端口号。在需要对方回信时选用。不需要时可用全 0 。
-
目的端口:目的端口号。这在终点交付报文时必须使用。
-
长度:UDP 用户数据报的长度(包括首部和数据),其最小值是 8(仅有首部)。
-
检验和:检测 UDP 用户数据报在传输中是否有错。有错就丢弃。该字段是可选的,当源主机不想计算检验和时,则直接令该字段为全 0 。
UDP 数据报的格式包括 UDP 源端口号、UDP 目的端口号、UDP 报文长度和检验和,但不包括 UDP 数据报首部长度。因为 UDP 数据报首部长度是固定的 8B ,所以没有必要再设置首部长度字段。
【注】:接收端通过检验发现数据有差错,就直接丢弃该数据报,仅此而已。
当运输层从 IP 层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应的端口,上交最后的终点------应用进程。下图是 UDP 基于端口分用的示意图。
如果接收方 UDP 发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议 ICMP 发送"端口不可达"差错报文给发送方。之前讨论的 traceroute 就是让发送的 UDP 用户数据报故意使用一个非法的 UDP 端口,结果 ICMP 就返回"端口不可达"差错报文,因而达到了测试的目的。
请注意,虽然在 UDP 之间的通信要用到其端口号,但由于 UDP 的通信是无连接的,因此不需要使用套接字(TCP 之间的通信必须要在两个套接字之间建立连接)。
2. UDP 检验
UDP 用户数据报首部中检验和的计算方法有些特殊。在计算检验和时,要在 UDP 用户数据报之前增加 12 个字节的伪首部。所谓"伪首部"是因为这种伪首部并不是 UDP 用户数据报真正的首部。只是在计算检验和时,临时添加在 UDP 用户数据报前面,得到一个临时的 UDP 用户数据报。检验和就是按照这个临时的 UDP 用户数据报来计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和。
伪首部只是在计算检验和时临时添加的,不计入 UDP 的长度。
下图给出了 UDP 数据报的伪首部各字段的内容:
UDP 计算检验和的方法和计算 IP 数据报首部检验和的方法相似。但不同的是: IP 数据报的检验和只检验 IP 数据报的首部,但 UDP 的检验和是把首部和数据部分一起都检验。
UDP 计算检验和的方法为:
-
在发送方,首先是先把全零放入检验和字段并添加伪首部。再把 UDP 用户数据报看成是由许多 16 位的字串接起来的。若 UDP 用户数据报的数据部分不是偶数个字节,则要填入一个全零字节(但此字节不发送)。然后按二进制反码计算出这些 16 位字的和。将此和的二进制反码写入检验和字段后,就发送这样的 UDP 用户数据报。
-
在接收方,把收到的 UDP 用户数据报连同伪首部(若不为偶数个字节,则还需要补上全 0 字节)一起,按二进制反码求这些 16 位字的和。当无差错时其结果应为全 1 。否则就表明有差错出现,接收方就应丢弃这个 UDP 用户数据报(也可以上交给应用层,但附上出现了差错的警告)。
下图给出了一个计算 UDP 检验和的例子。这里假定用户数据报的长度是 15 字节(不含伪首部),因此要添加一个全 0 的字节。
【注意】:
I、检验时,若 UDP 数据报部分的长度不是偶数个字节,则需填入一个全 0 字节,但是此字节和伪首部一样,是不发送的。
II、若 UDP 检验和检验出 UDP 数据报是错误的,则可以丢弃,也可以交付给上层,但是需要附上错误报告,即告诉上层这是错误的数据报。
III、通过伪首部,不仅可以检查源端口号、目的端口号和 UDP 用户数据报的数据部分,还可以检查 IP 数据报的源 IP 地址和目的地址。
不难看出,这种简单的差错检验方法的检错能力并不强,但它的好处是简单,处理起来较快。
3. 例题
① 以下关于 UDP 检验和的说法中,错误的是( B )。
A. 计算检验和时需按 2 字节对齐,若数据部分不足,则需用一个全 0 字节填充
B. 若 UDP 检验和计算结果为 0 ,则在检验和字段填充 0
C. UDP 检验和字段的计算包括一个伪首部、UDP 首部和携带的用户数据
D. UDP 检验和的计算方法是二进制反码运算求和再取反
UDP 检验和不是必需的,若不使用检验和,则将检验和字段设置为 0 。而若检验和的计算结果恰好为 0 ,则将检验和字段置为全 1(这个结论了解即可)。
② 下列关于 UDP 检验的描述中,( B )是错误的。
A. UDP检验和段的使用是可选的,若源主机不想计算检验和,则该检验和段应为全 0
B. 在计算检验和的过程中,需要生成一个伪首部,源主机需要把该伪首部发送给目的主机
C. 检验出 UDP 数据报出错时,可以丢弃或交付给上层
D. UDP 检验和还能检验 IP 数据报的源 IP 地址和目的 IP 地址
【伪首部是临时添加的,只是为了计算检验和,既不向下传送又不向上递交。】
③ 下列网络应用中,( D )不适合使用 UDP 协议。
A. 客户机/服务器领域
B. 远程调用
C. 实时多媒体应用
D. 远程登录
【UDP 的特点是开销小,时间性能好且易于实现。远程登录需要依靠一个客户端到服务器的可靠连接,必须保证数据传输的安全性,使用 UDP 是不合适的。】
④ 一个 UDP 数据报的数据字段长度为 9192B ,如在数据链路层要采用以太网来传送,则应当将其划分为 IP 数据报片的片数是( B )。
A. 6
B. 7
C. 8
D. 9
【UDP 数据字段长度 9192B ,加上 UDP 首部长度 8B ,共 9200B 。每个 IP 数据报片的最大长度为 1500B ,减去 IP 首部 20B ,剩下 1480B 用来存放 UDP 数据报。因此需要将 UDP 数据报划分为 ⌈9200/1480⌉ = 7 个 IP 数据报片。每个 IP 数据报片的数据字段长度为 1480B ,除了最后一个为 1040B 。每个 IP 数据报片的偏移字段的值依次为 0, 185, 370, 555, 740, 925, 1110。】
⑤ 某应用层数据大小为 200B ,传输层使用 UDP ,网际层使用 IP(采用最大首部长度),使用以太网进行传输(不考虑前导码和 VLAN),则该应用层数据的传输效率是( C )。
A. 82.6%
B. 77.5%
C. 69.9%
D. 67.1%
【以太网 MAC 帧首部和尾部为 18B ,网际层 IP 首部为 60B(采用最大首部长度),传输层 UDP 首部为 8B ,所以该应用层数据的传输效率为 200 / (200+18+60+8) = 69.9% 。】
⑥ 【2014 统考真题】下列关于 UDP 协议的叙述中,正确的是( D )。
I. 提供无连接服务
II. 提供复用/分用服务
III. 通过差错检验,保障可靠数据传输
A. 仅 I
B. 仅 I、II
C. 仅 II、III
D. I、II、III
【UDP 虽然有差错检验机制,但 UDP 的差错检验只是检查数据在传输的过程中有没有出错,出错则直接丢弃,没有重传等机制,不保证可靠传输。使用 UDP 时,可靠传输必须由应用层实现。】
⑦ 【2018统考真题】UDP 协议实现分用时所依据的首部字段是( B )。
A. 源端口号
B. 目的端口号
C. 长度
D. 检验和
【思考】为什么要使用 UDP ?让用户进程直接发送原始的 IP 分组不就足够了吗?
【答】仅仅使用 IP 分组还不够。IP 分组包含 IP 地址,该地址指定一个目的机器。一旦这样的分组到达目的机器,网络控制程序如何知道把它交给哪个进程呢?UDP 分组包含一个目的端口,这一信息是必需的,因为有了它,分组才能被投递给正确的进程。此外,UDP 可以对数据报做包括数据段在内的差错检测,而 IP 只对其首部做差错检测。
【思考】使用 TCP 对实时语音数据的传输是否有问题?使用 UDP 传送数据文件时有什么问题?
【答】TCP 需要建立连接和维护状态,提供了确认、重传、拥塞控制等机制,虽然保证了传输的可靠性,但也增加了网络延迟和开销,还会导致报文的乱序、重复等现象,影响实时语音数据的实时性、连贯性和清晰度。实时音频/视频传输,不宜重传,可容忍少量数据的丢失或出错,但不允许有太大的时延,因此适合使用 UDP 。UDP 不需要建立连接,没有重传机制,不保证可靠交付,因此不适合可靠性要求高的应用,在传送数据文件时可能会丢失数据。对于可靠性要求高但实时性要求低的应用,如文件传输、电子邮件等,适合使用 TCP 。