第 23 章 进程到进程的传递 : UDP, TCP 和 SCTP 23.1
23-1 进程到进程的传递 传输层负责进程到进程的传递, 即进程之间的分组传递以及部分消息传递 后面将会看到两个进程以客户 / 服务器的方式通信 23.2 本节要点 : 客户端 / 服务器模式复用和分离无连接服务与面向连接的服务可靠服务与不可靠服务三种协议
注意 传输层负责进程到进程的传递 23.3
23.4 图 23.1 数据传送类型
23.5 图 23.2 端口号
23.6 图 23.3 IP 地址与端口号
图 23.4 IANA 范围 IANA(Internet Assigned Number Authority ) 因特网号码分配管理局 23.7
图 23.5 套接字地址 IP 地址 + 端口 = 套接字套接字唯一标识了一个进程 23.8
23.9 图 23.6 复用和分离
服务 无连接服务 (connetionless service),udp 面向连接的服务 (connection-oriented service),tcp,sctp 可靠服务, TCP,SCTP 不可靠服务,UDP 23.10
23.11 图 23.7 差错控制
23.12 图 23.8 UDP, TCP, 和 SCTP 在 TCP/IP 协议簇中的位置
23-2 用户数据报协议 (UDP) 23.13 用户数据报协议 (UDP) 称为无连接不可靠的传输层协议 它除了提供进程到进程通信而不是主机到主机的通信外, 就没有给 IP 服务增加任何东西 本节要点 : UDP 的熟知端口用户数据报校验和 UDP 的操作 UDP 的使用
23.14 表 23.1 UDP 使用的熟知端口
例 23.1 在 UNIX 中, 熟知端口存储在 /etc/services 文件中 这个文件中的每行给出服务器名和端口号 我们可以用 grep 命令提取该行所对应的应用 下面表示了 FTP 的端口 注意 :FTP 可使用 UDP 或者 TCP 的端口号是 21 23.15
例 23.1 ( 续 ) SNMP 使用两个端口号 (161 and 162), 我们将会在 28 章看到, 他们每一个用于不同目的 23.16
23.17 图 23.9 用户数据报格式
注意 UDP 长度 =IP 长度 IP 头部长度 23.18
23.19 图 23.10 用于校验和计算的伪头部
例 23.2 图 23.11 给出了只有 7 个字节数据的很小的用户数据报的校验和计算 因为数据的字节数是奇数, 因此为了计算校验和需要填充 当用户数据报传递给 IP 时, 就将伪头部和填充部分丢弃 23.20
23.21 图 23.11 简单 UDP 用户数据报的校验和计算
23.22 图 23.12 UDP 中的队列
UDP 的使用 适用于需要有简单请求 - 响应通信的进程, 如 P2P 应用 适用于具有内部差控和流控的进程, 如 TFTP 适用于多播 适用于网络管理 :SNMP 可用于 RIP 这样的路由协议 23.23
UDP 的操作 无连接的服务 不可靠传输服务, 没有流量控制, 也没有窗口机制 ; 除校验和之外, 没有差错控制 ; 因此使用 UDP 的进程自己必须要有流控和差错控制 封装和拆封装 排队 23.24
23-3 TCP TCP 是一个面向连接的协议 ; 它在两个 TCP 之间建立一个虚拟连接来发送数据. 另外, TCP 在传输层使用流量控制和差错控制机制. 23.25 本节要点 : TCP 服务 TCP 特点段 TCP 连接流量控制差错控制
23.26 表 23.2 TCP 使用的熟知端口
23.27 图 23.13 字节流传递
23.28 图 23.14 发送和接收缓冲区
23.29 图 23.15 TCP 段
注意 在每个连接中传送的字节都由 TCP 编号, 序号开始于一个随机产生的数 23.30
例 23.3 如下展示了每一个段的序号 : 23.31
注意 一个段的序号字段的值定义为该段包含的第一个字节的序号 23.32
注意 段中确认字段的值定义了通信一方预期接收的下一个字节的编号 确认号是累加的 23.33
23.34 图 23.16 TCP 段格式
32 bit 比特 0 8 16 24 31 源端口 目的端口 序号 TCP 首部 数据偏移 保留 U R G A C K P S H R S T 确认号 S Y N F I N 窗口 20 字节的固定首部 检验和 紧急指针 选项 ( 长度可变 ) 填 充 TCP 报文段 TCP 首部 TCP 数据部分 发送在前 IP 首部 IP 数据部分
比特 0 8 16 24 31 源端口 目的端口 TCP 首部 序号 确认号 20 字节固定首部 数据偏移 保留 U R G A C K P S H R S T S Y N F I N 窗口 检验和 紧急指针 选项 ( 长度可变 ) 填 充 源端口和目的端口字段 各占 2 字节 端口是运输层与应用层的服务接口 运输层的复用和分用功能都要通过端口才能实现
比特 0 8 16 24 31 源端口 目的端口 TCP 首部 序号 确认号 20 字节固定首部 数据偏移 保留 U R G A C K P S H R S T S Y N F I N 窗口 检验和 紧急指针 选项 ( 长度可变 ) 填 充 序号字段 占 4 字节 TCP 连接中传送的数据流中的每一个字节都编上一个序号 序号字段的值则指的是本报文段所发送的数据的第一个字节的序号
比特 0 8 16 24 31 源端口 目的端口 TCP 首部 序号 确认号 20 字节固定首部 数据偏移 保留 U R G A C K P S H R S T S Y N F I N 窗口 检验和 紧急指针 选项 ( 长度可变 ) 填 充 确认号字段 占 4 字节, 是期望收到对方的下一个报文段的数据的第一个字节的序号
比特 0 8 16 24 31 源端口 目的端口 TCP 首部 序号 确认号 20 字节固定首部 数据偏移 保留 U R G A C K P S H R S T S Y N F I N 窗口 检验和 紧急指针 选项 ( 长度可变 ) 填 充 数据偏移 占 4 bit, 它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远 数据偏移 的单位不是字节而是 32 bit 字 (4 字节为计算单位 )
比特 0 8 16 24 31 源端口 目的端口 TCP 首部 序号 确认号 20 字节固定首部 数据偏移 保留 U R G A C K P S H R S T S Y N F I N 窗口 检验和 紧急指针 选项 ( 长度可变 ) 填 充 保留字段 占 6 bit, 保留为今后使用, 但目前应置为 0
23.41 图 23.17 控制字段
23.42 表 23.3 控制字段的标志描述
比特 0 8 16 24 31 源端口 目的端口 TCP 首部 序号 确认号 20 字节固定首部 数据偏移 保留 U R G A C K P S H R S T S Y N F I N 窗口 检验和 紧急指针 选项 ( 长度可变 ) 填 充 窗口字段 占 2 字节 窗口字段用来控制对方发送的数据量, 单位为字节 TCP 连接的一端根据设置的缓存空间大小确定自己的接收窗口大小, 然后通知对方以确定对方的发送窗口的上限
比特 0 8 16 24 31 源端口 目的端口 TCP 首部 序号 确认号 20 字节固定首部 数据偏移 保留 U R G A C K P S H R S T S Y N F I N 窗口 检验和 紧急指针 选项 ( 长度可变 ) 填 充 检验和 占 2 字节 检验和字段检验的范围包括首部和数据这两部分 在计算检验和时, 要在 TCP 报文段的前面加上 12 字节的伪首部
比特 0 8 16 24 31 源端口 目的端口 TCP 首部 序号 确认号 20 字节固定首部 数据偏移 保留 U R G A C K P S H R S T S Y N F I N 窗口 检验和 紧急指针 选项 ( 长度可变 ) 填 充 紧急指针字段 占 16 bit 紧急指针指出 : 在本报文段中紧急数据共有多少个字节 ( 紧急数据放在本报文段数据的最前面 )
比特 0 8 16 24 31 TCP 首部 源端口 目的端口 MSS 是 TCP 报文段中的数据字段的最大长度 数据字段加上 TCP 首部序号才等于整个的 TCP 报文段 确认号 20 字节固定首部 数据偏移 保留 U R G A C K P S H R S T S Y N F I N 窗口 检验和 紧急指针 选项 ( 长度可变 ) 填 充 选项字段 长度可变 TCP 只规定了一种选项, 即最大报文段长度 MSS (Maximum Segment Size) MSS 告诉对方 TCP: 我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节
比特 0 8 16 24 31 源端口 目的端口 TCP 首部 序号 确认号 20 字节固定首部 数据偏移 保留 U R G A C K P S H R S T S Y N F I N 窗口 检验和 紧急指针 选项 ( 长度可变 ) 填 充 填充字段 这是为了使整个首部长度是 4 字节的整数倍
Two Way Handshake: Obsolete Data Segment
Two Way Handshake: Obsolete SYN Segment
明日正午进攻? 同意 收到 同意 蓝军联合进攻白军 必胜蓝军单独进攻白军 必败 协议无法保证必胜! 收到 : 收到 同意
运输连接的三个阶段 运输连接就有三个阶段, 即 : 连接建立 数据传送和连接释放 运输连接的管理就是使运输连接的建立和释放都能正常地进行 连接建立过程中要解决以下三个问题 : 要使每一方能够确知对方的存在 要允许双方协商一些参数 ( 如最大报文段长度, 最大窗口大小, 服务质量等 ) 能够对运输实体资源 ( 如缓存大小, 连接表中的项目等 ) 进行分配
图 23.18 使用三次握手建立连接 这里 ACK 不携带数据, 因此不占用序号, 序号和 SYN 段中的序号相同 23.52 谢希仁第五版,P216 页上说 :TCP 标准规定,ACK 报文可以携带数据, 因此第三次 Seq =8000+1
用三次握手建立 TCP 连接 主机 A 主机 B 主动打开 被动打开 连接请求 SYN, SEQ = x 确认 确认 ACK, SEQ = x + 1, ACK = y 1 这里 ACK 携带数据, 因此占用序号, 序号是 SYN 段中的序号加 1
注意 SYN 段不携带数据, 但它占用一个序列号 23.54
注意 SYN + ACK 段不携带数据, 但它占用一个序列号 23.55
注意 ACK 段, 如果不携带数据, 则它不占用序列号 23.56
Three Way Handshake: State Diagram
23.58 图 23.19 数据传输
23.59 图 23.20 使用三次握手终止连接
这里 ACK 携带数据, 因此占用序号, 序号是 SYN 段中的序号加 1 至此, 整个连接已经全部释放 TCP 连接释放的过程 主机 A 主机 B 应用进程释放连接 A 不再发送报文 FIN, SEQ = x 1 通知主机应用进程 2 确认 确认 FIN, ACK, SEQ = y, ACK = x + 1 从 A 到 B 的连接就释放了, 连接处于半关闭状态 相当于 A 向 B 说 : ACK, 我已经没有数据要发送了 SEQ = x + 1, ACK = y 1 但你如果还发送数据, 我仍接收 应用进程释放连接 B 不再发送报文
注意 如果 FIN 段不携带数据, 则该段占用一个序列号 23.61
注意 如果 FIN + ACK 段没有携带数据, 则该段仅占用一个序列号 23.62
23.63 图 23.21 半关闭
TCP 的正常的连接建立和关闭 客户进程 服务器进程 LISTEN( 被动打开 ) SYN, SEQ = x ( 主动打开 ) SYN_SENT SYN_RCVD ESTABLISHED ESTABLISHED SYN, ACK, SEQ = y, ACK = x + 1 ACK, SEQ = x + 1, ACK = y + 1 SYN_RCVD ESTABLISHED ( 全双工数据传送阶段 ) FIN, SEQ = u ( 主动关闭 ) FIN_WAIT_1 CLOSE_WAIT ( 被动关闭 ) FIN_WAIT_2 ACK, SEQ = v, ACK = u + 1 CLOSE_WAIT TIME_WAIT FIN, ACK, SEQ = v, ACK = u + 1 LAST_ACK TIME_WAIT ACK, SEQ = u + 1, ACK = v + 1 CLOSED
Flow Control Longer transmission delay between transport entities ( 传输实体 ) compared with actual transmission time Delay in communication of flow control info Variable transmission delay ( 传输延迟可变 ) Difficult to use timeouts Flow may be controlled because: The receiving user can not keep up The receiving transport entity can not keep up Results in buffer filling up
Coping with Flow Control Requirements( 需求 ) (1) Do nothing( 什么也不做 ) Segments that overflow are discarded Sending transport entity will fail to get ACK and will retransmit Thus further adding to incoming data Refuse further segments ( 拒绝接收后续的文段 ) Clumsy Multiplexed connections are controlled on aggregate flow
Coping with Flow Control Requirements (2) Use fixed sliding window protocol ( 使用固定滑动窗口 ) Works well on reliable network Failure to receive ACK is taken as flow control indication Does not work well on unreliable network Can not distinguish between lost segment and flow control Use credit scheme( 使用信贷机制 )
Credit Scheme ( 信贷策略 ) Greater control on reliable network More effective on unreliable network Decouples flow control from ACK( 将确认从流控中分离出来 ) May ACK without granting credit and vice versa ( 反之亦然 ) Each octet has sequence number Each transport segment has seq number ( 序列号 ), ack number ( 确认号 ) and window size ( 窗口大小 ) in header
23.69 图 23.22 滑动窗口
Sending and Receiving Perspectives
Use of Header Fields When sending, seq number is that of first octet in segment ACK includes AN=i, W=j All octets through SN=i-1 acknowledged Next expected octet is i Permission to send additional window of W=j octets i.e. octets through i+j-1
Credit Allocation
发送窗口 收到确认即可前移 1 100 101 200 201 300 301 400 401 500 501 600 601 700 701 800 801 900 可发送 不可发送 指针 发送端要发送 900 字节长的数据, 划分为 9 个 100 字节长的报文段, 而发送窗口确定为 500 字节 发送端只要收到了对方的确认, 发送窗口就可前移 发送 TCP 要维护一个指针 每发送一个报文段, 指针就向前移动一个报文段的距离
发送窗口 收到确认即可前移 1 100 101 200 201 300 301 400 401 500 501 600 601 700 701 800 801 900 可发送 不可发送 指针 发送窗口前移 1 100 101 200 201 300 301 400 401 500 501 600 601 700 701 800 801 900 已发送并被确认 已发送但未被确认 可发送 不可发送 指针 发送端已发送了 400 字节的数据, 但只收到对前 200 字节数据的确认, 同时窗口大小不变 现在发送端还可发送 300 字节
发送端收到了对方对前 400 字节数据的确认, 但对方通知发送端必须把窗口减小到 400 字节 现在发送端最多还可发送 400 字节的数据 发送窗口前移 1 100 101 200 201 300 301 400 401 500 501 600 601 700 701 800 801 900 已发送并被确认 已发送但未被确认 可发送 不可发送 指针 发送窗口缩小 1 100 101 200 201 300 301 400 401 500 501 600 601 700 701 800 801 900 已发送并被确认 可发送 不可发送 指针
例 23.4 如果接收方主机 B 有一个 5000 字节的缓冲区, 已接收但并未处理 1000 个字节数据 试问主机 A 的接收方窗口 ( rwnd) 的值是多少? 解 rwnd 的值 =5000-1000=4000, 主机 B 在它的缓冲溢出之前仅能接收 4000 个字节数据 主机 B 在下一段向主机 A 宣布这个值 23.77
例 23.5 如果 rwnd 的值是 3000 个字节,cwnd 的值是 3500 个字节, 试问主机 A 的窗口大小是多少? 解窗口大小是 rwnd 和 cwnd 中较小的一个, 它应该是 3000 个字节 23.78
例 23.6 图 23.23 表示了一个不切实际的滑动窗口, 发送方已发送了 202 个字节 我们假定 cwnd 是 20( 实际上, 这个值是上千个字节 ), 接收方已经发送一个 rwnd 为 9( 实际上, 这个值也是上千个字节 ) 而确认号为 200 的 ACK 段 发送窗口的大小是 rwnd 和 cwnd 的最小值, 即 9 个字节 字节号 200 到 202 都已发送但并未被确认 字节号 203 到 208 可以发送而不必考虑从另一端来的确认 字节号 209 和它以上各字节不可能被发送 23.79
23.80 图 23.23 例 23.6
注意 TCP 滑动窗口要点 : 窗口大小是 rwnd 和 cwnd 中的最小值 发送方不必发送一个全窗口大小的数据 接收方可张开或合拢窗口, 但不能收缩窗口 只要不引起窗口收缩, 目的方可随时发送一个确认 接收方可暂时关闭窗口, 但在窗口关闭后发送方总是发送一个 1 字节的段 23.81
差错控制 校验和, 使用一个 16 位的校验和 确认, 不携带数据单占用序号的控制段要确认, 但 ACK 段不需要确认 超时 23.82
注意 ACK 段不占用序列号, 它不需要确认 23.83
重传 注意 在当前的实现中, 如果重传计时器到时或当发送方收到三个重复的 ACK 时, 则发生重传 对 ACK 段不设置重传计时器 不占用序号的段不重传, 尤其是 ACK 不重传 RTO 后重传 快速重传 23.84
失序的段 注意 数据可以失序到达, 并被接收的 TCP 暂时存储 但是 TCP 确保传递给进程的段是无失序的 23.85
图 23.24 正常操作 某些情况 23.86
图 23.25 丢失段 某些情况 23.87
注意 接收方 TCP 仅将有序的数据传递给进程 23.88
图 23.26 快速重传 某些情况 23.89
23-4 SCTP 流控传输协议 (SCTP) 是一种新的可靠的 面向报文的传输层协议 然而,SCTP 主要是为最近引入的因特网应用而设计的 这些新应用所需要的服务都比 TCP 能提供的更复杂 本节要点 : SCTP 服务及其特性分组格式 SCTP 关联流量控制和差错控制 23.90
注意 SCTP 是一种面向报文的可靠的协议, 它兼有 UDP 和 TCP 的最佳特性 23.91
23.92 表 23.4 某些 SCTP 应用
23.93 图 23.27 多流概念
注意 SCTP 的一次关联可以包含多个流 23.94
23.95 图 23.28 多接口概念
注意 SCTP 关联允许每个端有多个 IP 地址 23.96
注意 在 SCTP 中, 数据大块 (data chunk ) 按传输序列号 (TSN) 编号. 23.97 23.97
注意 为了区别不同的流, SCTP 使用 SI 23.98
注意 为了区别属于同一个流中的不同数据大块, SCTP 使用流序列号 (SSN) 23.99
注意 TCP 有段 ; SCTP 有分组 23.100
图 23.29 TCP 段与 SCTP 分组的比较 23.101
注意 在 SCTP 中, 控制信息和数据信息在分开的大块中携带 23.102
作业 P500 13,20,21,24,27,31 23.103