第5 章
传 输 层 
传输层的作用是在通信子网提供的服务的基础上,为上层应用进程提供端到端的服
务。传输层是客户程序和服务器程序之间的联络人,是一个进程到进程的连接。它是
Internet上从一点到另一个点传输数据的端到端逻辑传输媒介。传输层使高层用户在相
互通信时不必关心通信子网的实现细节和具体服务质量。传输层是网络体系结构的关键
层次。本
章在讨论传输服务的基础上,主要阐述了传输层的两个重要协议:无连接的用户
数据报协议UDP和面向连接的传输控制协议TCP,重点是TCP为保证可靠传输而采用
的连接管理、序号与确认、流量控制、拥塞控制等机制。
5.1 传输层概述
5.1.1 传输层功能及提供的服务 
网络层协议提供了主机之间的逻辑通信,而两台主机进行通信实际上是两台主机中
的应用进程间互相通信,传输层协议正是为运行在不同主机上的应用进程提供逻辑通信
功能。从通信的角度看,传输层属于面向通信部分的最高层,但从用户功能来看,传输层
又是用户功能中的最低层。传输层的功能归属如图5.1所示。
图5.1 传输层的功能归属
从应用程序的角度看,通过逻辑通信,运行不同进程的主机好像直接相连;实际上这
些主机是通过很多路由器和多种不同的链路相连。应用进程通过传输层提供的逻辑通信
功能彼此发送报文,而不需要考虑承载报文的物理基础设施的细节,如图5.2所示。
一台主机上经常有多个应用进程同时分别与另一台主机上的多个应用进程通信。网

第 
5 
章 传输层

237
图5.传输层为应用进程间提供逻辑通信

2 

络层协议或网际互连协议能够将分组送达到目的主机,但它无法交付给主机中的某个对
应的应用进程,因为在TCP/IP 协议族中,并没有标识主机中

IP 地址标识的是一台主机, 
的应用进程。因此,网络层是通过通信子网为主机之间提供逻辑的通信;而传输层依靠网
络层的服务,在两台主机的应用进程间建立端到端的逻辑通信信道,3所示。

如图5.


图5.数据通信过程

3 

传输层对整个报文段进行差错校验和检测。IP 在传输数据时并不保证传输的顺序, 
也不保证传输数据的质量。因此传输层协议要提供端到端的错误恢复与流量控制,对网
络层出现的丢包、乱序或重复等问题做出反应。网络层如同邮递员,只负责将邮件从某个
单位的收发室发送到另一个单位的收发室,传输层协议就像是将邮件从收发室传递到具
体的个人的手中。另外,当上层的协议数据包的长度超过网络层所能承载的最大数据传
输单元时,传输层提供必要的分段功能,并在接收方的对等层将分段合并。总之,传输层
通过扩展网络层服务功能,为高层提供可靠数据传输,从而使系统之间实现高层资源的共
享时不必再考虑数据通信方面的问题,即它是资源子网与通信子网的界面与桥梁,它完成
资源子网中两结点间的逻辑通信,实现通信子网中端到端的透明传输。


238
计算机网络教程

5.1.2 
应用进程、端口号与套接字
1.应用进程、端口号
在计算机操作系统的术语中,进程即为运行着的程序。操作系统为每个进程分配一
定的地址空间和CPU周期等资源,从而实现一台计算机上可以并发运行多个程序。传
输层协议的首要任务是提供进程到进程通信(Proces-to-procesCommunication)。进程
是使用传输层服务的应用层实体。我们在讨论进程到进程通信如何实现之前,需要理解
主机到主机通信与进程到进程通信的不同之处。

网络层负责计算机层次的通信(主机到主机通信)。IP地址标识的是一台主机,网络
层协议只把报文传递到目的计算机。然而,这是不完整的传递。报文仍然需要递交给目
的主机中正确的进程。这正是传输层接管的部分。传输层协议负责将报文传输到正确的
进程。图5.

4给出了网络层和传输层的范围。其中AP表示应用进程。


图5.网络层与传输层作用范围

4 

那么两个彼此通信的进程之间是如何相互识别的呢? 对通信来说,必须定义本地主
机、本地进程、远程主机以及远程进程。使用IP地址来定义本地主机和远程主机(见第4 
章)。为了定义进程,我们需要第二个标识符,称为端口号(portnumber)。两台计算机中
的进程要互相通信,不仅需要知道双方的IP地址,通过IP地址可以找到对方的计算机
(类似于学校的地址),而且还需要知道对方的端口号,其标识了计算机中的应用进程(类
似于信箱号)。通过学校地址和信箱号,就可以进行邮政通信了。

所以准确地说,端口号是操作系统为不同的网络应用提供的一个用于区分不同网络
通信进程的标识。端口号是16位的二进制数,即位于0~65535的整数。每个通信进程
产生时都同时被设定一个端口号用来标识该进程,且端口号在同一个操作系统上是唯一
的。客户进程向某个服务器请求一种服务时,请求信息中指明服务器某个特定的端口号, 
服务器便可以将所接收的服务请求提交给对应该端口号的服务进程。客户进程在发送服
务请求时,随即也产生一个客户进程端口号,客户端与服务器就这样相互识别进行通信。

端口在传输层的作用有点类似IP地址在网络层的作用或MAC地址在数据链路层
的作用,只不过IP地址和MAC地址标识的是主机,而端口标识的是网络应用进程。由
于同一时刻一台主机上会有大量的网络应用进程在运行,所以需要大量的端口号来标识
不同的进程。当传输层收到IP层交上来的数据(即TCP报文段或UDP用户数据报)时, 
就要根据其中首部的端口号来决定应当通过哪一个端口上交给应当接受此数据的应用进
程。图5.

5说明了端口在进程之间的通信中所起的作用。传输层具有复用和分用的功能
(将在5.3小节介绍)。应用层所有的应用进程都可以通过传输层再传送到网络层,

1.这

第
5 
章 传输层

称为复用。传输层从网络层收到的数据报后必须交付给指明的应用进程,这就是分用。

239
图5.端口在进程之间的通信中所起的作用

5 

端口可以分为两大类:服务器端使用的端口号和客户端使用的端口号。

(1)服务器端使用的端口号又可以分为专用端口号和注册端口号。
● 专用端口号:也称为熟知端口号,端口号的范围是0~1023,绑定于一些特定的服
务,通常带有这些端口号的通信明确表明了某种服务的协议,这种端口号不可再重
定义它的作用对象。
● 注册端口号:端口号的范围是1024~49151,多数没有明确的定义服务对象,不同
程序可根据实际需要自己定义,比如远程控制软件和木马程序中都会有这些端口
号的定义。
(2)客户端使用的端口号:49152~65535,仅在客户进程运行时才动态分配,是留
给客户进程暂时使用时选择。通信结束后被收回,供其他客户进程以后使用。
表5.1中我们可以看到常见的协议及它

1给出了常用的端口号及对应协议。在表5.
对应的端口号,如DNS 的端口号是53,HTTP 的端口号为80 等。

表5.常用的端口号及对应协议

1 

端口号应用程序说明
20 FTP_DATA 文件传输协议(数据) 
21 FTP_CONTROL 文件传输协议(命令) 
23 TELNET 远程连接
25 SMTP 简单邮件传输协议
53 DNS 域名解析服务
69 TFTP 简单文件传输协议


240
计算机网络教程

续表

端口号应用程序说明
80 HTTP 超文本传输协议
110 POP3 邮局协议版本3 
161 SNMP 简单网络管理协议
179 BGP 边界网关协议
520 RIP 路由信息协议

2.套接字
应用层通过传输层进行数据通信时,传输层会同时为多个应用进程提供并发服务,为
了区分不同的应用程序进程和连接,计算机操作系统为应用进程与TCP/IP交互提供了
被称为套接字(socket)的接口,用来区分不同应用程序进程间的网络通信和连接。
Socket的原意是“插座”,就像电话的插口一样,没有它就完全没办法通信。

在TCP协议簇中的传输层协议需要IP地址和端口号,它们各在一端建立一条连接。
一个IP地址和一个端口号结合起来称为套接字地址(socketaddres)。
套接字地址=(IP地址:端口号) (5-1)
客户套接字地址唯一定义了客户进程,而服务器套接字地址唯一地定义了服务器进
程。套接字可以看成在两个程序进行通信连接中的一个端点,如图5.

6所示。一个程序
将一段信息写入套接字中,该套接字将这段信息发送给另一个套接字中,使这段信息能传
送到其他程序中。


图5.应用程序进程、套接字

6 

两台计算机中的进程要互相通信,不仅需要知道双方的IP地址,而且还需要知道对
方的端口号。将端口号拼接到IP地址后即构成了套接字。例如,4.21,

IP地址为202.25.
而端口号为80,那么套接字就是(202.25.80 )。如果加上协议,比如htp协议,将是

4.21:
常见的在浏览器输入的Web请求(htp://202.25.80),请求远程Web服务器提供
4.21:
服务。
为了使用Internet中的传输服务,我们需要一对套接字地址:客户套接字地址和服
务器套接字地址。这四条信息是网络层分组首部和传输层分组首部的组成部分。第一个


第
5 
章 传输层

241
首部包含IP 地址,而第二个首部包含端口号。每一条TCP 连接唯一地被通信两端的两
个端点(即一对套接字)所确定,即: 

={SocketSocketIP1:portIP2:port5

TCP 连接::1,2}={(1),(2)} (2) 

5.1.3 
传输层的多路复用与多路分解
每当一个实体从一个以上的源接收到数据项时,称为多路复用(multiplexing,多对
一); 每当一个实体将数据项传递到一个以上的源时,称为多路分解(demultiplexing,一对
多)。源端的传输层执行复用;目的端的传输层执行多路分解,7所示。

如图5.


图5.多路复用和多路分解

7 

图5.7给出了一个客户和两个服务器之间的通信。客户端运行三个进程:P1、P2 和
P。进程P1 和P3 需要将请求发送到对应的服务器进程。客户进程P2 需要将请求发送到(3) 位于另外一个服务器的服务器进程。客户端的传输层接收到来自三个进程的三个报文
并创建三个分组。它起到了多路复用器的作用,分组1和3使用相同的逻辑信道到达第
一个服务器的传输层。当它们到达服务器时,传输层起到多路分解器的作用并将报文分
发到两个不同的进程。第二个服务器的传输层接收分组2并将它传递到相应的进程。注
意,尽管只有一个报文,我们仍然用到多路分解。

5.1.4 
无连接服务与面向连接服务
从通信的角度上看,网络中各层所提供的服务可以分成两大类:无连接的服务和面


242
计算机网络教程

向连接的服务。无连接的服务和邮政系统的工作模式相似,两个系统之间的通信不需要
先建立好连接,是一种不可靠的传输。面向连接的服务和电话系统的工作模式相似,具有

连接建立、数据传输和连接释放三个阶段。

由于TCP/IP的网络层提供的是面向无连接的数据报服务(见第4章的介绍),也就
是说IP数据报传送会出现丢失、重复和乱序的情况,因此在TCP/IP网络结构中传输层
就变得极为重要。TCP/IP的传输层提供了两个主要的协议:用户数据报协议(User 
DatagramProtocol,UDP)和传输控制协议(TransmisionControlProtocol,TCP),如
图5.并给出了这两种协议在协议栈中的位置。

8所示, 


图5.IP的传输层协议与上下层中的协议

8 
TCP/

TCP是面向连接的、可靠的传输协议。在传送数据之前必须先建立连接,数据传送
结束后释放连接。它能把报文分解成数段,在目的端再重新装配这些段,重新发送没有被
收到的段。在用户通信之间TCP提供了一个虚电路。

UDP是无连接的,而且“不可靠”,远端主机的传输层在收到UDP报文后,不需要给
出任何确认,也没有对发送段进行软件校验。因此,被称为“不可靠”。

无连接的服务和面向连接的服务在网络体结构的各层中都有实现。各功能层具体实
现协议举例如表5.

2所示。

表5.两大类服务的具体实现协议

2 

协议层次无连接的服务面向连接的服务
传输层UDP TCP 
网络层IP X.25分组级
数据链路层CSMA/CD PPP、HDLC 

当传输层采用面向连接的协议(如TCP)时,它为应用进程在传输实体间建立一条全
双工的可靠逻辑信道,尽管下面的网络可能是不可靠的(如IP交换网络)。

5.
2 
UDP 

用户数据报协议(UserDatagramProtocol,UDP)是无连接不可靠的传输层协议,它
除了提供进程到进程之间的通信之外,只是在IP的数据报服务的基础上增加了端口复用


243
第
5 
章 传输层

分用和差错检测的功能。UDP 协议具有如下特点。
(1)UDP 是无连接的,在传送数据前不需要与对方建立连接,因此减少了开销和发
送数据之前的时延。
(2)UDP 提供不可靠的服务,没有拥塞控制,数据传送到对方可能没有按顺序、重复
甚至丢失,因此主机不需要维持具有许多参数的、复杂的连接状态表。

(3)UDP 同时支持点到点和多点之间的通信,对网络实时应用(如视频电话等)是很
重要的。网络出现拥塞不会使源主机的发送速率降低,而这些实时应用要求源主机以恒
定的速率发送数据,允许在网络发生拥塞时丢失一些数据,但不允许数据有太大的时延。
UDP 正好适合这种要求。

(4)UDP 的首部只有8字节,传输开销小。
(5)UDP 是面向报文的。使用UDP 发送一个很短的报文,在发送方和接收方之间
的交互要比使用TCP 时少得多。

5.2.1 
用户数据报概述
UDP 分组称为用户数据报(userdatagram), 有8字节的固定首部,这个首部由4个
字段组成,每个字段2字节(9说明了用户数据报的格式。

16 位)。图5.


图5.用户数据报格式

9 

(1)源端口字段:包含16 位长度的发送端UDP 协议端口号。
(2)目的端口字段:包含16 位长度的接收端UDP 协议端口号。
(3)长度字段:UDP 用户数据报的长度,记录该数据报的长度,即首部加数据的长
度,16 位可以定义的总长度范围是0~65535 。
(4)校验和字段:防止UDP 用户数据报在传输中出错。校验和字段是可选择的,如
该字段值为0则表明不进行校验。一般说来,使用校验和字段是必要的。
UDP 校验和包含三部分:伪首部、UDP 首部和从应用层来的数据。伪首部是IP 分
组的首部的一部分,其中有些字段要填入0, 9所示。伪首部总共12 字节,

如图5.分5个
字段,第1个字段为源IP 地址占4字节(32 位); 第2个字段为目的IP 地址占4字节(32 


244
计算机网络教程

位);第3字段是全0;第4个字段是IP首部中的协议字段的值,对于UDP,此协议字段值

为17;第5字段是UDP用户数据报的长度。

所谓“伪首部”是因为这种伪首部并不是UDP用户数据报真正的首部。只是在计算
校验和时,临时和UDP用户数据报连接在一起,得到一个过渡的临时的UDP用户数据
报。校验和就是按照这个过渡的UDP用户数据报来计算的。伪首部既不向下传送,也
不向上递交。如果校验和不包括伪首部,用户数据报也可能是安全完整地到达。但是,如
果IP首部受到损坏,那么它可能被提交到错误的主机。

增加协议字段是确保这个分组是属于UDP,而不是属于其他传输层协议。我们在后
面将会看到,如果一个进程既可用UDP又可用TCP,则端口号可以是相同的。UDP的
协议字段值是17 。如果传输过程中这个值改变了,在接收端计算校验和时就可检测出
来,UDP就可丢弃这个分组。这样就不会传递给错误的协议。

UDP计算校验和的方法和计算IP数据报首部校验和的方法相似(在第4章介绍)。
但不同的是:IP数据报的校验和只检验IP数据报的首部,但UDP的校验和是将首部和
数据部分一起都检验。在发送端,首先是将全零放入检验和字段。再将伪首部以及UDP 
用户数据报看成是由许多16位的字串接起来。若UDP用户数据报的数据部分不是偶数
字节,则要填入一个全零字节(即:最后一个基数字节应是16位数的高字节,而低字节
填0)。然后按二进制反码计算出这些16位字的和(两个数进行二进制反码求和的运算
的规则是:从低位到高位逐列进行计算。0和0相加是0,0和1相加是1,1和1相加是0 
但要产生一个进位1,加到下一列。若最高位相加后产生进位,则最后得到的结果要加
1)。将此和的二进制反码写入校验和字段后,发送此UDP用户数据报。在接收端,将收
到的UDP用户数据报连同伪首部(以及可能的填充全零字节)一起,按二进制反码求这
些16位字的和。当无差错时其结果应全为1。否则就表明有差错出现,接收端就应将此
UDP用户数据报丢弃(也可以上交给应用层,但附上出现了差错的警告)。

【例5-1】假设从源端A要发送下列3个16位的二进制数:word1 、word2和word3 
到终端B,校验和计算如下: 

word1:0110011001100110 

word2:0101010101010101 

word3:0000111100001111 

【解】先将校验和字段全填0;即word4为0000000000000000 。

将4个16位二进制反码求和sum=word1+word2+word3+word4=
101010101010 。

校验和(sum的反码)为0011010100110101 。

从发送端发出的4个(word1 、word2 、word3以及校验和)16位二进制数之和为
1111111111111111,如果接收端收到的这4个16位二进制数之和也是全“1”,就认为传输
过程中没有出差错。
【例5-2】以下是十六进制格式的UDP首部内容:DDAB0035002A8E7A,请问: 

(1)源端口号是多少? 
(2)目的端口号是多少? 
(3)用户数据报总长度是多少? 

第
5 
章 传输层

245
(4)数据长度是多少? 
(5)分组是从客户端发往服务器端的还是相反方向的? 
(6)客户进程是什么? 
【解】(1)源端口号是头4位十六进制数(DDAB)16,这意味着源端口号是56747 
(一般的端口号)。

(2)目的端口号是第二组4位十六进制数(0035)16,即目的端口号为53(是DNS 的
查询默认端口)。
(3)第三组4位十六进制数(002A)16,定义了整个UDP 分组的长度,即长度为42 
字节。
(4)数据的长度是整个分组长度减去首部长度,即42-8=34 字节。
(5)由于目的端口号是53(为专用端口号), 分组是从客户端发送到服务器端。
(6)客户进程是DNS( 1)。
见表5.

5.2.2 
UDP 
应用
尽管UDP 不满足我们之前讨论的可靠传输层协议标准,但是,UDP 更适合某些
应用。

如前所述,UDP 是无连接协议。同一个应用程序发送的UDP 分组之间是独立的。
这个特征可以看作是优势也可以看作是劣势,这要取决于应用要求。例如,如果一个客户
应用需要向服务器发送一个短的请求并接收一个短的响应,那么这就是优势。如果请求
和响应各自可以填充进一个数据报,那么无连接服务可能就更可取。在这种情况下,建立
和关闭连接的开销可能很可观。在面向连接服务中,要达到以上目标,至少需要在客户和
服务器之间交换9个分组;在无连接服务中只需要交换2个分组。无连接提供了更小的
延迟;面向连接服务造成了更多的延迟。例如,一种客户-服务器应用如DNS(第6章讨
论), 它使用UDP 服务,因为客户需要向服务器发送一个短的请求,并从服务器接收快速
响应。请求和响应可以填充进一个用户数据报。由于在每个方向上只交换一个报文,因
此无连接特性不是问题;客户或服务器不担心报文会时序传递。

UDP 不提供差错控制;它提供的是不可靠服务。绝大多数应用期待从传输层协议中
得到可靠服务。尽管可靠服务是人们想要的,但是它可能有一些副作用,这些副作用对某
些应用来说是不可接受的。当一个传输层提供可靠服务时,如果报文的一部分丢失或者
被破坏,它就需要被重传。这意味着接收方传输层不能向应用立即传送那一部分信息;在
传向应用层的不同报文部分会有不一致的延迟。对于某些应用根本注意不到这些不一致
的延迟,但是对于有些应用这些延迟却是致命的。假设我们正在使用一个实时交互应用, 
例如Skype。音频和视频被分割成帧并且一个接一个发送。如果传输层应该重传某些被
破坏或丢失的帧,那么整个传输的同步性就会丧失。观众会突然看到空白屏幕并且需要
等待,直到第二个传输到达。这是不可容忍的。然而,如果屏幕的每个小部分都使用一个
用户数据报传送,那么接收UDP 可以轻易地忽略被破坏或丢失的分组,并将其余分组传
递到应用程序。屏幕的那部分会空白很短时间,而绝大多数观众都不会注意到。

UDP 不提供拥塞控制。然而在倾向于出错的网络中UDP 没有创建额外的通信量。