Computer Networks Questions & Answers, Chinese Version - PDF

Summary

This document contains practice questions related to computer networks, likely from the textbook "Computer Networks" (8th Edition) by Xie Xiren. The questions cover a range of networking topics, including IP addressing, routing, and network protocols. The document is primarily in Chinese.

Full Transcript

4-09 IP数据报中的首部检验和并不检验数据报中的数据。 这样做的最大好处是 什么? 坏 处是什么? 4-1 0 当某个路由器发现 一 IP数据报的检验和有差 错时 , 为什么采取丢弃的办法而不是要 求 源 站重传此数据报? 计算首部检验和为什么不采用C RC 检验码? 4-1 1 设 IP数据报使用 固 定 首部, 其 各...

4-09 IP数据报中的首部检验和并不检验数据报中的数据。 这样做的最大好处是 什么? 坏 处是什么? 4-1 0 当某个路由器发现 一 IP数据报的检验和有差 错时 , 为什么采取丢弃的办法而不是要 求 源 站重传此数据报? 计算首部检验和为什么不采用C RC 检验码? 4-1 1 设 IP数据报使用 固 定 首部, 其 各字段的具 体数值如 图 4- 76 所示( 除 IP地址外 , 均 为十进制形 式表示 ) 。 试用二进制运算方法计算应 当 写入到 首部检验和字段中的数值 ( 用二 进制形 式表示)。 4 | 5 | 。 。 28 I o I 4 I 17 首 部检验和 ( 待计 算 后 写 入 ) 1 0 1 2 1 4.5 12 6.7 9 图 4-76 习 题 4- 1 1 的 图 4-1 2 重新计算上题, 但使用十 六进制运算方法( 每1 6 位二 进制数字转换为4 个十六进制 数字 , 再按 十 六进制加 法规则计算)。 比较这 两种方法。 4-1 3 什么是 最大传送 单 元 MTU ? 它和IP数据报首部中的哪个字段有关系? 4-1 4 在互联网中将 IP数据报分片传送的数据报在最后的目的主机进行组装。 还可以有另 一种做法 , 即 数据报分 片 通过 一 个网络就进行 一 次组装 。 试 比 较 这 两种方法的优 劣 。 4-1 5 一 个3200 位长的 TCP报文传到IP层 , 加 上 1 06 位的首部后成为数据报。 下面的互 联 网 由两个局 域网通过路由器连接起来 , 但第 二个局 域 网所能传送的最长数据帧 中 的数据部分只有1 200 位 , 因此数据报在路由器必须进行分片 。 试问第 二个局 域 网向 其上层要传送多少比特 的数据( 这 里的 数据 当然 指的是 局 域 网 看见的数据) ? “ “ 4-1 6 1( ) 试解释为什么A RP高速缓存每存入 个项目就要设置 1 0 一 ~20 分钟的超时计时器。 这个时间设置得太大或 太小 会出现什么问题? (2 ) 举 出 至少两种不需要发送 A RP请求分组的情况(即不需要请 求 将 某个目的IP地 址 解 析 为相 应的 MA C 地址 )。 4-1 7 主机A 发送IP数据报给主机 B , 途中经过了5个路由器。 试问在IP数据报的发送过 程中总 共 使用了几次A RP? 4-1 8 设某路由器建立了如下转发表: 前缀匹配 下一跳 1 92 4.. 1 53.0 /2 6 R3 1 2 8. 96.39.0 /2 5 接口 mO 1 2 8.96.39. 1 2 8/2 5 接口 m l 1 2 8.96.40 0. /2 5 R2 1 92 4. 1. 53.0 /2 6 R3 * ( 默认 ) R4 现共收到 5个分组, 其目的地址分别 为: 1( 1) 2 8.96.39. 01 20 3 (2 ) 12 8. 96.40. 12 (3)1 2 8.96.40 1. 51 (4)1 92 4.. 153. 1 7.. 153.90 ( 5) 1 92 4 试分别计算其下 一 跳。 4-1 9 0 1/ 6。 该 单 位有4000 台机器, 平均分 布 在1 6 个不同 某单位分配到 一个地址块 1 2 9.2 5 的地点。 试给每 一个地点分配 一个地址块, 并算出每个地址块中 I P 地址的最小 值和 最大值。 4-20 一个数据报长度 为 4000 字节( 固 定 首 部 长 度 )。 现在经过 个网络传送, 但此网络 一 能够传送的最大数据 长度为 1 5 00 字节。 试问应 当 划分为几个短些的数据报片? 各 数 据 报 片 的数据字段长 度 、 片 偏 移字段和 MF 标志应为何数值? 4-2 1 写 出 互 联网的I P 层查找路 由 的算法。 4-22 有如下的4 个/2 4 地址块, 试进行最大可能的聚 合。 2 1 2.56.1 32 0. /2 4 21 2.56.1 33.0 /2 4 21 2.56. 1340. /2 4 21 2.56. 1 35.0 /2 4 4-23 有两个CID R 地址块20 81. 2 8/ 11 和20 81. 30 2. 8/2 2 。 是 否有哪 一个地址块 包 含 了 另 个 一 的地址? 如果有, 请 指出, 并说明理 由 。 4-24 已知路 由 器 凡 的转发表如表4-10 所示。 表 4- 1 0 习 题 4-24 中 路 由 器 氏 的转发 表 前缀 匹配 下 一 跳地址 路 由 器接 口 1 40 5 1 2 64/26 1 80 1 5 2 5 m2 1 30 5. 8/24 1 90 1 6 6 2 ml 1 10 7 1 / 1 6 ... mO 1 80. 1 5/ 1 6 ... m2 I 90 1 6/ 1 6 ... ml 默认 1 1 07 1.4 5 mO 试 画 出 各网络和必要的路由器的连接拓 扑, 标 注出必要的 I P 地址和接口 。 对 不能确 定 的情况应 当 指明。 4-25 一个 自 治 系 统分配到的 IP 地址块为30 1. 381. 1 8/ 2 3 , 并 包 含有 5个局 域网, 其连接图 如图4-7 7所示, 每个局 域 网 上的主机数分别 标注在图4-77上。 试给出每 一个 局 域 网 的地址块( 包 括前缀 )。 3 0. 1 3 8. 1 1 8/23 LAN 2 9 1 个 主 机 LAN 3 1 50 个 主 机 LAN4 3 个 主 机 了 了 广__ 豪少年〉 LAN5 1 5 个主机 LAN I 了 图 4-77 习 题 4-25 的 图 024 4-26 一 个大公司 有 一个总 部和三个下 属 部门。 公司分配到的网络前缀是 192.77.33 /24。 公 司的网络布局 如图4-78 所示。 总部共 有 5个局 域网, 其中的 LAN 1 ~ LA凡 都连 接到 三 路由 器 R 1 上,凡 再 通过 LAN5 与 路 由器 民 相连。 民 和远 地的三个部门的局 域网 LAN6 ~ LANs 通过广 域网相连。 每 一个局 域网旁边标明的数字是局 域网上的 主机数。 试给每 一个局 域网分配 一个合适的网络前缀。 9 2 3 3 / 2 4 l 7 7 ' , ,', 0 5 R3 ,-一、- - 、- - ' ,. LAN 、 - - ' ,、 ; ; 20 ` 一 'L _ , 6 4 }、L 0 l R R ­ } 5' - } 2 ,--、一 一 ”. 一 、 ` , A.、』 N 『 ,',z ,J , _7 '; 20 ,_ LAN '-.、--夕、 Z l 2 8 、_ ,,. _ , 、 LAN 1 0 ,、 、 图 4-78 习 题 4-26 的 图 一 4-27 以下 地址中的哪 个和 86.32/12 匹配 ? 请 说明理由 。 (1) 86.33.224.123 ; (2) 86.79.65.216; (3) 86.58.119.74; (4) 86.68.206.154。 4-28 以下的地址前缀中的哪 一个地址与 2.52.90.140 匹配 ? 请 说明理由 。 ( 1 ) 0/4; (2) 32/4; (3) 4/6; (4) 80/4。 4-29 下 面的前缀中的哪 一个和地址 152.7.77.159 及 1 52.31.47.252 都 匹配 ? 请 说明理由。 (1) 152.40/13 ; (2) 153.40/9 ; (3)152.64/12; (4) 152.0/11。 4-30 与下列 掩码相对应的网络前缀各 有多少位? (1) 192.0.0.0; (2) 240.0.0.0; (3 ) 255.224.0.0; (4) 255.255.255.252。 4-31 已知地址块 中的一个地址是 140.120.84.24/20。 试求 这个地址块 中的最小地址和最大 地址。 地址 掩码是什么? 地址块 中共 有 多 少个地址? 相当千 多 少个C类地址 ? 一 4-32 已知地址块 中的 个地址是 190.87.140.202/29。 重新 计算上题。 4-33 某 单位 分配到一个地址块136.23.12.64/26。 现在需 要 进 一 步划分为 4 个一 样大的子 网。 试问: (1) 每个子网的网络前缀有多 长? (2) 每 一个子网中 有多 少个地址 ? (3) 每 一个子网的地址块 是什么 ? (4) 每 一个子网可分配给 主机使用的最小地址和最大 地址是什么 ? 4-34 I GP和 EGP这 两 类协议的 主要区别是 什么 ? 4-35 试简述R IP, OSPF 和BGP路由 选择协议的 主要特点。 4-36 R P使用I UDP, OSPF 使用 P I , 而BGP使用 TCP 。 这 样做 有何优点 ? 为什么R I P周 期性地和邻 站 交换 路由信 息而BGP 却 不这 样做 ? “ ” “ ” 4-37 假定网络中的路由器 B 的路由表 有 如下的项目 (这 三 列 分别表 示 目的网络 距离 “ ” 和 下 一 跳 路由器 ) : N1 7 A N2 2 C N6 8 F N8 4 E N9 4 F 205 现在 B 收到从C 发来 的路由信 息 ( 这 两 列分别表示 目的网络 和 距离 ): “ ” " ” 沁 4 凡 8 N6 4 沁 3 沁 5 试 求出路由器 B 更新后的路由表(详细说明每一个步骤)。 4-38 网络如 图4- 79 所示。 假定AS ] 和AS4 运行程序 RIP, AS2 和AS 3 运行程序 OSPF。 AS 之间运行程序 e BGP和 iBGP。 目前先假定在AS2 和 AS4 之 间没有物理连接(图中的 虚 线表示这个假定)。 图 4-79 习 题 4-3 8 的 图 1( ) 路由器 R3 c 使用哪 个协 议 知 道前缀 X ( X 在AS4 中) ? 一 ( 2) 路由器 R3a 使用哪 一 个协 议 知 道前缀 X ? (3) 路由器 R 1 c 使用哪 一个协 议 知 道前缀 X ? (4 ) 路由器 R l d 使用哪 一 个协 议 知 道前缀 X ? 4-39 网络 同 上题。 路由器 R l d 知 道前缀 X, 并将前缀 X 写入转发表。 1( ) 试问路由器 R l d 应当从接口 1 还是接口 2 转发分组呢? 请简述理由。 ( 2) 现假定 AS2 和 AS4 之间有物理连接, 即 图中的虚线变成了实线。 假定路由器 R ld 知 道到 达前缀 X 可 以经过 AS2 , 但也可 以经过 AS3。 试问路由器 R l d 应 当 从接口 l 还是接口 2转发分组呢? 请简述理由。 (3) 现假定有另 一个 AS 5 处在 AS 2 和 AS 4 之间( 图中的虚线之间未 画出 AS 5 )。 假定 路由器 Rl d 知 道到达前缀 X 可以经过路由[AS2 ASs AS4 ] , 但也可以经过路由[AS 3 AS4]。 试问路由器 R l d 应当从接口1 还是接口 2 转发分组呢? 请简述理由。 4-40 IGMP 协 议的要点是什么? 隧 道技术在多播中是怎样使用的? 4-4 1 什么是 VPN ? VPN 有什 么 特 点和优缺点? VPN 有几种类别? 4-42 什么是 NAT ? NAPT 有哪 些特 点? NAT 的优点和缺点有哪 些? 4-43 试把下列IPv4 地址从二进制记法转换为点分十进制记法。 ( I ) 1000000 I0000 I O11 0000 I O 1 1 1 1 01 1 1 1 1 ( 2) 11000001 1000001 1 000 1 01 1 1 1 1 11 1 1 1 1 (3) 111001 11 11011011 1000 101 1 01 101111 (4 ) 1111100 I 100110 11 1 1 1 1 011 1 0000 1 1 1 1 4-44 假设 段地址的首地址为1 46.10 2. 29.0 , 末 地址为1 46.10 23 一. 2. 255, 求这个地址段的 02 6 地址 数。 4-45 已知 一/27 网络中 有 一个地址是 167.199.170.82, 问 这个网络的网络 掩码 、 网络前缀 长 度 和网络后缀长度是多 少? 4-46 已知 条件同上题, 试求这个地址块的地址数、 首地址以及末地址各是多少? 4-47 某 单位 分配到 一个地址块14.24.74.0/24。 该 单位需要用到三个子网, 对这 三个子地址 块的具体 要求 是 : 子网 N 1 需要 120 个地址, 子网 N2 需要 60 个地址, 子网 N3 需要 10 个地址。 请给出地址块 的分配方案 。 4-48 如图4-80 所示, 网络 145.13.0.0/16划分为四个子网 N 1 , N2, N3 和 N4 。 这 四个子网与 路由器R 连接的接口分别是mO, m l , m2 和 m3 。 路由器R 的第五个接口m4 连接到互 联网。 网 络 1 45. 1 3.0.0/ 1 6 ' ,, 、、 -- // L.::JI 1 45. 1 3.0. l L : / 1 45. 1 3.64. 1 卢_ :' :... , 飞 ', '' I ' ' `、 一一 、 N 1 1 45 1 3 0 0/ 1 8 / , ' ,今 ,: N 2 1 4 5. 1 3.64.0/ 1 8 、、 、 、、 N ,3 1 45. 1 3. 1 28.0/ 1 8 、 、 、 、 ' `、 : 1 45. 1 3. 1 92.0/ 1 8 、、、 l I } : ' ' ( 4 :, I ' :/ ' ' ::i / ' ' ' ,户 , l ·.I... r ' , 一 ', : 、 ` 1 45. 1 3. 128. 1 --- ” - -- - -- ,,, `,、 、 1 45. 1 3. 1 92. 1 ,' / 1 , ,`、 、 、 一 、 一_ 、、 、 、 一',' , 图 4-80 习 题 4-48 的 图 (1) 试给出 路由器R 的 路由表。 (2) 路由器R 收 到 一个分组, 其目的地址是145.13.160.78 。 试给出这个分组是怎样被 转发的。 一 4-49 收 到 个分组,其目的地址 D = 11.1.2.5。 要 查 找的转发表中 有这 样三 项: 路由 1 到 达网络 11.0.0.0/8 路由 2 到 达网络 11.1.0.0/16 路由 3 到达网络 11.1.2.0/24 试问在转发 这个分组时应当选择哪一个 路由? 4-50 同上题 。假定路 由 l 的目的网络 11.0.0.0/8 中 有 一 台主机H , 其 IP 地址是11.1.2.3 。 当我们发送 一个分组给 主机 H 时, 根据 最长前缀匹配准则, 上 面的这个转发表却把 这个分组转发 到 路由 3 的 目的网络 11.1.2.0/24。 是最长前缀匹配准则有时会出错吗? 4-51 已知 - C D I R 地址块为200.56.168.0/21 。 (1) 试用二进制形式表示这个地址块。 (2) 这个 C I D R 地址块包括 有 多 少个C类地址块? 4-52 建议的 1Pv6协议 没有首部检验和。 这 样做的优缺点是什么? “ ” 4-53 在 1Pv4 首部中 有 一个 协议 字 段, 但 在 1Pv6的固 定首部中却 没有 。 这 是为什么? 207 4-54 当 使用 1Pv6时, 协议ARP是否需要 改变?如果需要 改变 , 那么应当进行概念 性的改 变 还是技术性的改 变? 4-55 1Pv6只允 许 在源点 进行分片。 这 样做有 什么好 处? 4-56 设每隔 1 微微秒就分配 出 100 万个 1Pv6地址。 试计算大约 要用多 少年 才 能将 1Pv6地 址空间 全部用光。 可 以和宇 宙的年 龄( 大 约 有 100 亿 年 ) 进行 比 较。 4-57 试把以下的 1Pv6地址用零压缩方法写成简 洁形式: (1) OOOO:OOOO:OF53:6382:AB00:67DB:B B27 :7332 (2) 0000:0000:0000:0000:0000:0000:004D:ABCD (3) OOOO:OOOO:OOOO:AF36:7328:0000:87AA:0398 (4) 2819: 00AF :0000:0000:0000: 0035:0C B2:B271 4-58 试把以下的零压缩的 1Pv6地址写成原来的形式: (1) 0: :0 (2) O:AA: :O (3) 0:1234: :3 (4) 123: :1:2 4-59 从 1Pv4 过渡到 1Pv6的方法有哪些? 4-60 多 协议标签 交换 M PLS 的工 作原理是怎样的?它 有哪些 主要的功 能? 4-61 SDN 的广义转发与传 统的基于终点 的转发 有 何区别? 4-62 试 举 出 IP 数据 报 首 部中 能 够 在 OpenFlow 1.0 中 匹 配 的三个 字 段 。 试 举 出 在 OpenFlow 中 不能匹配的三个IP数据 报 首部。 4-63 网络 如图4-81 所示。 (1)假定 路由器凡把所有发往网络前缀123.1.2.16/29 的分组都从 接口4 转发 出去。 (2)假定 路由器 R ] 要把凡发往 123.1.2.16/29 的分组从 接口 4 转发 出去 , 而把 儿 发 往 123.1.2.16/29 的分组从 接口3 转发 出去。 试问, 在上述 两种情况 下 , 你 都能够给 出 路由器 凡 的转发表吗?转发表只需要给 出 发往 123.1.2.16/29 的分组应当从哪一个接口转发 出去。 R R4 1 28. 1.2. 1 6/29 - 已 图 4-8 1 习 题 4-63 的 网 络 4-64 已知 一 具有 4个接口的路由器民的转发表 如表 4-11 所 示 , 转发表的每 一 行给 出了目 的地址的范围, 以及 对应的转发 接口。 表 4-1 1 习 题 4-64 中 路 由 器 R1 的转发表 目 的 地址范 围 转发接 口 。 最小地址 1 1 100000 00000001 00000000 00000000 最大地址 1 1 100000 00000001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 208 续表 目 的 地址范 围 转发接 口 最小地址 1 1 100000 00000000 00000000 00000000 I 最 大地址 1 1 100000 00000000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 最小地址 1 1 100000 00000010 00000000 00000000 2 最 大地址 1 1100001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 l l l l l l l l 其他 3 ( 1 ) 试把以上转发 改 换 为另一 形式, 其中的目的地址范围 改为前缀匹配, 而转发 表 表 由 4行增加为5行。 (2) 若 路由器收到一个分组,其目的地址是: (a) 11100000 I 0000001 0I O10001 01010 I O I (b) 11100000 00000000 11010111 01111100 ( c) 1110000 I 10010000 00010001 01110111 试给出每 一种情况 下分组应当通过的转发 接口 。 4-65 一 路由器连接到三个子网, 这三个子网共 同的前缀是 225.2.17/24。假定子网 N 1 要 有 62 台主机, 子网N 2 要 有 105 台主机, 而子网 凡 要 有 1 2 台主 机。 试分配这三个子网 的前缀。 4-66 图4-82 是 一 个 SDN OpenFlow 网 络。 假 定 : OpenFlow 控 制 器 00 1.3..6 : 凡 l / 00' I 、 !i4 1 t.2..4 勹:10 0 、 三 $/ l \ S2 4 00 1.3..5 -. l.2..3 0 ` 矗. I 0. 1..2 ' , ' -` l ,. 图 4-82 一 个 SDN OpenFlow 网 络 任何来自 儿 或H6 并 到达输入端 口 1 的且发往凡或 压 的分 组 , 应 通过端 口 2 转发出去 。 任 何来自 凡 或 压 并 到达输入端 口 2 的且发 往 儿 或 儿 的分组 , 应 通过端 口 1 转发出去。 任何从端 口 1 或 2 进入的且发往 儿 或 儿 的分组, 应 交付指明 的主机 ; H 3 或 儿 彼此可 以互 相发送分组。 " 试给出 交换 机 S 2 的流 项 ( 即 每 一行的 匹配 + 动 作 ” )。 表 4-67 SDN OpenFlow 网 络同 上题。 从主机 儿 或 儿 发出并 到 达 S 2 交 换 机 的 分组, 应遵循 以 下 规则: 任 何来自 压 并到达输入端 口 2 的且发往H , , H2, 儿 或H6 的分组, 应顺时针转发 出去。 209 任 何 来 自 儿 并到达输入端 口 2 的且发往 H 1 , H2, 凡 或 儿 的分组, 应逆时针转发 出去。 试给出交换机 S 2 的流表项(即 每 一 行的 匹配 + 动作 )。 " ” 4-68 SDN Op e nFlow 网 络 同 上题。 在 交 换机 S 1 和 S 3 有这样的规定 : 从源地址 凡或 儿 到 来 的分组, 将按照分组首部中的目的地址进行转发。 试给出交换机 S 1 和 S 3 的流表。 4-69 SDN Ope nFlow 网 络 同 上 题 。 假 定 我 们把交换机 S 2 作为防 火 墙。 防 火墙的行为有 以下 两种: 1( ) 对于目的地址为 压 和 儿 的分组 , 仅可转发从 凡 和 儿 发出的分组 , 也就是说 , 从 H 1 和 H 5 发出的分组应当被 阻挡。 ( 2) 仅对千目的地址为 儿 的分组才 交 付 , 也就是说 , 所有发往 儿 的分组均被 阻挡。 试分别对 上述的每 一种情况给出交换机 S2 的流表。 对于发往 其他 路由器的分组可不 用管。 210 第5章 运输层 本 章 先概括 介 绍 运输层协 议的特 点、 进程之 间 的通信 和端口等重要 概 念 , 然后讲 述 比 较简单的 UDP协议。 其余的篇 幅 都是 讨 论较为复杂但非常重要的 TCP协 议 和可靠传输的工 CD 作 原理, 包 括 停 止 等 待 协 议和 A RQ 协议。 在详细讲述 TCP 报 文 段的首部格 式 之后, 讨 论 TCP的三个重要问题: 滑动 窗口、 流量控制和拥塞控制机制。 最 后, 介 绍 TCP的连接管理。 运输层是 整个网络体系结构中的关键层次之 一 。 一 定要弄清以下 一 些 重要概 念: 1( ) 运输层为相 互通信的应 用 进程 提供逻辑通信。 ( 2) 端 口和套接字的意 义。 (3) 无连接的 UDP的特 点。 (4 ) 面向连接的 TCP的特 点。 ( 5 ) 在不可靠的网络 上实现可靠传输的工作原理, 停 止 等 待 协 议和A RQ 协 议。 ( 6 ) TCP的滑动 窗口、 流最控制 、 拥 塞控 制 和连接管 理。 5. 1 运输层协议概述 5. 1. 1 进程之 间 的 通信 从通信和信 息处理的角 度看, 运输层 向 它 上 面 的 应 用 层 提 供 通 信 服 务 , 它 属千面向通 信 部分的最高层, 同 时也是 用 户 功能中的最低层。 当网络边缘部分的两 台 主机使用网络 核 心 部分的功能进行端到端的通信时, 都要使用协议 栈中的运输层, 而网络 核 心部分中的路由器 在转发分组时只用到下三层的功能。 下面通过图 5-1 的示 意图来说明运输层的作用。 设 局 域网 LAN 1 上的主机 A 和局 域 网 LAN 2 上的主机 B 通过互 连的广 域网 WAN 进行通信。 我们知道,IP协议能够把源主机A 发 送出的分组, 按照首部中的目的地址, 送交到 目的主机 B, 那 么 , 为什么 还需要运输层呢? 从IP层来说, 通信的两端是 两 台主机。 IP数据报的首部明确地标 志了这 两 台主机的IP 地址。 但 两 台主机之间的通信 这种说法还不够明确。 真 正进行通信的实体是 在主机中的 “ ” 哪个构件 呢? 是主机中的应用进程, 是 一 台 主机中的应 用 进程和另 一 台 主机中的应 用 进程在 交换数据(即 通信)。 因此严 格地讲, 两 台 主机进行通信 就是两 台 主机中的应 用 进程互相通 信。 IP 协 议 虽 然能把分 组 送到 目 的主 机, 但是这个分组还 停 留 在 主机的网络层而没有交付 主机中的应用进程。 通信 的 两端应 当 是两个主机 中 的 应 用 进程。 也就是说, 端 到 端 的 通信是 应用进程之间的通信 。 在一 台 主机中经常有多个应用进程同 时分别和另 台 主机中的多个应 一 用进程通信。 例如, 某用户 在使用 浏 览器查找某网站的信 息时, 其主机的应用层运行浏 览器 客 户 进程。 如果在浏 览 网 页 的 同 时, 还要用 电子邮件给网站发送反馈意见, 那 么 主机的应用 $ 注 : 运 输 层 最 近 又增 加 了 第 三 种 协 议 , 即 流控制传输协议 SCTP (Stream Control Transmission Protocol) [RFC 4960 , 建 议 标准] , 它 具 有 TCP 和 UDP 协 议 的 共 同 优 点 , 可 支 持 一 些 新 的 应 用 , 如 IP 电 话 。 限 千 篇 幅 , 这 里 不 再 介 绍 。 21 1 层就 还 要运行 电 子邮件的客户 进 程 。 在图5-1 中, 主机A 的应 用 进 程AP1 和 主机 B的应 用 进 程 AP3 通信, 而与此同时, 应 用 进 程 AP2 也 和对方的应用 进 程 AP 4 通信 。 这表明运输 层 一 “ “ 有 个很重 要的功能 复 用 (m ultiplexing)和分用 (dem ultiplexing) 。 这 里的 复用 是指在发 送方 不同的应用 进 程都可以 使用 同 一 个运输 层协议传送 数据 ( 当然需要加上适当的首部 ), 而 “ ” 分用 是指接收方的运输 层在剥 去报 文的首部后能够把这些数据 正确 交付目的应用 进 程 气 ” 图 5-1 中 两个运输 层之间有 一个深 色 双 向 粗 箭 头 , 写 明 运输层提供应 用 进 程 间 的逻辑通 ” ” ” 信 。 逻辑 通信 的意 思是: 从应用 层来看, 只 要把应用 层报 文 交给下 面的运输 层,运输 层 就可 以把这 报 文传送到 对方的运输 层 (哪 怕 双方 相距 很远, 例如几千公 里 ), 好像这种通信 就是沿水平 方 向 直接传送数据 。 但事实上这 两个运输层 之间并没有 一 条水平方 向的物理连接 。 “ ” “ 数据的传送是沿着 图 中 的虚线方 向 ( 经过多个层 次 ) 传送的 。 逻辑 通信 的意 思是 好 像 ” 是这 样 通信, 但 事 实上 并 非真的这 样 通信 。 三豆 主 机 的 A 主 B 的 协议栈 Q 应 用 进程 应 用 进程 m 勹 艺 . [ 忙 … 运输层提供应用 进 程 间 的逻辑通信 机. . · 4 4 1..* ' 气享酰字心酗3酰翠咽霍覃芦霪霪霆麟单霹霉霆霉三叠“ ... IP 层 :… I 3 3 …. 2 2 …. : :' 丿 .·+ 1L … }tJ.......: ·.....................................: 主 B 主 A `、'----L---- -巴 L - 机 : :· 网 络 层 为主机之 间 的 通 信 提供服务 ,: : ' } 运 输 层 为 应 用 层进程之 间 的 通 信 提 供 服 务 \ 图5- 1 运输 层为相 互通信的应 用 进程提供 了 逻辑通信 从这 里可 以看出 网 络 层和运输 层 有 明 显的区 别 。 网络层 为主机之 间 的通 信提供服 务 , 而运输层则在 网络层的基础上 , 为 应 用 进程之间的通信提供服务 。 然而 正 如后 面 还 要讨论的, 运输层 还具 有网络层无法代 替 的许 多其他重 要功能 。 运输 层 还 要 对收 到 的报文进 行 差错检测 。 大家 应 当 还记 得, 在 网 络 层, I P数据 报 首部 中的检验和字段, 只 检验首部是否出现差错而 不检查数据 部 分 。 根据 应 用 程序的 不同需求,运输 层需 要 有两 种 不同的运输协议, 即面 向 连接的 TCP 和 无连接的 UDP, 这 两种 协议就是本章 要讨论的主要 内 容 。 我们 还应指出, 运 输层 向 高 层 用 户 屏 蔽 了 下 面 网 络核心的细节 ( 如网络拓 扑 、 所采用 的 路由选择协议等 ) , 它 使 应 用 进程看见的就是好像在两个运输层实体 之间 有一条端到端的 逻辑通信信道, 但这 条逻辑 通信 信道对上 层的表现却 因运输层 使用 的 不同协议 而 有很大的差 别 。 当运输 层采用 面 向 连接的 TCP 协议时, 尽 管下面的 网络是不可靠的 ( 只 提供尽最大努 @ 注 : IP 层 也 有 复用 和 分 用 的 功 能 。 即 在 发送 方 使 用 不 同 协 议 的 数 据 都 可 以 封 装 成 IP 数据报发送 出 去 , 而 在 接 收 方 的 IP 层 根 据 IP 首 部 中 的 协 议字段进行 分 用 , 把 剥 去 首 部 后 的 数 据 交 付 应 当 接 收 这 些 数 据 的 协 议 。 212 力 服务), 但这种逻辑 通信 信 道就相当于 一 条全双工的 可靠信道。 但当运输层采用无连 接 的 UDP 协议时, 这种逻辑 通信 信 道仍然 是 一条不可靠信道。 5. 1.2 运输层 的 两个主要协议 TCP/IP运输层的两个主要协 议都是 互联网的正 式标准, 即: ( 1) 用 户 数 据报协议 UDP( Us er Datagram Protocol) [RFC 768, STD6] (2 ) f专输t空制协议 TCP( Trans mis s ionC ontrol Protocol ) [RFC 793, STD7] 图 5- 2给出了这 两种协 议在协议栈 中 的位置。 | 应用 层 UDP TCP IP 与 各种 网 络接 口 图 5-2 TCP/IP 体 系 中 的 运输层协议 按照 OSI 的术语, 两个对等运输 实 体在通信时传送的数据单位叫作运输协议 数 据 单 元 DU ( Trans port Protocol Data Unit )。 但在 TCP/IP体系中 , 则根据所使用的协议是 TCP或 TP UDP, 分 别 称 之为 TCP 报文段( s e gment ) 或 UDP 用 户 数 据报。 UDP在传送数据之前不 需要先建立连接。 远地主机的运输层在收到 UDP报 文后, 不需 要给出任何确认。 虽 然 UDP不提供可靠交付, 但由于 UDP非常简 单, 在某些情况下 UDP 是 一种最有效的工作方式。 TCP 则提供 面 向 连接 的 服 务。 在传送数据之前必须先 建 立 连接, 数据传送结束后要释 放连接。 TCP 不 提供广播或多播服务。 由千 TCP要提供可靠的、 面向连接的运输服务, 因 此不可避免地增加了许多的开销, 如 确认、 流量控制、 计时器 以 及 连接管理等。 这 不仅使协 议数据单元的首部增大很多, 还要 占 用许多的处理机 资 源。 表 5-1给出 了 一 些应用和应用层 协议主要使用的运输 层 协 议 ( UDP或 TCP) 。 表 5-1 使用 UDP 或 TCP 协议 的各种应用和应用 层协议 应用 应 用 层协议 运输层协议 名 字转 换 DNS ( 域 名 系 统 ) UDP 文件传送 TFTP ( 简 单 文件 传 送 协 议 ) UDP 路 由 选择协议 RIP ( 路 由 信 息 协议 ) UDP IP 地址配置 DHCP ( 动 态主 机配置协 议 ) UDP 网 络 管理 SNMP ( 简 单 网 络 管 理 协 议 ) UDP 远程文件服务器 NFS ( 网 络 文 件 系 统 ) UDP IP 电 话 专用协议 UDP 流 式 多 媒体通信 专用协议 UDP 多播 lGMP ( 网 际组 管 理 协 议 ) UDP 电子邮件 SMTP ( 简 单 邮件 传 送 协 议 ) TCP 远程终端接入 TELNET ( 远程 终 端 协 议 ) TCP 万维网 HTTP ( 超 文 本 传送 协 议 ) TCP 文件传送 FTP ( 文 件 传 送 协 议 ) TCP 1 2 3 5. 1.3 运输层 的 端 口 前 面 已经 提到 过运输层的 复 用和分用功能。 其实 在 日 常生 活 中 也有很多复 用和分用的 例子。 假定 一个机构的所有部门向外 单位发 出 的公 文 都 山 收发室 负 责 寄 出 , 这相当千各部门 都 复用 这个收发室。 当收发室 收到从外 单位寄 来 的公 文 时 , 则 要完成 分用 功能 , 即 “ “ “ “ 按照信 封 上 写明的本机构的部门 地址把公 文 正确进行交付。 运输层的 复 用 和 分用功能也是类似的。 应用层所有的应用进程 都可以通过运输层再传 送到 IP层 ( 网络层), 这 就是 复 用 。 运输层从IP层收到发送给各 应用进程的数据后 , 必须 分别 交付指明的各 应用进程 , 这 就是 分用 。 显然 , 给应用层的每个应用进程赋 予 一个非常明 确的标志是 至 关重要的。 我们知道 , 在单个计算机中的进程是 用进程标 识 符( 一个不大的整数) 来 标 志的。 但 是 在互 联 网环境下 , 用计算机操作系统所指派的这种进程标 识符来 标 志运行在应用层的各种 应用进程 则是不行的。 这 是 因 为在互联网上使用的计算机的操作系统种类很多 , 而不 同 的操 作系统 又使用不 同 格式的进程标识 符。 为了使运行不 同 操作系统的计算机的应用进程能够互 相 通信 , 就必须用 统 一 的方法( 而这种方法必须与特定操作 系 统无关) 对 TCP/IP 体系的应 用进程进行标 志。 但是 , 把 一个特定机器上运行的特 定 进程 , 指明为 互 联 网上通信 的最后 终点是 不可行 的。 这 是 因为进程的创 建和撤 销 都是 动 态的, 通信的 方几乎无法知道和识 别 对方机器上的 一 进程。 另 外 , 我们往往需要利 用目的主机 提供的功能来 识 别 终点, 而不需要知道具体 实现这 个功能的进程是哪 一个 ( 例如, 要和互 联网上的某个邮件服 务器联系, 但并不 一定要知道这 个服务器功能是由目的主机上的哪 个进程实现的)。 解决这个问题的方法很巧 妙 , 就是 在应用层和运输层之间的 界 面上 , 设置 一个特 殊的 抽 象的 门 。 应用层中的应用进程要通过运输层发送到 互 联 网 , 必须要 通过这个 门 。 而别 “ ” 的主机上的应用进程要寻找本主 机中的某个应用进程 , 也必须通过这 个 门 。 这样 , 我们就可 以把应用层和运输层的界面上这 些 门 , 设为通信的抽 象 终 点 。 这 些抽 象终点的正 式 名 称 “ “ 就是 协议端 口 ( protocol port ) , 一 般就简称 为端 口 ( port )。 每 一个端口用 一个称为端 口 号( port numbe r)的正 整数 来 标 志 。 主机的操作系统 提供 了接口机制, 使得进程能够通过这种机制找 到 所要找的端 口。 请 注 意 , 这种在协议栈层 间 的 抽 象 的 协议端 口 是软件端 口 , 和路由器或 交换 机上的硬 件 端口是 完 全不 同 的概 念。 硬件端口是 不 同 硬件设备进行交互的接口, 而软件端 口 是应 用 层 的 各种协议进程与 运输实体进行层 间 交互 的 地点。 不 同的系统 具 体 实现端口的方法可以是 不 同的 ( 取决于系统使用的操作系统 ) 。 当 应用层要发送数据时 , 应用进程就把数据发送到 适当的端 口, 然 后运输层从 该 端 口 读取数据 , 进行后 续的处理 ( 把数据发送到目的主机)。 当运输层收到对方主机发来 的数据 时 , 就把数据发送到适当的端口 , 然 后应用进程就从该端口读取这 些数据。 显然 , 端口必须 有 一定容量的缓存来 暂时存放数据。 在后 面将讲到的 UDP和 TCP的首部格 式中(图 5-5 和图 5- 14) , 都有源端 口 和 目 的端 口 这 两个重要字段。 这 两个端口就是运输层和应用层进行交互的地点。 TCPI/ P的运输层用 个1 6 位端 口 号 来 标志 个端口。 但 请注 意 , 端 口 号只 具有本地意 一 一 义 , 它只是 为了标 志 本计算机应用层中的各个进程在和运输层交互时的层间接口。 在互联网 不 同 计算机中, 相 同 的端口号是 没 有 关联的。 1 6 位的端口号 可 允 许有 65535 个不 同 的端口 14 2 号 , 这个数 目对 一个计算 机来 说是足 够 用 的。 由此可见, 两个计算 机中的进 程 要 互 相通信, 不仅必须知道对方的IP地址 (为了找到 对 方的计 算 机), 而且 要知道对方的端 口 号 (为了找到 对 方 计 算 机中的应用 进 程)。 这 和我 们 寄 信 的过程类似。 当我们 要给 某 人 写 信时, 就必须 在信 封上 写 明他 的 通信 地 址 (这 是为 了 找到他的住所, 相当 于IP地址), 并 且 还 要 写上收 件 人的姓 名 (这 是因为在同 一 住所中可 能 有好几个 人, 这 相当千 端 口号)。 在信封 上 还应写 明 自 己的地址和姓 名 。 当收 信 人 回 信时, 很 容 易 在信 封上找到发 信 人 的地址和姓 名 。 互联网上的计 算 机 通信是采用 客 户 -服务 器方式。 客 户 在发 起 通信 请求时, 必须先知道对方服务器的 I P地址 (用来找到 目的 主机) 和端 口号 (用来找到目的进 程)。 因此运输 层的端 口号 分为下面的 两 大 类。 (1) 服 务 器 端 使 用 的端 口 号 这 里又 分为 两 类, 最重 要的一 类 叫 作熟知端 口 号(wel l- known port number)或全球通用 端 口 号, 数值为0~1023。 这 些熟知端 口 号最初公布 在文档中 [RFC 1700, STD2], 但后来因为互联网发展太快, 这种标准 文 档无法随时更新, 因此在 RFC 3232 中就把 RFC1700 列为陈 旧 的, 而当 前最新的熟知端 口 号可 在网 址 www.iana.org 上 查到。 I NA把这 些熟知端 口号指派给了 TCP/ IP最重要的一 些应用 程序, 让所 有的用 户 都知道。 A 当 一种新的应用 程序出现后,IANA 必须为它指派 一个熟知端 口 , 否则互联网上的其他 应用 进 程就无法和它 进行 通信。 和电话 通信对 比, 熟 知 端 口 号 相当 千所有 人 都应知晓的重 要 电话 号码, 如报警 电话 110, 急救 电话 120 等。 5-2 给出了 一 些常用 的熟知端 口 号。 表 表 5-2 常用 的熟知端 口 号 应 用 程序 I FTP I TELN ET I SMTP I DNS I TFTP I HTTP I SNMP I SNMP (trap ) I HTTPS 熟知端 口 号 I 21 23 25 53 69 80 161 1 62 443 另 一 类 叫 作登记端 口 号, 数值为 1024~49151。 这 类 端 口号是为没有熟知端 口号 的应用 程序 使用 的。 要 使用这 类端 口 号必须 在IANA按照规 定的手 续登记, 以 防 止 重 复。 (2) 客 户 端 使 用 的端 口 号 数值为 49152~65535。 由于这 类端 口号 仅 在客 户 进 程运行 @ 时才 动 态 选择, 因此又 叫 作短 暂 端 口 号 。 这 类端 口 号就是临时端 口号 , 留给客 户 进 程选择 临时 使用 。 当 服务 器进 程收 到 客 户 进 程的报文时, 就知道了客 户 进 程所使用的端 口号 , 因而 可 以把数据发送给客 户 进 程。 通信结束后, 刚才已使用 过的客 户 端 口 号就被 系 统收 回 , 以便 给其他 客 户 进 程 使用。 下 面 将 分别讨论UDP和 TCP 。 UDP比 较简 单, 本 章 主要讨论TCP 。 5.2 用 户 数据报协议 U D P 5.2. 1 UDP 概述 用户 数据报协议 UDP只在IP的数据 报 服务之上增加了 很少一 点的功能, 这 就是复 用 和分用 的功 能 以及 差错检测的功 能。 UDP的 主要特点 是: 视频讲解 CD 注 : 短 暂 端 口 (ephemeral port)[STEY94, p. 1 3]表示这种端 口 的存 在 时 间 是短 期 的 。 客 户 进 程 并 不在 意 操 作 系 统给它分配的 是 哪 一 个 端 口 号 , 因 为客 户 进程之所 以 必 须 有 一 个瑞 口 号 ( 在 本地主 机 中 必 须 是 唯 一 的 ) , 是 为 了 让运输层 的 实体 能 够 找 到 自 己 。 这和熟知 端 口 不 同 。 服 务 器 机 器 一 接通 电 源 , 服 务 器 程 序 就运 行起来。 为 了 让 互 联 网 上 所 有 的 客 户 程序都能找到服务器程序 , 服 务 器程序所使用 的端 口 ( 即 熟 知端 口 ) 就 必 须 是 固 定 的 , 并 且 是众所周 知 的 。 215 (1) UDP是无连接的 , 即发送 数据 之前不 需 要 建立连接 (当 然, 发送 数据 结束时也 没有 连接可释放 ) , 因此减少 了 开销 和发送数据 之前的时延。 (2) UDP 使用尽 最 大 努 力 交 付 , 即 不保证可靠交付 , 因此 主机不需要维持 复 杂 的连接状 态表 (这 里面有许 多 参 数)。 (3) UDP 是面 向 报文的。 发送方的 UDP 对应用程序 交 下来的报文 , 在添加首部后就 向 下 交付 IP 层。 UDP 对应用 层交 下来的报 文, 既 不 合 并 , 也 不拆 分, 而是保 留 这 些报文的边 界。 这 就是说 , 应用 层交给 UDP 多 长的报 文 , UDP 就照样发送 , 即 一 次发送 一 个报文 , 如 图 5-3 所示。 在 接收 方的 UDP , 对IP 层交 上来的 UDP用户 数据 报 , 在去 除首部后就原封 不 动 地交付 上 层的应用进 程 。 也就是 说 , UDP 一 次交付 一 个完 整的报 文。 因此, 应 用 程序必 须 选择合适 大小的报 文。 若 报 文 太长, UDP把它 交给IP 层后, IP 层 在传送时可能 要进行分 片 , 这 会降低IP 层的效率。 反之 , 若报文 太短, UDP把它 交 给IP 层后, 会 使IP 数据 报的 首部的相对长度太 大 , 这 也降低了IP 层的 效率。 应用层 运输层 IP 首 部 JP 数据 报 的 数据 部分 IP 层 图5-3 UDP 是面向报 文的 (4) UDP没有拥 塞控制 , 因此网络出现的 拥塞 不会 使源主机的发送速率 降低。 这 对某些 实时应用是很重 要的。 很 多 的实时应用 (如 IP 电 话 、 实时视频会议等) 要求源主机 以恒 定 的速率发送 数据 , 并 且 允 许 在网络发生 拥塞时丢 失 一 些 数据 , 但却 不允 许 数据 有太 大的时延。 UDP 正好适合 这 种 要 求。 (5) UDP支持 一 对 一 、 一 对 多 、 多对 一 和 多对 多的交互通信。 (6) UDP的首部开销 小 , 只有 8 个字节 , 比 TCP的 20 个字节的首部 要短。 下面举例 说明 UDP的通信 和端 口号的关 系 ( 如 图 5-4 所示 )。 主机 儿 中 有三个应用进 程分别 要 和 主机 H2 中的 两个应用进 程进行 通信。 通信 双 方的关 系 是: P] 一 凡, P2- P4 , P3 -P5 0 主机凡 的操作 系 统为这 三个进 程 分别 指派 了端 口, 其端 口号 分别为 a, b 和 c。 图 中位于应 用 层和运输 层之间的小方框代表端 口。 在端 口小 方框中间 还画 有队列, 表示端 口具 有缓存的 功能, 可 以把收 到的数据 暂时存 储 一 下。 有时也可 以把队列画成双 向 的, 即分别表示存放来 自 应用 层或运输 层的数据 。 现 在 假定主 机凡 中的进 程 已 经知道了 对方进 程 凡 和 P5 的端 口 号 分别 为 x 和 y , 于是在 主机 凡 的运输 层就可 以组装成需要发送的 UDP用户 数据 报 , 其中 最重 要的地址信 息(源端 口, 目的端 口) 分别是(a, x), ( b, x)和(c, y )。 在图 5-4 中把运输 层以下 的都省 略 了。 因此, 进 程之间的 通信 现 在可 以看成是两个端 口之间的通信。 图中 在 两个运输 层之间有 一 条 虚 线 , 表 示 在 两个运输 层之间可 以进行 通信 , 而 不是一 条连接。 但这 种 通信是不可靠的通信 , 即所发送的报 文 在传输过程中 有可能丢 失 , 同时也不 保证报文 都能按照发送的先后顺序 到 达终点。 这 正是 UDP 通信的特点 : 简 单方便 , 但 不可 靠。 如果想 要得到可靠的运输 层 通信 , 那就 要 使用后面 要介 绍 的 TCP 进行 通信。 请注意 , 在 两个运输 层的 UDP之间并 没有建立连接。 216 应 用 进程 应用层 端口 运输层 复用 分用 运输层 不 可 靠 的信 道 a x b x c --;::::y =〉... 工 请注 意 : 运输层之 间 的这条虚线不是 一 条连接 图5-4 UDP 的通信和端 口 号的关系 图 5- ) 。 如果改成 a-x, a-y, 则是 一对多的 4 的例子画出了多对 一 的通信(a-x, b - x 情况了。 主机 H 1 中的3个应用进程, 把用户 数据通过各自的端口传送到了运输层后 , 就共用 一 个网络层协 议 , 把收到的 UDP用户 数据报组装成不 同的IP数据报 , 发送到 互联网。 这 就是 UDP的复用 功能。 主机 H2 的网络层收到3个IP数据报后 , 提取出数据部分(即 UDP用户 数据报) , 然 后根据其首部中的目的端 口 号 , 分别传送到相 应的端 口 , 以便上层的应用进程 到 端口读取数据。 这 就是 UDP的分用 功能 。 虽 然 某 些 实 时 应用 需 要 使用没有拥 塞 控 制的 UDP, 但 当 很多的源主机 同 时都向网络发 送高速率的实 时视频流时, 网络就有可能发生拥 塞 , 结果大家都无法正常接收。 因此, 不使 用拥 塞 控 制功能的 UDP有可能会 引 起网络产 生严重的拥 塞问题。 还有 一 些使用 UDP 的实 时应用 , 需 要对 UDP 的不可靠的传输进行适 当 的改进, 以减 少数据的丢 失。 在这 种情况下 , 应用进程本身可以在不影 响 应用的实时性的前 提下 , 增加一 些 提高可靠性的措 施 , 如采用前向纠 错或重传 已 丢 失的报文。 5.2.2 UDP 的 首 部格式 用户 数据报 UDP有两个字段: 数据字段和首部字 段。 首部字 段很简单 , 只有 8 个字节 ( 如图 5-5 所 示) , 由4 个字段组成, 每个字段 的 长度 都 是 2字节。 各 字 段 意 义 如下: 1( ) 源端 口 源端口号。 在需要对方 回 信 时选用。 不 需 要时可用全0 。 ( 2) 目 的端 口 目的端口号。 这 在终点交付报文时必须使用。 (3) 长 度 UDP用户 数据报的长度 , 其最小值是 8( 仅有首部)。 (4 ) 检验 和 检测 UDP用户 数据报在传输中是否有错。 有错就丢弃。 4 4 字节 I I 2 - - - - - 竺 --2 __---- 2 2 俨一一一一一一 - , ·· 勿 1 1 - 伪 - -首- 部 -- IP 首 部 图5-5 UDP 用 户 数 据 报的首部和 伪 首 部 1 7 2 如果接收方 UDP 发现收到的报文中的目的端口号不正确(即 不存在对应于该端口号的 应用进程) , 就丢弃 该报文 , 并由网际控制报 文 协 议 IC MP发送 端口不可达 差 错报 文 给 “ ” 发送方 。 我们在上 章 44.. 2节 IC MP的应用举例 讨 论 trace route 时, 就是 让发送的 UDP 一 ” " 用户数据报故意使用 个非法的 UDP端 口 , 结果IC MP就返 回 端口不可达 差 错报文 , 一 “ " 因而达到了测 试的目的 。 UDP用户 数据报首部中检验和的计算方法有些特 殊。 在计算检验和时, 要在 UDP用户 数据报之前增加 1 2个字节的伪 首部 。 所 谓 伪 首部 是 因为 这种伪 首部并不是 UDP用户 数 “ ” 据报真 正 的首部。 只是在计算检验和时, 临 时添加在 UDP 用户 数据报前面 , 得到 一个临时 的 UDP用户 数据报 。 检验和就是按照这个临时的 UDP用户 数据报 来 计算的 。 伪 首部既不向 下传送也不向上递交, 而仅仅是 为 了计算检验和 。 图 5-5 的最上面给出了伪首部各 字段的 内 容。 UDP计算检验和的方法和计算IP数据报首部检验和的方法相 似 。 但不 同 的是 : IP数据 报的检验和只检验IP数据报的首部, 但 UDP的检验和是 把首部和 数 据部分—起都检验 。 在 发送方 , 首先是先把全零放入检验和字段 。 再把伪 首部以及 UDP 用户 数据报看成是 由许多 1 6 位的字 串 接起来 的。若 UDP用户 数据报的数据部分不是 偶数个字节 , 则要填 入 一个全零 字节(但此字节不发送) 。 然 后 按 二进制反码计算出这 些1 6 位字的和 。 将此和的二进制反码 写入检验和字段后 , 就发送这样的 U DP用户 数据报 。 在接收方 , 把收到的 UDP用户数据报 连同 伪 首部(以及可能的填 充 全 零 字 节) 起 , 按 二进制反码求这 些 1 6 位字的和 。 当无差 一 错时其结果应为全 l 。 否则就表明有差错出现 , 接收方就应丢弃这个 UDP 用户 数据报(也 可以上交给应用层 , 但附上出现了差错的警告)。 图 5-6 给出了 一个计算 UDP检验和的例子 。 这 里假定用户 数据报的长度是 1 5 字节 , 因此要添加一个全0 的字节 。 读者 可 以 自 己检验 一 下在接收端是 怎样对检验和进行检验 的 。 不难看出, 这种简单的差 错检验方法的检错能 力并 不强 , 但 它的好处是简单 , 处理起来 较 快。 I 00 I I00 I 000 I00 I I --- I 5 3. I9 00001000 01 I0 1 000 --- 8.104 1 53. 19.8 4. 1 0 IO I O I O11 000000 I I 一 171 3. 12 字 伪 171 14..3. 1 1 00001110 0000 1 011 --- 14. 1 1 部 全 o I 17 15 00000000 000 I 000 1 --- 0 禾廿 17 u节 首 00000000 0000 I 1 1 I --- 1 5 字节 首 1087 13 8 00000 1 00 00 1 11 I I 1 - 1087 部 15 全0 00000000 0000 1 1 0 I --- 1 3 L4;T Dp 今 4尸』, 节 00000000 00001 I 1 1 --- 1 5 7 字 数据 00000000 00000000 --- 0 ( 检验和 ) 数据 1 数据 数据 1 数 据 数据 1 数 据 数据 匡 o 0 1 0 I O I 00 0 I000 l O I 0 1 0 1 00 I 1 01 0 1 0 I 00 --- 数据 填充 0100 I0 0 I O10 0 1 I IO --- 数据 0 1 000 1 1 1 00000000 --- 数 据 和 0 ( 填 充 ) --- 数据 按二进制反码运算求和 I 00 IO 1 1 0 1 1 I O I IO 1 --- 求 和 得出 的结果 将得出 的 结果求反码 0 1 1 0 1 00 1 0001 00 1 0 --- 检验和 图5-6 计算 UDP 检验和的例 子 如图 5-6 所示 , 伪 首部的第 3 字段是 全零 ; 第 4 字 段是 I P 首部中的协议 字段的值 。 以 , 此协 议 字 段值为1 7; 第 5 字段是 UDP用户 数据报的长度。 因此, 这 前 曾 讲过 , 对千 UDP 样的检验和 , 既检查了 U DP用户 数据报的源端口号和目的端口号以及 UDP用户 数据报的数 据部分 , 又检查了IP数据报的源IP地址和目的地址 。 12 8 扫- -扫 5.3 传输控制协议 TC P 概述 由千 TCP 协 议比较复杂 , 因 此 本节 先对 TCP 协议进行 般的介 绍 , 然 一 后再逐步深入讨 论 TCP 的可靠 传 输 、 流量控 制和拥 塞 控制等问题。 视频讲解 5.3. 1 TCP 最主 要 的 特 点 TCP 是 TCP/IP 体系中非 常 复杂的 一个协议。 下面介 绍 TCP 最主要的特点。 ( 1 ) TCP 是 面 向 连 接 的 运输层协议。 这就是说 , 应用程序在使用 TCP 协议之前, 必须先 建立 TCP 连接。 在传送数据完 后 毕 , 必须释放 已经建立的 TCP 连接。 也就是说 , 应用进程 之 间的通信好像在 打 电 话 : 通话前要先 拨 号 建 立连接, 通话结束 后要挂机释放连接。 “ ” ( 2 ) 每 条 TCP 连接只 能有两个端 点(endpoint) , 每 条 TCP 连接只 能是 点对点的( 一 一 一 对 )。 这个问题 后面还要进 步 讨 论。 一 一 (3) TCP 提供可靠交付的服务。 通过 TCP 连接传送的数据 , 无差错 、 不丢 失 、 不重复 , 并且按 序到达。 (4) TCP 提供 全双工通信 。 TCP 允 许 通信 双 方的应用进程在任 何 时候 都能发送数据。 TCP 连接的两端 都设有发送级存和接收 缓存, 用来 临 时存放双向通信的数据。 在发送时 , 应用程序在把数据传送给 TCP 的缓存 后 , 就可以做 自 己的事 , 而 TCP 在合适的时候把数据 发送出去。 在接收 时 , TCP 把 收到的数据放入 缓存, 上层的应用进程在合适的时候读取缓 存中的数据。 (5) 面 向 字节流。 TCP 中的 流 (stream)指的是 流入到进程或从进程流 出 的 字节序列。 “ ” 面向字节流 的含义是: 虽然 应用程序和 TCP 的交 互是 一 次 一个数据块(大小不等) , 但 “ ” TCP 把应用程序 交下来 的数据仅仅看成是 一 连串 的无结构 的字节流。 TCP 并不知道所传送的 字节流的含义 。 TCP 不保证接收 方应用程序所 收到的数据块和发送方应用程序所发出的数据 块具有对应大小的关系(例如, 发送方应用程序交给发送方的 TCP 共 1 0 个数据块 , 但接收 方的 TCP 可能 只 用了 4 个数据块就把收到的字节流交付上层的应用程序)。 但接收 方应用程 序 收到的字节流必须和发送方应 用程序发出的字节流 完 全 一样。 当然 , 接收方的应用程序必 须有能力 识 别 收到的字节流 , 把它还原成有意 义的应用层数据。 图 5-7 是 上述概念的示 意 图。 送方 发 回 表示 TCP 报 文段 的首 部 匾 应用 进程 曰 表示 序 号 为 x 的数据字节 _ 字 节 流 0-l_2一3一 字节流 _ TCP连接像 一 条管道 , 把字节流可靠地按序 送到 目 的进程 图 5-7 TCP 面 向 字节 流 的 概 念 传 219 为了突出示 意 图的要点, 我 们 只 画出了 一个方向的数据 流。 但请 注 意 , 在 实 际的网络 中 , 一个 TCP 报 文 段包含上千个字节是很常 见的, 而图中的各部分都只画出了几个字节 , 这 仅仅是 为了更方便地说明 面向字节流 的概念。 另 一 点很重要的是: 图 5-7 中的 TCP “ ” 连接是 条虚连接 ( 也就是逻辑连接 ) , 而不是 一条真 正的物理连接。 TCP 报 文 段先要传送 一 到 IP层 , 加上 IP首部 后 , 再传送到数据 链路层;再加上数据 链路层的首部和尾部 后, 才离 开主机发送到物理链路。 从图 5- 7可看出, TCP和 UDP在发送报文 时所 采用的方式完 全不 同 。 TCP并 不关心应 用进程一 次把多长的报文发送到 TCP 的缓存中 , 而是 根据对方给出的窗口值和 当前网络拥 塞 的程度(后面还将 深入讨 论) , 来决定 一个报文段应包含多少个字节 ( UDP 发送的报文 长 度是应用进程给出的)。 如果应用进程传送到 TCP缓存的数据 块太长 , TCP就可 以 把它 划 分 为短 一 些的数据 块 再传送。 如果应用进程 一 次只发来 一个字节 , TCP 也可以等 待 积 累 足够 多的字节后再构成报文 段发送出去。 关千 TCP报 文 段的长度问题, 在后面还要进行讨论。 5.3.2 TCP 的 连接 TCP把连接作为最 基 本 的 抽 象。 TCP的许多特 性都与 TCP是 面向连接的这个基本特 性 有关。 因此我们对 TCP连接需要有更清 楚的了解。 前面 已经讲过, 每 一条 TC P 连接有两个端点。 那么, TCP连接的端点是 什么呢 ? 不是 主机 , 不是主机的 IP地址 , 不是应用进程 , 也不是运输层的协 议 端 口。 TCP连接的端点叫 作套接字( s ocke t 或 ) 插 口 。 根据 RFC 793的定 义: 端 口号 拼接到( concate nate d with ) IP地址即 构成了套接字。 因此 , 套 接字的表示 方法是在点分十进制的 I P 地址 后面写 上端口号 , 中 间 用 冒 号或 逗 号 隔 开。 例如 , 若 IP地址 是 1 92 3..5 而端 口号是 0. 4 8 , 那么得到的套接字就是 ( 192 3. 4..5: 0 8 )。 总 之 , 我们有 套接字 s ocke t = (IP地址: 端口号) ( 5- 1) 每 一 条 TCP 连接唯 一 地被通信 两 端 的 两个端点 (即 套接字对 s ocke t pair ) 所确定。 即 : TCP连接 : : = { s ocke t 1 , s ocke t2 } = { (IP1: p ort 1 ), (IP2: port2 )} ( 5- 2 ) 这 里 IP1 和 IP2 分别 是两个端点主机的IP地址 , 而 port 1 和 p ort2 分别 是 两个端点主机中 的端口号。 因此, TCP连接就是 两个套接字 s ocke t 1 和 s ocke t2 之 间的连接。 套 接字 s ocke t 是 个很抽 象的概念 , 在下 一 章的 6. 8 节还要对套接字进行更 多的介绍。 总 之 , TCP 连接就是 由协 议 软件 所提供的 一种抽 象。 虽 然 有时为了方便, 我们也可以 说 , 在 一个应用进程和另 一个应用进程之 间 建立了 一条 TCP连接, 但 一 定 要记住: TCP 连 接 的 端点 是个很抽 象 的 套 接字 , 即 ( IP 地址 : 端 口 号)。 也还应记住: 同 一个 IP 地址可以 有多个不 同的 TCP连接, 而 同 一个端 口号 也可以出现在多个不 同的 TCP连接中。 本来 s ocke t 的意 思就是 插座(或插 口 )。 选用 s ocke t 这个名 词是相 当准确的。 其实 条 一 TCP 连接就像 一条 电 缆 线 , 其两端 都各带有 一个插 头。 把每一 端的插 头 插入位千主机的应 ) , 两个主机之 间 的进程就可以通过这条 电 缆 线进行可靠 用层和运输层之 间 的插 座 ( s ocke t后 通信 了。 但插座这个 名 词很容易 让 人 想起来 是个硬件 , 而 s ocke t 是个软 件 名 词 , 这样 套 " 接字 就成为 s ocke t 的标 准 译 名 了。 ” 请 注 意 , s ocke t 这个名 词有时容易使人把 一 些 概 念 弄 混淆 , 因为随 着 互联网的不断发展 2 20 以及网络技术的进 步, 同 一 个名 词 socket 却可表 示 多 种 不 同的意思。 例如: (1 ) 允 许 应用 程序访问连网协议的应 用 编程接 口 API (Application Program m ingInterface), 即运输 层和应用 层之间的一 种 接口, 称为 socketAPI, 并 简 称为socket。 (2) 在 socketAPI 中使用的一个函 数名 也叫作 socket。 “ ” (3) 调用 s ocket 函 数的端点 称为socket, 如 创 建 一个数据 报 socket 。 (4) 调用 socket 函 数时,其返 回 值 称为socket 描述符, 可简 称为socket。 (5) 在操作系 统 内 核中连网协议的Berkeley 实现, 称为socket 实现。 上 面的这些 socket 的意 思 都 和本章所引 用的 RFC 793 定义的 socket ( 指端 口号 拼 接到 I P地址) 不 同。 请读者加 以注意。 5.4 可靠传输 的 工作原理 我们知道, TCP发送的报 文 段是交给IP层传送的。 但IP层只能提供尽最大努力 服务, 也就是说 , TCP 下 面的网络所提供的是不可靠的传 输。 因此, TCP必须采用适当的措施 才 能 使得 两个运输 层之间的 通信 变 得 可靠。 理想的传输条件 有 以下 两个特点 : (1) 传输信道不产生差错。 (2) 不管发送方 以多 快的速 度发送数据 , 接收方总是来得及 处理收到的数据 。 在这样的理想传输条件下, 不需要采取 任何措施就能够 实现可靠传输。 然 而实际的网络 都 不具备 以上 两个理想 条件。 但我们 可 以 使用 一 些可靠传 输 协 议, 当 出现差错时让发送方重传出现差错的数据 , 同时在 接收 方来 不及 处理收 到的数据时, 及时告 诉发送方适当降低发送 数据 的速率。 这样一来, 本来不可靠的传输信道就能够 实现可靠传输 了。 下面从最简 单的停止等待 协议 气 井起。 5.4. 1 停止等待协议 全双 工 通信 的双 方 既是发送方也是接收方。 下面为了讨论问题的方便, 我们仅考 虑 A 发送 数据 而B 接收 数据 并 发送确认。 因此A 叫作发送方, 而 B 叫作接收方。 因为这 里是讨 论可靠传输的原理, 因此把传送的数据 单元都称为分组, 而 并 不考虑 数据 是在哪一个 层次上 “ ” 传送的气 停 止等待 就是每发送完 一个分组就停 止发送, 等待 对方的确认。 在收到确认 后再发送下一个分组。 1. 无差错情况 停 止等待协议可用 图 5-8 来 说 明。 图 5-8(a)是最简 单的无差错情况。 A发送分 组M l , 发 完就暂停发送, 等待 B的确认。 B收到了M 1 就 向 A 发送确认。 A 在收到了对M 1 的确认后, O 注 : 在 计算 机 网 络 发展初期 , 通信 链 路 不 太可靠, 因 此在链路层传送数 据 时 都要 采 用 可 靠 的 通信 协议。 其 中 最简 单 的 协 “ ” 议就是这种 停止等待协议 。 在运输层 并 不 使 用 这 种 协议 , 这里 只 是为 了 引 出 可靠传输 的 问 题才从最简 单 的 概念讲起 。 在 运 输 层 使 用 的可靠传输协 议 要 复 杂 得 多 ( 见后 面 5.6 节 )。 @ 注 : 运输层传 送 的 协 议 数据 单 元 叫 作 报文段 , 网络层传 送 的 协议数据单元 叫 作 IP 数据报 。 但在 一 般讨论 问 题 时 , 都 可 把 它 们 简 称 为 分组。 221 就再发送下 一个分组 M2 。 同样 , 在收到 B 对 M2 的确认后, 再发送 M狂 I A 8 A B 发送 M 1 k M 确认 M1 . - . 一 _一 、 _ _一X_ 一_ _-一 ___- _- . 丁- 发 送 M 2 巨- 确认 M 2 , 发 送 M., 4它 超时 重传 J | / 确认 M1 发送 M 3 巨. 发送 M2 确认 M 3 lt (a) 无差错情况 (b) 超时重传 图5-8 停止等待协议 2. 出 现差错 图 5-8( b) 是分组在传输过程中出现 差 错 的情况。 B 接收 M ] 时检测出了差 错 , 就丢弃 M, 1 其 他什么也不做 ( 不通知A 收到有差错的分组) 。 也可能是 M ] 在传输过程中丢 失了, 这 印 时 B 当 然 什么都不知道。 在 这 两种情况下 , B 都不会发送任 何信 息 。 可 靠传输协 议是 这样 设计的: A 只要超过了一 段时间仍然 没有收到 确认, 就认为刚 才发送的分组丢 失了, 因而重 传前面发送过的分组。 这 就叫作超时重传。 要实现超时重传, 就要在每发送完 一个分组时设 置 一个超 时计时器。 如果在超时计时器到 期之前收到了对方的确认, 就撤销 己设置的超时计 时器。 其 实 在 图 5-8( a)中, A 为每 一个 已发送的分组都设置了 一个超时计时器 。 但A 只要在 超时计时器到 期 之前收到 了相 应的确认, 就撤销 该超时计时器。 为简单起见, 这 些细节在图 5-8( a)中都省 略了。 这 里 应注意 以下 三点 第 一 , A 在发送完 一个分组 后 , 必须 暂 时保 留 已 发 送 的 分组 的 副 本 ( 在发生超时重传时 使 用 ) 。 只有在收到相 应的确认后才能清 除 暂 时保 留 的分组副本。 第 二 , 分组和 确认分组都必须进行编 号 气 这样才能明确是 哪 一个发送出去的分组收到 了确认, 而哪 一个分组还没有收到确认。 第 三 , 超 时计时器设置的重传时 间 应 当 比 数 据在 分组传输 的 平 均 往 返 时 间 更 长 一 些 。 图 5-8( b)中的一 段虚线表示 如果 M ] 正 确 到达 B 同 时A 也正确收到确认的过程。 可见重传时 间应设定为比平均往返时间更长 一 些 。 显然 , 如果重传时间设定得很长 , 那么通信的效率就 CD 注 : 在可靠传输的协议中 , 也 可 以 在检测 出 有差错时 发送 " 否认报又 “ 给对方。 这样做 的好处是能够让发送方及早知道 出 现 了 差错 。 不过 由 于这样处理会使协议复杂化, 现在实 用 的 可靠传输协议都不 使 用 这种 否认报文 了 。 @ 注 : 编 号 并不是 一 个非常 简 单 的 问 题 。 分组编号使用 的位数总是有限 的 , 同 一 个号码会重复使用 。 例 如 , 1 0 位的编号 范 围 是 0 - 1 023 。 当编号增加到 1 023 时 , 再增加 一 个 号 就 又 回 到 O , 然后重复使用 这些号码 。 我们 的家用 电 表 、 水表 , 以及汽 车 中 的里程表 , 都有类似 的 问 题 。 因 此 , 在所发送的分组 中 , 必须能够区分开哪些是新发送的 , 哪些是重传 的 。 对千简单链路上 传送的帧 , 如采用 停止等 待协议 , 只 要用 1 位编号 即 可 , 也就是发送完 0 号 帧 , 收到确认后, 再发送 l 号 帧 , 收到确认后 , 再发 送 0 号 帧 。 但是在运输层 , 这种编号方法有时并不能保证可靠传输 ( 见 习 题 5- 1 8 ) 。 222 会 很低 。 但 如果重传 时 间 设 定得太短, 以致产生 不必要的重传 , 就浪 费 了网络资源。 然而 , 在运输 层重传 时 间的准确设 定是非常复杂的, 这 是 因 为已发送出的分组到底会经过哪 些 网 络 , 以及 这 些网络将 会产生 多 大 的 时延 ( 这 取 决 千 这 些网络当 时的拥 塞情况 ) , 这 些都是不确定 因 素 。 图 5-9 中把往 返 时 间当作固 定的 (这 显 然 不符合网络的实 际情况), 只是为了 讲述原 理的方便。 关 千 重 传 时间应 如何 选择, 在后面的 5.6.3 节 还 要进 一 步讨论。 3. 确认丢失和确认迟到 图 5-9(a) 说明的是另一种情况 。 B 所发送的对 M 1 的确认丢 失 了 。 A 在设 定的超 时 重 传 时 间 内 没有收 到确认, 并 无法知道是自 已发送的分组出错 、 丢 失 , 或者是 B 发送的确认丢 失 了 。 因 此 A 在超时计 时 器到期 后就 要重 传 M 1 。 现在应注意 B 的动 作。假定 B 又收 到了 重 传的分组M 1 。 这时应采取 两 个行动 。 第一 , 丢弃这个重 复的分组M 1 , 不向 上 层重 复 交付。 第二 , 向 A 发送 确认。 不能认为已经发送过确认就 不再发送 , 因 为A 之所以 重传 M 1 : 就表 示A 没有收 到对M 1 的确认。 B A, B A 丁3 发 送 MI 发送 M l l 确认 MI L l - - - ­ -_ 超 时 重 传 M 超时重 MI— 传 送 M2 送 M2 发 发 收下迟 到 的 确 认 但什么 也 不 做 (a) 确 认 丢 失 (b) 确 认 迟 到 图5-9 确 认 丢 失和 确 认 迟 到 图5-9(b)也是一种可能出现的情 况 。 传 输过程中 没有出现差错, 但 B 对分组 M ] 的确认 迟到了 。 A 会收 到重 复的确认。 对重 复的确认的处理很简 单: 收 下 后就丢 弃 , 但 什么也 不做 。 B 仍然会收到重 复的M 1 , 并 且 同样 要 丢 弃 重 复的M j , 并 重传确认分组。 通常A 最终总是可 以收到对所有发出的分组的确认 。 如果 A 不断重传 分组但总是收 不 到确认, 就 说明通信 线 路太差 , 不能进 行 通 信 。 使用上述的确认和 重 传 机制, 我们就可 以在不可靠的传输网络上实现可靠的通信 。 像上述的这种可靠 传输协议常称 为 自 动 重传请求 ARQ (Automatic Repeat reQuest ) 。 意 思 是重传的请求是自 动进 行的, 因 此也可见到自 动请求重传这样的译 名 。 接收方不需要请求发 送方重传 某 个出错的分组 。 4. 信道利 用 率 停 止等待 协议的优点是简 单 , 但缺点 是信道利用率太低 。 我们 可 以用图 5-10 来 说明这 一 个问题。 为简 单起 见 , 假定在A 和 B之间有 条直通的信道来传送分组。 223 图 5- 1 0 停 止 等 待 协 议的信 道 利 用 率太低 假定 A 发送分组需 要的时间是 TD 。 显 然, 几等千分组长度 除 以 数据 率 。 再 假定 分组 正 确到达 B 后,B 处理分组的时间可 以 忽 略不计, 同时立 即发 回 确认 。假定 B发送确认分组 需 要时间 TA 。 如果A 处理确认分组的时间也 可 以 忽 略不计, 那么A 在经过时间(To + RTT + 一 八)后就可 以 再发送下 个分组, 这 里的 RTT 是往返 时 间。 因 为仅仅是在时间 几 内 才用来 传送 有用的数据 ( 包括 分组的首部), 因此信道的利用率 U 可用 下式计算 : U= TD LD + RTT + TA (5-3) 请注意 , 更细致的计 算 还可 以 在上式分子的时间 几 内 扣 除传送 控制信 息( 如首部) 所 花 费的时间。 但 在进行粗略计算时, 用近似的式(5-3)就可 以 了 。 我们知道, 式(5-3 )中的往返时间RTT 取 决 千所使用的信道。 例如,假定 1200 km 的信 道的往返 时间RTT = 20 m s , 分组长度是1200 bit , 发送速率是1 Mbit/s 。 若 忽 略 处理时间和 TA ( TA 一 般 都远小千 T矿, 则 可算出信道的利用率 U = 5.66% 。 但若把发送速率 提 高到 10 Mbit/s , 则 U = 5.96X 10-3 。 信道在绝 大 多 数 时间内 都是空 闲 的。 从图 5-10 还可看出, 当往返时间RTT 远 大 于分组发送时间 几 时, 信道的利用率就会 非常低 。 还应注意 的是, 图 5-10 并 没有考虑出现差错后的分组重传 。 若出现重传, 则 对传 送 有用的数据 信 息来说, 信道的利用率就 还 要 降低 。 为了提 高传 输 效 率, 发送方可 以 不使用低 效 率 的停 止等待 协议, 而是采用流水线传输 (如图5-11 所示) 。 流水线传输就是发送方可连续发送 多个分组, 不必每发完 一个分组就停 顿 下来等待 对方的确认 。 这 样可 使信道上 一 直有数据 在不间断 地传送 。 显 然, 这种传输方式 可 以 获得 很高的信道利用率 。 //饕荨鬟 : 图 5- 1 1 流水线传输可提高信 道 利 用 率 当使用流水线传输时, 就 要 使用下面介绍 的连续ARQ 协议 和滑动 窗 口 协议 。 5.4.2 连续 ARQ 协 议 滑 动 窗 口协议 比较复杂, 是TCP协议的精髓所在 。 这 里先给出连续ARQ 协议最基本的 概念, 但不涉及许 多 细节问题 。 详细的滑动 窗 口协议将 在后面的 5.6节中讨论。 图 5-12(a)表 示发送方维 持的发送 窗 口 , 它 的意 义是: 位 千发送窗 口内 的 5 个分组都可 224 连续发送出去, 而不需要等待对方的确认。 这样, 信 道利 用率就 提高了。 在讨 论 滑 动 窗 口时, 我们应当注 意 到 , 图中还有 一个时间坐 标 ( 但以后 往 往 省 略 这样 的时间坐标)。 按照习惯, 向前 是 指 向着时间增大的方向 , 而 向后 则是 向着时 “ ” “ “ “ ” “ 二二 间 减少的方向 。 分组发送是按照分组序 号从小到大发送的。 ” 分 的序号 送窗 口 发 I I I | 7 | 8 | 9 | 10 | l l I 1 2 | 组 6 (a) 送窗 口 是 5 发 送 口 窗 一向前 发 3 8 2 4 5 6 7 9 10 11 12 伽 t 一 ( b) 收 到 个确 认 后 送 窗 口 向 前滑动 发 图 5- 1 2 连续 ARQ 协议 的 工 作 原理 连续 A RQ 协 议 规 定 , 发送方每收到 一 个确认, 就把发送窗口向前滑动 一个分组的位置。 图 5-1 2( b )表示发送方 收到 了对第 1 个分组的确认, 千是把发送窗 口 向前移动 一个分组的位 置。 如果 原 来 已经发送 了前5个分组, 那么现在就可以发送窗口内 的第 6 个分组了。 接收 方 一 般 都 是 采用 累 积 确 认的方 式。 这 就是说, 接收 方 不必对收 到的分组逐个发送 确认, 而是在收到 几个分组后 , 对按 序 到 达 的 最 后 — 个分组发送确认, 这 就表示: 到 这个分 组为止的所有分组都 已 正 确 收到了。 累 积确认有优点也有缺点。 优点是 容 易 实现, 即 使确认丢 失 也不必重传 ; 但缺点是不 能向发送方及时反 映 接收 方 已 经 正 确收到 所有分组的信 息。 例如, 如果发送方发送了前 5 个分组, 而中间的第 3 个分组丢 失 了。 这 时接收方只能 对前两个分组发出确认。 发送方无法知 道后 面三个分组的下落, 而只好把后 面的三个分组都 再重传一次。 这 就 叫作 Go-back-N ( 回 退 N), 表示需要再退 回 来 重传已发送过的 N 个分组。 可见当通信 线路质 量 不好时, 连续A RQ 协 议会带 来 负 面的影 响。 在深入讨 论 TCP的可靠传输问题之前, 必须先了解 TCP的报文段首部的格式。 5.5 TCP 报文段 的 首 部格式 TCP 虽然 是 面向字节流的, 但 TCP传送的数据单元 却 是 报文 段。 一个 TCP 报 文 段分为首部和数据 两部分, 而 TCP的全部功能都体现在它首部中 各 字段的作用。 因此, 只有弄清 TCP首部各 字段的作用才能掌握 TCP的工 作 原 理。 下面讨 论 TCP报 文段的首部格 式。 TCP报文段首部的前 02 个字节是 固定的( 如图 5- 1 3 所 示), 后 面有4n 字节是 根据需要 而增加的选项 ( n 是 整数)。 因此 TCP首部的最小长度是 02 字节。 ?