1
第 5 章 运输层
5.1 运输层协议概述
5.2 TCP/IP 体系中的运输层
5.3 用户数据报协议 UDP
5.4 传输控制协议 TCP
2
5.1 运输层概述
? 从通信和信息处理的角度看, 运输层向它上面
的应用层提供通信服务, 它属于面向通信部分
的最高层, 同时也是用户功能中的最低层 。
物理层
网络层
运输层
应用层
数据链路层
面向信息处理
面向通信
用户功能
网络功能
3
运输层为相互通信的应用进程提供了
逻辑通信
5
4
3
2
1
运输层提供应用进程 间的逻辑 通信
主机 A 主机 B
应用进程 应用进程
路由器 1 路由器 2 AP
1 LAN
2 WAN AP
2
AP3
AP4
IP 层
LAN1
AP1 AP2 AP4
端口 端口 5
4
3
2
1
IP 协议的作用范围
运输层协议 TCP 和 UDP 的作用范围
AP3
4
应用进程之间的通信
? 两个主机进行通信实际上就是两个主机中的应
用 进程互相通信 。
? 应用进程之间的通信又称为 端到端的通信 。
? 从另一角度看, 传输层的主要功能是增强网络
层提供的服务质量 (Qos)
5
运输层协议和网络层协议
的主要区别
?
应用进程
… ? ?
应用进程
… ?
IP 协议的作用范围
(提供主机之间的逻辑通信)
TCP 和 UDP 协议的作用范围
(提供进程之间的逻辑通信)
因 特 网
6
运输层与其上下层之间的关系
的 OSI 表示法
运输实体 运输实体 运输协议 运输层
层接口
运输服务用户
(应用层实体)
运输服务用户
(应用层实体)
层接口 网络层
(或网际层)
应用层
主机 A 主机 B
运输层服务访问点
TSAP
网络层服务访问点
NSAP
7
运输层协议的要素
? 寻址
? 建立连接
? 释放连接
? 流量控制, 拥塞控制
? 多路复用
8
运输层向上提供可靠的和不可靠
的逻辑通信信道
? 应 用















程 数据 数据
全双工可靠信道
数据 数据
使用 TCP 协议 使用 UDP 协议
不可靠信道
? ? ? ? 发 送 进

9
TCP/IP的运输层有两个不同的协议,
(1) 用户数据报协议 UDP
(User Datagram Protocol)
(2) 传输控制协议 TCP
(Transmission Control Protocol)
5.2 TCP/IP 体系中的运输层
5.2.1 运输层中的两个协议
10
? 两个对等运输实体在通信时传送的数据单位叫作
运输协议数据单元 TPDU (Transport Protocol
Data Unit)。
? TCP 传送的数据单位协议是 TCP 报文段 (segment)
? UDP 传送的数据单位协议是 UDP 报文 或 用户数
据报 。
TCP 与 UDP
11
TCP/IP 体系中的运输层协议
TCP UDP
IP
应用层
与各种网络接口
运输层
12
TCP 与 UDP
? UDP 在传送数据之前不需要先建立连接 。 对方
的运输层在收到 UDP 报文后, 不需要给出任
何确认 。 虽然 UDP 不提供可靠交付, 但在某
些情况下 UDP 是一种最有效的工作方式 。
? TCP 则提供面向连接的服务 。 TCP 不提供广播
或多播服务 。 由于 TCP 要提供可靠的, 面向连
接的运输服务, 因此不可避免地增加了许多的
开销 。 这不仅使协议数据单元的首部增大很多,
还要占用许多的处理机资源 。
13
5.2.2 端口的概念
? 端口就是运输层服务访问点 TSAP。
? 端口的作用就是让应用层的各种应用进程都能将
其数据通过端口向下交付给运输层,以及让运输
层知道应当将其报文段中的数据向上通过端口交
付给应用层相应的进程。
? 从这个意义上讲,端口是用来标志应用层的进程。
14
端口在进程之间的通信中所起的作用









TCP 报文段 UDP 用户数据报
应用进程
TCP 复用
? ? ?
IP 复用
UDP 复用
? ? ?
TCP 报文段 UDP 用户数据报
? ? ? ? ? ?
应用进程
端口 端口
TCP 分用 UDP 分用
IP 分用
IP 数据报 IP 数据报
发送方 接收方
15
端口
? 端口用一个 16 bit 端口号进行标志 。
? 端口号只具有本地意义, 即端口号只是为
了标志本计算机应用层中的各进程 。 在因
特网中不同计算机的相同端口号是没有联
系的 。
16
两类端口
? 一类是熟知端口,其数值一般为 0~1023。当
一种新的应用程序出现时,必须为它指派一个
熟知端口。
? 另一类则是一般端口,用来随时分配给请求通
信的客户进程。
17
插口 (socket)
? TCP 使用, 连接, (而不仅仅是, 端口, )作为最
基本的抽象, 同时将 TCP 连接的端点称为 插口
(socket),或 套接字, 套接口 。
? 插口和端口, IP 地址的关系是,
IP 地址
131.6.23.13
端口号
1500
131.6.23.13,1500 插口 (socket)
18
5.3 用户数据报协议 UDP
5.3.1 UDP 概述
? UDP 只在 IP 的数据报服务之上增加了很少一
点的功能, 即端口的功能和差错检测的功能 。
? 虽然 UDP 用户数据报只能提供不可靠的交付,
但 UDP 在某些方面有其特殊的优点 。
? 发送数据之前不需要建立连接
? UDP 的主机不需要维持复杂的连接状态表 。
? UDP 用户数据报只有 8个字节的首部开销 。
? 网络出现的拥塞不会使源主机的发送速率降低 。 这
对某些实时应用是很重要的 。
19
5.3.2 UDP 用户数据报的
首部格式
伪首部 源端口 目的端口 长 度 检验和
数 据 首 部
UDP长度 源 IP 地址 目的 IP 地址 0 17
IP 数据报
字节 4 4 1 1 2
12 2 2 2 2 字节
发送在前
数 据 首 部 UDP 用户数据报
20
伪首部 源端口 目的端口 长 度 检验和
数 据 首 部
UDP长度 源 IP 地址 目的 IP 地址 0 17
IP 数据报
字节 4 4 1 1 2
12 2 2 2 2 字节
发送在前
数 据 首 部 UDP 用户数据报
用户数据报 UDP 有两个字段:数据字段和首部
字段。首部字段有 8 个字节,由 4 个字段组成,
每个字段都是两个字节。
21
伪首部 源端口 目的端口 长 度 检验和
数 据 首 部
UDP长度 源 IP 地址 目的 IP 地址 0 17
IP 数据报
字节 4 4 1 1 2
12 2 2 2 2 字节
发送在前
数 据 首 部 UDP 用户数据报
在计算检验和时,临时把“伪首部”和 UDP 用户数据
报连接在一起。 伪首部仅仅是为了计算检验和 。
22
计算 UDP 检验和的例子
10011001 00010011 → 153.19
00001000 01101000 → 8.104
10101011 00000011 → 171.3
00001110 00001011 → 14.11
00000000 00010001 → 0 和 17
00000000 00001111 → 15
00000100 00111111 → 1087
00000000 00001101 → 13
00000000 00001111 → 15
00000000 00000000 → 0 (检验和)
01010100 01000101 → 数据
01010011 01010100 → 数据
01001001 01001110 → 数据
01000111 00000000 → 数据和 0(填充)
10010110 11101011 → 求和得出的结果
01101001 00010100 → 检验和
153.19.8.104
171.3.14.11 12 字节 伪首部
8 字节
UDP 首部
7 字节
数据
填充
按二进制反码运算求和
将得出的结果求反码
全 0 17 15
1087 13
15 全 0
数据 数据 数据 数据
数据 数据 数据 全 0
23
5.4 传输控制协议 TCP
5.4.1 TCP 概述
?
端口

发送 TCP 报文段
TCP

TCP
接收缓存 发送缓存
报文段 … 报文段 报文段
端口
发送端 接收端
向发送缓存
写入数据块
从接收缓存
读取数据块
应用进程 应用进程 ?
24
TCP
首部
20 字节的
固定首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N
32 bit
S Y
N
R S
T
P S
H
A C
K
U R
G
比特 0 8 16 24 31
填 充
TCP 数据部分 TCP 首部 TCP 报文段
IP 数据部分 IP 首部
发送在前
25
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
源端口和目的端口字段 —— 各占 2 字节。端口是运输
层与应用层的服务接口。运输层的复用和分用功能都
要通过端口才能实现。
26
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
序号字段 —— 占 4 字节。 TCP 连接中传送的数据流
中的每一个字节都编上一个序号。序号字段的值则指
的是本报文段所发送的数据的第一个字节的序号。
27
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
确认号字段 —— 占 4 字节,是期望收到对方的下一个
报文段的数据的第一个字节的序号。
28
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
确认号字段 —— 占 4 字节,是期望收到对方的下一个
报文段的数据的第一个字节的序号。
29
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
紧急比特 URG —— 当 URG ? 1 时,表明紧急指
针字段有效。它告诉系统此报文段中有紧急数据,
应尽快传送 (相当于高优先级的数据 )。
30
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
确认比特 ACK —— 只有当 ACK ? 1 时确认号字
段才有效。当 ACK ? 0 时,确认号无效。
31
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
推送比特 PSH (PuSH) —— 接收 TCP 收到推送比特
置 1 的报文段,就尽快地交付给接收应用进程,而不
再等到整个缓存都填满了后再向上交付。
32
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
复位比特 RST (ReSeT) —— 当 RST ? 1 时,表明 TCP
连接中出现严重差错(如由于主机崩溃或其他原因),
必须释放连接,然后再重新建立运输连接。
33
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
同步比特 SYN —— 同步比特 SYN 置为 1,就表示
这是一个连接请求或连接接受报文。
34
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
终止比特 FIN (FINal) —— 用来释放一个连接。当
FIN ? 1 时,表明此报文段的发送端的数据已发送完
毕,并要求释放运输连接。
35
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
窗口字段 —— 占 2 字节。窗口字段用来控制对方发送
的数据量,单位为字节。 TCP 连接的一端根据设置的缓
存空间大小确定自己的接收窗口大小,然后通知对方以
确定对方的发送窗口的上限。
36
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
检验和 —— 占 2 字节 。 检验和字段检验的范围包括
首部和数据这两部分 。 在计算检验和时, 要在 TCP
报文段的前面加上 12 字节的伪首部 。
37
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
紧急指针字段 —— 占 16 bit。 紧急指针指出在本报
文段中的紧急数据的最后一个字节的序号 。
38
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
选项字段 —— 长度可变 。 TCP 只规定了一种选项,
即 最大报文段长度 MSS (Maximum Segment Size)。
MSS 告诉对方 TCP:, 我的缓存所能接收的报文段
的数据字段的最大长度是 MSS 个字节 。,
MSS 是 TCP 报文段中的 数据字段 的最大长度。
数据字段加上 TCP 首部
才等于整个的 TCP 报文段。
39
TCP
首部
20
字节
固定
首部
目 的 端 口
数据
偏移
检 验 和
选 项 (长 度 可 变)
源 端 口
序 号
紧 急 指 针
窗 口
确 认 号
保 留 F I N S Y N R S T P S H A C K U R G
比特 0 8 16 24 31
填 充
填充字段 —— 这是为了使整个首部长度是 4 字节的
整数倍 。
40
5.4.3 TCP 的数据编号与确认
? TCP 协议是面向字节的 。 TCP 将所要传送的报文看
成是字节组成的数据流, 并使每一个字节对应于一
个序号 。
? 在连接建立时, 双方要商定初始序号 。 TCP 每次发
送的报文段的首部中的序号字段数值表示该报文段
中的 数据部分的第一个字节的序号 。
? TCP 的确认是对接收到的数据的最高序号表示确
认 。 接收端返回的确认号是已收到的数据的最高序
号加 1。 因此确认号表示 接收端期望下次收到的数
据中的第一个数据字节的序号 。
41
5.4.4 TCP 的流量控制与拥塞控制
1,滑动窗口的概念
? TCP 采用大小可变的滑动窗口进行流量控制 。 窗口
大小的单位是 字节 。
? 在 TCP 报文段首部的窗口字段写入的数值就是当前
给对方设置的发送窗口数值的上限 。
? 发送窗口在连接建立时由双方商定 。 但在通信的过
程中, 接收端可根据自己的资源情况, 随时动态地
调整对方的发送窗口上限值 (可增大或减小 )。
42
收到确认即可前移
100 200 300 400 500 600 700 800 900 101 201 301 401 501 601 701 801 1
发送窗口
可发送 不可发送
指针
? 发送端要发送 900 字节长的数据,划分为 9
个 100 字节长的报文段,而发送窗口确定为
500 字节。
? 发送端只要收到了对方的确认,发送窗口就可
前移。
? 发送 TCP 要维护一个指针。每发送一个报文段,
指针就向前移动一个报文段的距离。
43
收到确认即可前移
100 200 300 400 500 600 700 800 900 101 201 301 401 501 601 701 801 1
可发送 不可发送
指针
100 200 300 400 500 600 700 800 900 101 201 301 401 501 601 701 801 1
发送窗口
可发送 不可发送
指针 发送窗口前移
? 发送端已发送了 400 字节的数据,但只收到对前
200 字节数据的确认,同时窗口大小不变。
? 现在发送端还可发送 300 字节。
已发送
并被确认
已发送但
未被确认
44
100 200 300 400 500 600 700 800 900 101 201 301 401 501 601 701 801 1
已发送
并被确认
已发送但
未被确认 可发送 不可发送
指针
100 200 300 400 500 600 700 800 900 101 201 301 401 501 601 701 801 1
已发送
并被确认 可发送
不可
发送
指针
发送窗口前移
发送窗口缩小
? 发送端收到了对方对前 400 字节数据的确认,但对
方通知发送端必须把窗口减小到 400 字节。
? 现在发送端最多还可发送 400 字节的数据。
45
利用可变窗口大小进行流量控制
双方确定的窗口值是 400
SEQ = 1
SEQ = 201
SEQ = 401
SEQ = 301
SEQ = 101
SEQ = 501
ACK = 201,WIN = 300
ACK = 601,WIN = 0
ACK = 501,WIN = 200
主机 A 主机 B
允许 A 再发送 300 字节(序号 201 至 500)
A 还能发送 200 字节
A 还能发送 200 字节(序号 301 至 500)
A 还能发送 300 字节
A 还能发送 100 字节(序号 401 至 500)
A 超时重发,但不能发送序号 500 以后的数据
允许 A 再发送 200 字节(序号 501 至 700)
A 还能发送 100 字节(序号 501 至 700)
不允许 A 再发送(到序号 600 的数据都已收到)
SEQ = 201 丢失!
46
2,慢开始和拥塞避免
? 发送端的主机在确定发送报文段的速率时,既要
根据接收端的接收能力,又要从全局考虑不要使
网络发生拥塞。
? 因此,每一个 TCP 连接需要有以下两个状态变量,
? 接收端窗口 rwnd (receiver window) 又称为 通
知窗口 (advertised window)。
? 拥塞窗口 cwnd (congestion window)。
47
接收端窗口 rwnd 和
拥塞窗口 cwnd
? (1) 接收端窗口 rwnd 这是接收端根据其目前
的接收缓存大小所许诺的最新的窗口值,是来自
接收端的流量控制。接收端将此窗口值放在 TCP
报文的首部中的窗口字段,传送给发送端。
? (2) 拥塞窗口 cwnd (congestion window) 是发
送端根据自己估计的网络拥塞程度而设置的窗口
值,是来自发送端的流量控制。
48
发送窗口的上限值
? 发送端的发送窗口的上限值应当取为接收端窗口
rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个,
即应按以下公式确定,
发送窗口的上限值 ? Min [rwnd,cwnd] (7-
1)
? 当 rwnd < cwnd 时,是接收端的接收能力限制发送
窗口的最大值。
? 当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口
的最大值。
49
慢开始算法的原理
? 在主机刚刚开始发送报文段时可先将拥塞窗口
cwnd 设置为一个最大报文段 MSS 的数值 。
? 在每收到一个对新的报文段的确认后, 将拥塞
窗口增加至多一个 MSS 的数值 。
? 用这样的方法逐步增大发送端的拥塞窗口
cwnd,可以使分组注入到网络的速率更加合理 。
50
慢开始和拥塞避免算法的实现举例
当 TCP 连接进行初始化时,将拥塞窗口置为 1。图中
的窗口单位不使用字节而使用 报文段 。
慢开始门限的初始值设置为 16 个报文段,
即 ssthresh = 16。
2 4 6 8 10 12 14 16 18 20 22 0
0
4
8
12
16
20
24
传输次数
拥塞窗口 cwnd
进入拥塞避免
发生超时
指数规律增长
线性规律增长
ssthresh = 16
慢开始 慢开始 拥塞避免 拥塞避免
更新后的 ssthresh = 12
进入拥塞避免
51
慢开始和拥塞避免算法的实现举例
发送端的发送窗口不能超过拥塞窗口 cwnd 和接收端
窗口 rwnd 中的最小值。我们假定接收端窗口足够大,
因此现在发送窗口的数值等于拥塞窗口的数值。
2 4 6 8 10 12 14 16 18 20 22 0
0
4
8
12
16
20
24
传输次数
拥塞窗口 cwnd
进入拥塞避免
发生超时
指数规律增长
线性规律增长
ssthresh = 16
慢开始 慢开始 拥塞避免 拥塞避免
更新后的 ssthresh = 12
进入拥塞避免
52
慢开始和拥塞避免算法的实现举例
在执行慢开始算法时,拥塞窗口 cwnd 的初始值为 1,
发送第一个报文段 M0。
2 4 6 8 10 12 14 16 18 20 22 0
0
4
8
12
16
20
24
传输次数
拥塞窗口 cwnd
进入拥塞避免
发生超时
指数规律增长
线性规律增长
ssthresh = 16
慢开始 慢开始 拥塞避免 拥塞避免
更新后的 ssthresh = 12
进入拥塞避免
53
慢开始和拥塞避免算法的实现举例
2 4 6 8 10 12 14 16 18 20 22 0
0
4
8
12
16
20
24
传输次数
拥塞窗口 cwnd
进入拥塞避免
发生超时
指数规律增长
线性规律增长
ssthresh = 16
慢开始 慢开始 拥塞避免 拥塞避免
更新后的 ssthresh = 12
进入拥塞避免
发送端收到 ACK1 (确认 M0,期望收到 M1)后,将
cwnd 从 1 增大到 2,于是发送端可以接着发送 M1 和
M2 两个报文段。
54
慢开始和拥塞避免算法的实现举例
接收端发回 ACK2 和 ACK3。发送端每收到一个对新报
文段的确认 ACK,就把发送端的拥塞窗口加 1。现在
发送端的 cwnd 从 2 增大到 4,并可发送 M4 ~ M6共 4
个报文段。
2 4 6 8 10 12 14 16 18 20 22 0
0
4
8
12
16
20
24
传输次数
拥塞窗口 cwnd
进入拥塞避免
发生超时
指数规律增长
线性规律增长
ssthresh = 16
慢开始 慢开始 拥塞避免 拥塞避免
更新后的 ssthresh = 12
进入拥塞避免
55
慢开始和拥塞避免算法的实现举例
发送端每收到一个对新报文段的确认 ACK,就把发送
端的拥塞窗口加 1,因此拥塞窗口 cwnd 随着传输次数
按指数规律增长。
2 4 6 8 10 12 14 16 18 20 22 0
0
4
8
12
16
20
24
传输次数
拥塞窗口 cwnd
进入拥塞避免
发生超时
指数规律增长
线性规律增长
ssthresh = 16
慢开始 慢开始 拥塞避免 拥塞避免
更新后的 ssthresh = 12
进入拥塞避免
56
慢开始和拥塞避免算法的实现举例
当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时
(即当 cwnd = 16 时),就改为执行拥塞避免算法,
拥塞窗口按线性规律增长。
2 4 6 8 10 12 14 16 18 20 22 0
0
4
8
12
16
20
24
传输次数
拥塞窗口 cwnd
进入拥塞避免
发生超时
指数规律增长
ssthresh = 16
慢开始 慢开始
线性规律增长
拥塞避免 拥塞避免
更新后的 ssthresh = 12
进入拥塞避免
57
慢开始和拥塞避免算法的实现举例
假定拥塞窗口的数值增长到 24 时,网络出现超时(表
明网络拥塞了)。
2 4 6 8 10 12 14 16 18 20 22 0
0
4
8
12
16
20
24
传输次数
拥塞窗口 cwnd
进入拥塞避免
发生超时
指数规律增长
线性规律增长
ssthresh = 16
慢开始 慢开始 拥塞避免 拥塞避免
更新后的 ssthresh = 12
进入拥塞避免
58
慢开始和拥塞避免算法的实现举例
更新后的 ssthresh 值变为 12(即发送窗口数值 24 的
一半),拥塞窗口再重新设置为 1,并执行慢开始算
法。
2 4 6 8 10 12 14 16 18 20 22 0
0
4
8
12
16
20
24
传输次数
拥塞窗口 cwnd
进入拥塞避免
发生超时
指数规律增长
线性规律增长
ssthresh = 16
慢开始 慢开始 拥塞避免 拥塞避免
更新后的 ssthresh = 12
进入拥塞避免
59
慢开始和拥塞避免算法的实现举例
当 cwnd = 12 时改为执行拥塞避免算法,拥塞窗口
按按线性规律增长,每经过一个往返时延就增加一
个 MSS 的大小。
2 4 6 8 10 12 14 16 18 20 22 0
0
4
8
12
16
20
24
传输次数
拥塞窗口 cwnd
进入拥塞避免
发生超时
指数规律增长
线性规律增长
ssthresh = 16
慢开始 慢开始 拥塞避免 拥塞避免
更新后的 ssthresh = 12
进入拥塞避免
60
乘法减小
(multiplicative decrease)
?,乘法减小, 是指不论在慢开始阶段还是拥
塞避免阶段, 只要出现一次超时 ( 即出现
一次网络拥塞 ), 就把慢开始门限值
ssthresh 设置为当前的拥塞窗口值乘以
0.5。
? 当网络频繁出现拥塞时, ssthresh 值就下
降得很快, 以大大减少注入到网络中的分
组数 。
61
加法增大
(additive increase)
?,加法增大, 是指执行拥塞避免算法后, 当
收到对所有报文段的确认就将拥塞窗口
cwnd增加一个 MSS 大小, 使拥塞窗口缓
慢增大, 以防止网络过早出现拥塞 。
62
5.4.5 TCP 的运输连接管理
1,运输连接的三个阶段
? 运输连接就有三个阶段,即,连接建立,
数据传送 和 连接释放 。运输连接的管理
就是使运输连接的建立和释放都能正常
地进行。
? 连接建立过程中要解决以下三个问题,
? 要使每一方能够确知对方的存在。
? 要允许双方协商一些参数(如最大报文段长
度,最大窗口大小,服务质量等)。
? 能够对运输实体资源(如缓存大小,连接表
中的项目等)进行分配。
63
客户服务器方式
? TCP 的连接和建立都是采用客户服务器
方式。
? 主动发起连接建立的应用进程叫做 客户
(client)。
? 被动等待连接建立的应用进程叫做 服务
器 (server)。
64
用三次握手建立 TCP 连接
SYN,SEQ = x
主机 B
ACK,SEQ = x + 1,ACK = y ? 1
被动打开 主动打开
确认
确认
主机 A
连接请求
65
建立 TCP 连接
? A 的 TCP 向 B 发出连接请求报文段,其首部中的
同步比特 SYN 应置为 1,并选择序号 x,表明传送
数据时的第一个数据字节的序号是 x。
? B 的 TCP 收到连接请求报文段后,如同意,则发
回确认。
? B 在确认报文段中应将 SYN 置为 1,其确认号应
为 x ? 1,同时也为自己选择序号 y。
? A 收到此报文段后,向 B 给出确认,其确认号应为
y ? 1。
? A 的 TCP 通知上层应用进程,连接已经建立。
? 当运行服务器进程的主机 B 的 TCP 收到主机 A 的
确认后,也通知其上层应用进程,连接已经建立。
66
TCP 连接释放的过程
FIN,SEQ = x
ACK,SEQ = x + 1,ACK = y ? 1
应用进程
释放连接
A 不再发送报文
FIN,ACK,SEQ = y,ACK = x + 1
主机 B 主机 A
通知主机
应用进程

应用进程
释放连接
B 不再发送报文

确认
确认
从 A 到 B 的连接就释放了,连接处于 半关闭 状态。
相当于 A 向 B 说,
“我已经没有数据要发送了。
但你如果还发送数据,我仍接收。”
至此,整个连接已经全部释放。