16. C
## 16. C
UDP 检验和的计算方法是二进制反码求和再取反,二进制反码求和的运算规则:① 从低位到高位逐列进行加法运算,0 和 0 相加得 0,0 和 1 相加得 1,1 和 1 相加得 0 并产生进位 1;② 若最高位相加后产生进位,则将该进位加到结果的最低位,该过程也称回卷。计算过程如下:
$$
\begin{array}{c}
1011\ 1001\ 1011\ 0110 \\
+ \quad 0110\ 0101\ 1100\ 0101 \\
\hline
[1]\ 0001\ 1111\ 0111\ 1011 \\
+ \quad 1 \\
\hline
0001\ 1111\ 0111\ 1100 \\
1110\ 0000\ 1000\ 0011 \\
\end{array}
\quad
\longrightarrow
\begin{array}{c}
\text{最高位产生了进位,最低位要加} \\
\text{最后一步要取反} \\
\end{array}
$$
## 17. B
NAT 在转发内网主机 H 的 UDP 报文时,会修改 IP 数据报的源 IP 地址和 UDP 首部的源端口号(I 被修改),而目的端口号(II)保持不变。UDP 首部中的总长度(III)仅由 UDP 数据自身决定,未发生变化。但由于 UDP 检验和(IV)的计算包含伪首部(含源 IP 地址),当源 IP 被 NAT 替换后,必须重新计算检验和,因此 IV 被修改。综上,仅 I 和 IV 被修改。
## 二、综合应用题
### 01. 【解答】
仅仅使用 IP 分组还不够。IP 分组包含 IP 地址,该地址指定一个目的机器。一旦这样的分组到达目的机器,网络控制程序如何知道把它交给哪个进程呢?UDP 分组包含一个目的端口,这一信息是必需的,因为有了它,分组才能被投递给正确的进程。此外,UDP 可以对数据报做包括数据段在内的差错检测,而 IP 只对其首部做差错检测。
### 02. 【解答】
TCP 需要建立连接和维护状态,提供了确认、重传、拥塞控制等机制,虽然保证了传输的可靠性,但也增加了网络延迟和开销,还会导致报文的失序、重复等现象,影响实时语音数据的实时性、连贯性和清晰度。实时音频/视频传输,不宜重传,可容忍少量数据的丢失或出错,但不允许有太大的时延,因此适合使用 UDP。UDP 不需要建立连接,没有重传机制,不保证可靠交付,因此不适合可靠性要求高的应用,在传送数据文件时可能会丢失数据。对于可靠性要求高但实时性要求低的应用,如文件传输、电子邮件等,适合使用 TCP。
### 03. 【解答】
不行。重传时,IP 数据报的标识字段会有另一个标识符。仅当标识符相同的 IP 数据报片才能组装成一个 IP 数据报。前两个 IP 数据报片的标识符与后两个 IP 数据报片的标识符不同,因此不能组装成一个 IP 数据报。
### 04. 【解答】
1)第 1、2 个字节为源端口,即 F721,转换成十进制数为 63265。第 3、4 个字节为目的端口,即 0045,转换成十进制数为 69。第 5、6 个字节为 UDP 长度(包含首部和数据部分),即 002C,转换成十进制数为 44,数据报总长度为 44B,数据部分长度为 $44 - 8 = 36\mathrm{B}$。
2)由 1)可知,该 UDP 数据报的源端口号为 63265,目的端口号为 69,前一个为客户端使用的端口号,后一个为熟知的 TFTP 的端口,可知该数据报是客户发给服务器的。
### 05. 【解答】
<!-- page: 248 -->
2027年计算机网络考研复习指导
以太网帧的数据段的最大长度是 1500B,UDP 用户数据报的首部是 8B。假定 IP 数据报无选项,首部长度都是 20B。IP 数据报的片段偏移指一个片段在原 IP 分组中的相对位置,偏移的单位是 8B。UDP 用户数据报的数据字段为 8192B,加上 8B 的首部,总长度是 8200B。应当划分为 6 个 IP 报片。各 IP 报片总长度、数据长度和片偏移如下表所示。
| IP 报片 | 1 | 2 | 3 | 4 | 5 | 6 |
| --- | --- | --- | --- | --- | --- | --- |
| 总长度 | 1500B | 1500B | 1500B | 1500B | 1500B | 820B |
| 数据长度 | 1480B | 1480B | 1480B | 1480B | 1480B | 800B |
| 片偏移 | 0 | 185 | 370 | 555 | 740 | 925 |
## 5.3 TCP
### 5.3.1 TCP 的特点
TCP 是在不可靠的 IP 层之上实现的可靠数据传输协议,主要解决传输过程中可能出现的分组丢失、失序、重复和差错等问题。其主要特点如下:
1)TCP 是面向连接的传输层协议,因此引入了建立连接和释放连接的开销。
2)每一条 TCP 连接只能有两个端点,且仅支持一对一通信。
3)TCP 提供可靠交付服务,保证所传数据无差错、不丢失、不重复且按序到达。
4)TCP 支持全双工通信,允许通信双方的应用进程在任何时候发送数据。为此,TCP 连接的两端均设有发送缓存和接收缓存,用来临时存放双向通信的数据。
5)TCP 是面向字节流的。尽管应用程序与 TCP 的交互是以一个个数据块(大小不等)进行的,但 TCP 将这些数据视为一连串无结构的字节流,并不保留应用层数据块的边界。
TCP 与 UDP 在发送报文的方式上存在本质区别。TCP 并不关心应用进程一次向其缓存发送多长的数据,而是根据对方通告的窗口大小和当前网络的拥塞程度,动态决定一个报文段应包含多少字节(而 UDP 报文的长度由应用进程直接指定)。若应用进程传送到 TCP 缓存的数据块过长,TCP 会将其划分为较短的数据块再传送;若数据块过短,TCP 也可暂存数据,待积累到合适长度后再封装成报文段发送。关于 TCP 报文段长度的控制机制,将在后续章节详细讨论。
### 5.3.2 TCP 报文段
TCP 传送的数据单元称为报文段。一个 TCP 报文段分为首部和数据两部分,整个 TCP 报文段作为 IP 数据报的数据部分进行封装,如图 5.5 所示。TCP 的全部功能都体现在其首部的各个字段中,因此只有弄清各个字段的作用,才能掌握 TCP 的工作原理。TCP 首部的前 20 个字节是固定的,后面有 $4N$ 字节是根据需要而增加的选项。因此,TCP 首部的最小长度为 20B。
各个字段的意义如下:
**考点总结** TCP 首部格式及字段含义(2012)
1)源端口和目的端口。各占 2B。分别表示发送方和接收方所使用的端口号。
**考点总结** TCP 序号与确认序号机制(2009、2016)
2)序号。占 4B,范围为 $0 \sim 2^{32} - 1$,共 $2^{32}$ 个序号。当序号达到 $2^{32} - 1$ 后,下一个序号将回绕到 0,即采用模 $2^{32}$ 运算。TCP 连接中传送的字节流中的每个字节都按顺序编号,序号字段的值指明了本报文段所发送数据的第一个字节的序号。
<!-- page: 249 -->
第5章 传输层
237
例如,若某报文段的序号为301,携带的数据长度为100B,则该报文段的最后一个数据字节的序号为400,因此下一个报文段的数据应从序号401开始。
原转写引用的配图未随 Markdown 保存,请回到原 PDF 核验。
图5.5 TCP报文段
3)确认序号。占4B,表示期望收到对方下一个报文段中第一个数据字节的序号。若确认序号为 $N$ ,则表明到序号 $N - 1$ 为止的所有数据均已正确接收。
例如,B 正确收到了 A 发送的一个报文段,其序号为 501,数据长度为 200B(对应序号 $501 \sim 700$ ),说明 B 已完整接收到了到序号 700 为止的数据。因此,B 期望接收的下一个数据字节的序号为 701,于是在发给 A 的确认报文段中将确认序号置为 701。
**参考资料** ▶ TCP 首部的最小长度(2021)
4)数据偏移(首部长度)。占4位,用于指出TCP首部的长度。由于首部可能包含长度可变的选项字段,该字段用于指示TCP报文段中数据部分的起始位置距离报文段起始处的偏移量。偏移单位为4B,因此该字段的值乘以4就等于首部长度。
TCP首部最小长度为20B,对应数据偏移字段的最小值为5;4位二进制数最大可表示15,因此TCP首部的最大长度为60B(选项长度最多40B)。
5)保留。占6位,保留为今后使用,但目前须置为0。
下面有6个控制位,各占1位,用来说明本报文段的性质。
6)紧急位URG。当URG=1时,表明紧急指针字段有效,通知系统本报文段中包含紧急数据,应优先处理。紧急数据被放置在报文段数据的最前面,后续的仍为普通数据,因此需配合紧急指针字段使用。
7)确认位ACK。仅当ACK=1时,确认序号字段才有效;当ACK=0时,确认序号无效。TCP规定,在连接建立后,所有传送的报文段都必须将ACK置为1。
8)推送位 PSH(Push)。在交互式通信中,应用进程希望输入命令后能立即收到响应。此时发送方将 PSH 置为 1,接收方收到 $\mathrm{PSH} = 1$ 的报文段后,会立即将数据交付给应用进程,而不必等到整个缓存填满后才向上交付。
9)复位位RST(Reset)。当RST=1时,表示TCP连接出现严重差错(如主机崩溃),必须释放连接并重新建立连接。此外,RST也可用于拒绝非法的报文段或连接请求。
10)同步位 SYN。当 SYN = 1 时,表示这是一个连接请求或连接接受报文。
当 SYN = 1, ACK = 0 时,表明这是一个连接请求报文,若对方同意建立连接,则在响应报
<!-- page: 250 -->
2027年计算机网络考研复习指导
文中设置 SYN = 1 且 ACK = 1。关于连接的建立和释放,将在下一节详细讨论。
11)终止位 FIN(Finish)。用于释放连接。当 FIN = 1 时,表示此报文段的发送方已无更多数据要发送,并请求释放连接。
12)窗口。占 2B,范围为 $0 \sim 2^{16} - 1$,以字节为单位,该字段由本报文段的发送方填写,表示其作为接收方时当前还能接收的最大数据量。它告诉对方(作为发送方)“从本报文段的确认序号所指示的字节序号开始,你最多可以连续发送这么多字节的数据”。
例如,若确认序号为701,窗口字段值为1000,这表示发送方可以从序号701开始,连续发送最多1000B的数据(字节序号为 $701\sim 1700$)。
13)检验和。占 2B。检验范围包括首部和数据部分。计算时需在 TCP 报文段前添加一个 12B 的伪首部(与 UDP 类似,只需将协议字段由 17 改成 6,长度字段改成 TCP 长度)。
14)紧急指针。占 2B。仅在 URG = 1 时有效,指出本报文段中紧急数据的字节数(紧急数据位于数据部分的开头)。即使接收窗口为零,仍可发送紧急数据。
15)选项。长度可变,最长可达40B。若不使用选项,TCP首部长度即为20B。TCP最初只定义了一种选项,即最大报文段长度(Maximum Segment Size,MSS),它表示TCP报文段中数据字段的最大长度。后续又增加了窗口扩大、时间戳等选项,具体内容请参见教材。
注意,与MSS类似,数据链路层的MTU指的是帧中数据部分的最大长度。
16)填充。用于确保整个首部长度为4B的整数倍,这是由于选项字段的长度是可变的。
## 5.3.3 TCP 连接管理
TCP 是面向连接的协议,因此每条 TCP 连接都包含三个阶段:连接建立、数据传送和连接释放。TCP 连接管理的目标是确保连接的建立与释放能够正常、可靠地进行。
在 TCP 连接建立过程中,需解决以下三个问题:
1)使通信双方确知对方的存在。
2)允许双方协商相关参数(如最大窗口值、是否使用窗口扩大选项、时间戳选项等)。
3)为传输实体分配必要的资源(如缓存空间、连接表项等)。
TCP将连接作为最基本的抽象。每条TCP连接有两个端点,这些端点既不是主机、IP地址,也不是应用进程或传输层端口,而是套接字(Socket)。一条TCP连接由通信双方的两个套接字唯一确定。需要注意的是:同一个IP地址可以参与多个不同的TCP连接,同一个端口号也可以出现在多个不同的TCP连接中。
TCP连接的建立采用客户/服务器模式。主动发起连接建立的应用进程称为客户(Client),被动等待连接请求的应用进程称为服务器(Server)。
## 1. TCP 连接的建立
连接建立需经历三个步骤,通常称为三次握手,如图5.6所示。假设主机A和B分别运行TCP客户和服务器程序,最初两端的TCP进程均处于CLOSED(关闭)状态。在连接建立前,服务器完成一些准备工作后进入LISTEN(收听)状态,等待客户的连接请求。
第一步:客户向服务器发送连接请求报文段。该报文段的 SYN = 1,同时选择一个初始序号 seq = x。TCP规定,SYN报文段(SYN = 1的报文段)不能携带数据,但仍消耗一个序号,因此客户下一次发送的报文段序号 seq = x + 1。此时,客户进入SYN-SENT(同步已发送)状态。
第二步:服务器收到连接请求后,若同意建立连接,则向客户返回确认报文段。该报文段的 SYN = 1、ACK = 1,确认序号 ack = x + 1,同时选择自己的初始序号 seq = y。确认报文段同样不能携带数据,但也消耗一个序号。此时,服务器进入SYN-RCVD(同步已收到)状态。
<!-- page: 251 -->
第5章 传输层
239
原转写引用的配图未随 Markdown 保存,请回到原 PDF 核验。
图5.6 用“三次握手”建立TCP连接
**特点报告** TCP三次握手的字段解析(2011、2012、2016、2019、2023)
第三步:客户收到确认后,再向服务器发送最终确认。该确认报文段的 $\mathbf{ACK} = 1$,确认序号 $\mathbf{ack} = y + 1$,序号 $\mathbf{seq} = x + 1$。此报文段可以携带数据。若不携带数据,则不消耗序号,下一个数据报文段的序号仍为 $x + 1$。此时,客户进入ESTABLISHED(已建立连接)状态。
当服务器收到该最终确认后,也进入ESTABLISHED状态,连接正式建立。
## 注意
① 仅在前两次握手的报文段中,SYN = 1。TCP规定:SYN报文段不能携带数据,但仍消耗一个序号,因此下次发送的报文段序号为其SYN报文段序号加1。
② 仅在第一次握手的报文段中,ACK = 0,因为此时尚未收到任何报文段。
③ 第三次握手的报文段可携带数据;若不携带,则不消耗序号。
从客户发出SYN报文段(第一次握手的连接请求报文段)时刻起算,客户最早可在1RTT后开始发送数据,而服务器最早在1.5RTT后才能发送数据。
## 2. TCP连接的释放
“天下没有不散的筵席”,TCP连接亦如此。通信双方中的任意一方均可主动终止连接。TCP连接的释放过程通常称为四次挥手,如图5.7所示。
原转写引用的配图未随 Markdown 保存,请回到原 PDF 核验。
图5.7 用“四次挥手”释放TCP连接
<!-- page: 252 -->
2027年计算机网络考研复习指导
考点追查 TCP 四次挥手的字段解析(2020、2023)
第一步:客户决定关闭连接时,向服务器发送连接释放报文段,并停止发送数据(主动关闭)。该报文段的 $\mathbf{FIN} = 1$,序号 $\mathbf{seq} = \mathbf{u}$,其值等于此前已发送数据的最后一个字节序号加1。TCP规定,FIN报文段($\mathrm{FIN} = 1$ 的报文段)即使不携带数据,也消耗一个序号。此时,客户进入FIN-WAIT-1(终止等待1)状态。由于TCP是全双工的,可视为连接包含两条独立的数据通路;发送FIN的一端关闭了其发送方向,但对方仍可继续发送数据。
第二步:服务器收到连接释放报文段后,立即发送确认报文段。该报文段的 $\mathbf{ACK} = 1$,确认序号 $\mathbf{ack} = \mathbf{u} + 1$,序号 $\mathbf{seq} = \mathbf{v}$($\mathbf{v}$ 为服务器此前已发送数据的最后一个字节序号加1)。随后,服务器进入CLOSE-WAIT(关闭等待)状态。此时,从客户到服务器方向的连接已释放,但从服务器到客户方向的连接并未释放,TCP连接处于半关闭状态。客户收到确认后,进入FIN-WAIT-2(终止等待2)状态,等待服务器发出的连接释放报文段。
考点追查 TCP 四次挥手状态变化(2021)
第三步:若服务器已经没有要向客户发送的数据,就向其发送连接释放报文段。该报文段的 $\mathbf{FIN} = 1$、$\mathbf{ACK} = 1$,序号 $\mathbf{seq} = \mathbf{w}$($\mathbf{w}$ 可能大于 $\mathbf{v}$,因服务器在半关闭期间可能又发送了数据),还需重复此前已发送的确认序号 $\mathbf{ack} = \mathbf{u} + 1$。此时,服务器进入LAST-ACK(最后确认)状态。
考点追查 TCP 连接释放的时间分析(2016、2022、2024)
第四步:客户收到连接释放报文段后,必须发送最终确认,并进入TIME-WAIT(时间等待)状态。该确认报文段的 $\mathbf{ACK} = 1$,确认序号 $\mathbf{ack} = \mathbf{w} + 1$,序号 $\mathbf{seq} = \mathbf{u} + 1$。服务器收到此确认后,即进入CLOSED(连接关闭)状态。客户在TIME-WAIT状态下,还需等待时间等待计时器设置的时间2MSL(Maximum Segment Lifetime,最长报文段寿命)后,才进入CLOSED状态。
设置2MSL的主要目的是:① 确保客户发送的最后一个ACK报文段能够到达服务器;② 使本连接中所有可能滞留的旧报文段从网络中自然消失,避免影响新连接。
若服务器在收到客户的连接释放请求后不再发送数据,则从客户发出FIN报文段时刻起算,客户释放连接的最短时间为1RTT + 2MSL,服务器释放连接的最短时间为1.5RTT。
# 注意
① 仅在第一次和第三次挥手的报文段中(请求主动关闭),$\mathrm{FIN} = 1$。
② 后三次挥手的报文段中,$\mathrm{ACK} = 1$,因为每次都需要对之前收到的报文段进行确认。
③ 尽管协议并未禁止FIN段携带数据,但主流的操作系统一般不允许其携带数据
除时间等待计时器外,TCP还使用一个保洁计时器,以防止客户突发故障导致服务器长期无效等待。服务器每收到一次数据,就会重置该计时器;若计时器超时仍未收到数据,则每隔75秒发送一个探测报文段。若连续10次探测均无响应,则判定客户已故障,并关闭该连接。
# 5.3.4 TCP可靠传输
TCP在不可靠的IP层之上提供可靠传输服务,确保接收方从缓存中读取的字节流与发送方发出的字节流完全一致。TCP通过检验、序号、确认和重传等机制实现这一目的。其中,TCP的检验机制与UDP类似,这里不再赘述。
考点追查 TCP 序号与确认机制(2011、2012、2013、2025)
# 1. 序号
TCP首部的序号字段用于保证数据按序提交给应用层。TCP将数据视为一个无结构但有序的
<!-- page: 253 -->
第5章 传输层
241
字节流,其序号是对字节流中的每个字节依次编号,而非对报文段整体编号。
TCP 将每个字节都编上一个序号,序号字段值指明本报文段所发送的第一个数据字节的序号。如图 5.8 所示,假设 A 和 B 之间建立了一条 TCP 连接,A 的发送缓存区中有 10B 的数据,序号从 0 开始编号。第一个报文段包含 $0 \sim 2$ 号数据字节,则该 TCP 报文段的序号是 0;第二个报文段的序号是 3;第三个报文段的序号是 6;第四个报文段的序号是 8。
| 第一个报文段的数据 | | | | 第二个 | | | 第三个 | | | 第四个 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
图 5.8 A 的发送缓存区中的数据划分成 TCP 段
## 2. 确认
TCP 首部的确认序号字段表示期望收到对方下一个报文段的第一个数据字节的序号。在图 5.8 中,若接收方 B 已收到第一个和第二个报文段,此时 B 希望收到的下一个报文段的数据是从 6 号字节开始的,因此 B 向 A 发送的下一个报文段中的确认序号字段应置为 6。
发送方缓存区会继续存储那些已发送但未收到确认的报文段,以便在需要时重传。TCP 默认使用累积确认,即确认按序到达的连续字节,确认序号为第一个未收到字节的序号。接收方可以在合适时机发送确认,也可以在有数据要发送时将确认信息顺便捎带上(捎带确认)。例如,在图 5.8 中,接收方 B 收到了 A 发送的第一个和第三个报文段,尚未收到第二个报文段,此时 B 仍在等待从 3 号字节开始的连续数据,因此 B 向 A 发送的下一个报文段将确认序号字段置为 3。