第七章传输层

Download Report

Transcript 第七章传输层

计算机网络
Computer Network
2015年4月9日
课程目录
第1章
概述
第2章
物理层与数据通信基础
第3章
数据链路层
第4章
局域网
第5章
网络层
第6章
网络互联技术
第7章
传输层
第8章
应用层
第9章
网络管理与信息安全
第10章 网络新技术专题
计算机网络--刘桂江
2/87
第7章 传输层
7.1
传输层概述
7.2
互联网传输协议
计算机网络--刘桂江
3/87
7.1 传输层概述
7.1.1 提供给高层的服务
7.1.2 服务质量
7.1.3 多路复用技术
计算机网络--刘桂江
4/87
7.1.1 提供给高层的服务
主机 A
主机 B
传输服务用户
(应用层实体)
传输层服务访问点
TSAP
完成传输层功能
的硬件或软件
传输实体
网络层服务访问点
NSAP
应用层
传输服务用户
(应用层实体)
层接口
传输协议
传输实体
网络层
传输层
层接口
传输层与其上下层之间的关系
• 传输层向高层提供两种类型的服务:面向连接的传输服务和无连接的
传输服务。
计算机网络--刘桂江
5/87
7.1.2 服务质量

传输层服务质量是指在两节点之间表现出来的某些传输连
接的特征,是传输层性能的度量,反映了传输质量及服务
的可用性。
连接建立延迟
连接建立失败概率

传输层服务质量参数表
吞吐量
传输延迟

传输层服务质量不是由单方面决定
的,一般它需要连接的双方有一个
协商的过程。
计算机网络--刘桂江
残留差错率
保护性
优先权
回弹率
6/87
7.1.3 多路复用技术
TSAP
应用层
应用层
NSAP
传输层
传输层
网络层
网络层
至路由器
(a)向上多路复用

至路由器
(b)向下多路复用
向上复用的使用往往是出于费用上的考虑;向下复用的目的
是为了提高吞吐量。
计算机网络--刘桂江
7/87
7.2 互联网传输协议
7.2.1 TCP简介
7.2.2 TCP服务模型
7.2.3 TCP协议
7.2.4 TCP报文段头
7.2.5 TCP连接管理
7.2.6 TCP传输策略
7.2.7 TCP流量控制和拥塞控制
7.2.8 TCP计时器
7.2.9 UDP协议简介
计算机网络--刘桂江
8/87
7.2.1 TCP简介


TCP(传输控制协议)是TCP/IP体系中面向连接的
传输层协议,它提供全双工的服务。
TCP提供差错控制和排序的功能,提供可靠的端到端
字节流的传输服务。
计算机网络--刘桂江
9/87
7.2.2 TCP服务模型(1 /5)
 TCP是使用连接来进行通信的。当一个应用进程希望与另一
个远程的应用进程建立连接的时候,除了要知道对方的主机
地址外,它还必须知道要连接到对方哪个应用进程上,从而
实现端到端的通信。
AP1
5
应用进程
AP2
端口
应用进程
传输层提供应用进程间的逻辑通信
4
3
端口
AP3
AP4
5
4
IP 层
3
2
2
1
1
传输层提供端到端的服务
计算机网络--刘桂江
10/87
7.2.2 TCP服务模型(2 /5)
 在传输层上通常使用的方法是为那些能够监听连接请求的进
程定义TSAP;在Internet中,这些访问点就被称为端口。同
样,在网络层上的访问点被称为NSAP。IP地址就是NSAP的
特例。
NSAP、
TSAP和传输
连接之间的关
系
计算机网络--刘桂江
11/87
7.2.2 TCP服务模型(3 /5)

客户机上的应用进程如何知道服务器上的服务器进程是被
关联到某个特定端口上的呢?
常用的方法有两种:
(1)对于一些少数且关键的服务器进程(例如Web服务
器),它们被连接请求的频率高,而且一旦连接上以后维
持的时间一般也比较长,则将这些典型服务器进程与熟知
的TSAP永久地关联起来。且这些关键服务进程和对应的
熟知TSAP往往被罗列在某个文件中。
(2)采用名字服务器或目录服务器。
计算机网络--刘桂江
12/87
7.2.2 TCP服务模型(4/5)
套接字(socket)


为了区分不同主机中的进程,TCP/IP协议簇将主机的IP
地址与端口结合起来,定义为通信的一个端点,称之为
套接字。
套接字、端口和IP地址的关系是:
IP 地址
128.10.2.3
套接字
128.10.2.3
计算机网络--刘桂江
端口号(16位)
25
25
13/87
7.2.2 TCP服务模型(5 /5)
三类端口
(1)熟知端口,其数值为0~1023。这一类端口由
ICANN负责分配给一些常用的应用层程序固定使用。
(2)登记端口,其数值为1024~49151。这类端口是
ICANN控制的,使用这个范围的端口必须在ICANN登记
,以防止重复。
(3)动态端口,其数值为49152~65535。这类端口
是留给客户进程选择作为临时端口。
计算机网络--刘桂江
14/87
7.2.3 TCP协议
在TCP协议中需要关注的几个问题:
(1)TCP连接上的每个字节都是有编号的,即都有它
自己独有的32位序列号。
(2)TCP报文段的结构
(3)滑动窗口协议
(4)错序问题
计算机网络--刘桂江
15/87
7.2.4 TCP报文段头
 一个TCP报文段分为首部和数据两部分。TCP首部
由固定首部和可选的附加选项组成。

TCP数据部分理论上长度最多可达65495个字节。
 无任何数据的TCP报文段也是合法的,它通常被用
于确认或控制消息。

TCP的全部功能都体现在它首部中各字段的作用。
计算机网络--刘桂江
16/87
32 bit
比特0
8
16
24
源 端 口
31
目 的 端 口
序 号
确 认
TCP
首部
数据
偏移
序
20 字节的
固定首部
号
U A P R S F
R C S S Y I
G K H T N N
保 留
窗 口 大 小
检 验 和
附 加 选
TCP 报文段
项
紧 急 指 针
(长 度 可 变)
TCP 首部
填
充
TCP 数据部分
发送在前
IP 首部
IP 数据部分
TCP报文段首部结构图
计算机网络--刘桂江
17/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
源端口和目的端口——各占2个字节。端口是传输层与应用
层的服务接口,它们分别与源IP地址和目的IP地址一起标
识一个TCP连接的两个端点,传输层的复用和分用功能都
要通过端口才能实现。
计算机网络--刘桂江
18/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
序号字段——占 4 字节。TCP 连接中传送的数据流中的
每一个字节都编上一个序号。序号字段的值则指的是本报
文段所发送的数据的第一个字节的序号。
计算机网络--刘桂江
19/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
确认序号字段——占 4 字节,是期望收到对方的下一个报
文段的数据的第一个字节的序号。
计算机网络--刘桂江
20/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
数据偏移——占4bit,它指出 TCP 报文段的数据起始处距离
TCP 报文段的起始处有多远。“数据偏移”的单位不是字节而
是 32 bit字(即4字节为计算单位)。
计算机网络--刘桂江
21/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
保留字段——占 6 bit,保留为今后使用,但目前都置为 0。
计算机网络--刘桂江
22/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
紧急比特 URG ——紧急标志位。当 URG  1 时,表明紧
急指针字段有效。它告诉系统此报文段中有紧急数据,应尽
快传送(相当于高优先级的数据)。
计算机网络--刘桂江
23/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
确认比特 ACK ——确认标志位。当ACK=1时表明报文段中
确认序号字段有效,这时可以理解当前发送的报文段为确
认报文;当ACK=0时表明确认序号字段无效。
计算机网络--刘桂江
24/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
推送PSH (Push) —— 接收 TCP 收到推送比特置 1 的报文
段,就尽快地交付给接收应用进程,而不再等到整个缓存都填
满了后再向上交付。
计算机网络--刘桂江
25/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
复位RST (Reset) ——复位标志。当RST=1时表明TCP连接中出现
严重差错(例如主机崩溃),这时必须释放当前连接然后再重新
建立一个新的传输连接。另外RST置1还可以用来拒绝接收一个非
法报文段,或拒绝建立一个连接。
计算机网络--刘桂江
26/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
同步SYN ——建立连接标志。建立连接过程中,在客户端发出请
求建立连接的报文段中:SYN=1,ACK=0;在服务器端表示接收建
立连接的报文段中:SYN=1,ACK=1;所以可用SYN来区分与建立连
接有关的报文段,而用ACK进一步区分是连接请求还是连接接收。
计算机网络--刘桂江
27/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
终止FIN (Final) ——释放连接标志。当FIN=1时表示此报文段
的发送方的数据发送已经结束,并要求释放传输连接。注意这
是个单方面请求释放连接,即仍然还允许对方发送数据过来。
计算机网络--刘桂江
28/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
窗口大小字段 —— 占 2 字节。窗口字段用来控制对方发送
的数据量,单位为字节。TCP 连接的一端根据设置的缓存空
间大小确定自己的接收窗口大小,然后通知对方以确定对方
的发送窗口的上限。
计算机网络--刘桂江
29/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
检验和——占2字节。检验和字段检验的范围包括首部和数
据这两部分。在计算检验和时,要在 TCP 报文段的前面加
上 12 字节的伪首部。
计算机网络--刘桂江
30/87
在计算检验和时,临时把“伪首部”和TCP报文段连接
在一起,得到一个临时的TCP报文段。检验和就针对这
个临时的TCP报文段来计算的。伪首部既不向下传送也
不向上递交,而仅仅是为了计算检验和。
32 bit
源 IP 地址
目的 IP 地址
全0 6
TCP长度
TCP报文段伪首部结构图
计算机网络--刘桂江
31/87
TCP计算检验和的具体方法:
在发送方,首先是把全零放入检验和字段,再把伪首部以
及TCP报文段看成是由许多16位的字串接起来。若TCP报
文段的数据部分长度不是4N(N为正整数)字节的整数
倍,则要填充全零字串在后面直至长度为4N字节。然后按
二进制反码计算出这些16位字的和,将此和的二进制反码
写入检验和字段后,发送该TCP报文段。
在接收方,把收到的TCP报文段增加伪首部(以及可能的
填充全零字节)一起,按二进制反码计算出这些16位字的
和。当无差错时其结果应为全1;否则就表明出现传输错
误,接收方应丢弃这个错误的TCP报文段(当然也可以上
交给应用层,但附上出现了差错的警告)。
计算机网络--刘桂江
32/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
紧急指针字段 —— 占 16 bit。紧急指针指出在本报文段中,
紧急数据一共有多少个字节。它和紧急标志位URG配合使用。
计算机网络--刘桂江
33/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
附加选项字段 ——
长度可变。TCP 只规定了一种选项,即最大报文段长度
MSS (Maximum Segment Size)。MSS 告诉对方 TCP:“我的缓存所能接收的报文
段的数据字段的最大长度是 MSS 个字节。”
附加选项是可选的,如果主机没有使用这个选项,则缺省使用MSS的默认值是536。
另外,一个连接两个方向上的最大数据段长度MSS可以不相同。
计算机网络--刘桂江
34/87
比特 0
8
16
24
源 端 口
31
目 的 端 口
序 号
TCP
首部
确
数据
偏移
保 留
认
序
号
U A P R S F
R C S S Y I
G K H T N N
检 验 和
附 加 选
项
20
字节
固定
首部
窗 口 大 小
紧 急 指 针
(长 度 可 变)
填
充
填充字段 —— 这是为了使整个首部长度是 4 字节的整
数倍。
计算机网络--刘桂江
35/87
7.2.5 TCP连接管理(1 /8)
1.建立TCP连接
TCP协议中使用三次握手方法建立连接。
主机 A
主机 B
主动打开
被动打开
SYN=1,seq=x
连接请求
ACK=0
SYN=1,ACK=1,seq=y,ack=x+1
确认
时间
确认
ACK=1,seq=x+1,ack=y1
三次握手法
1、防止可能发生的死锁
2、防止已失效的连接再
次传到被连接的主机
时间
为何不用两次握手方法建立连接?
计算机网络--刘桂江
36/87
7.2.5 TCP连接管理(2 /8)
2.释放TCP连接
 释放连接有两种方式:非对称释放和对称释放。
(1)非对称释放
主机 A
主机 B
连接建立
发送第一
个数据
发送第二
个数据
DATA 1
ACK
发送确认
DATA 2
撤消连接
在一方断开连接后不再
时间
接收数据,数据丢失
该方法较为粗
暴,可能会导
致数据丢失。
时间
计算机网络--刘桂江
37/87
7.2.5 TCP连接管理(3 /8)
(2)对称释放方法
主机 A
释放请求即
A不再发送
数据
主机 B
FIN=1,seq=x
ACK=1,seq=y,ack=x+1
半关闭状态
FIN=1,seq=y+1,ack=x+1
发送确认
ACK=1,seq=x+1,ack=y 2
通知主机
进程并发
送确认
释放请求即
B也不再发
送数据
关闭状态
时间
时间
计算机网络--刘桂江
38/87
7.2.5 TCP连接管理(4 /8)
不过,对称释放协议并不总是可以正确地工作。它存在两
军队问题。
两军队问题
用“断开连接”来代替军队的“发起进攻” 。如果任何一方一定要在确定
另一方已经做好了断开连接的准备之后才准备断开连接的话,那么,断开
连接的操作将永远都不可能发生。
计算机网络--刘桂江
39/87
7.2.5 TCP连接管理(5 /8)
*3.有限状态机
建立连接和释放连接所要求的步骤可以用一个
有限状态机来表达。该状态机有11种状态,在每
一种状态中,都存在一些合法的事件。当合法事
件发生的时候,可能需要采取某个动作;当其他
事件发生的时候,则报告一个错误。
计算机网络--刘桂江
40/87
7.2.5 TCP连接管理(6 /8)
状态
说明
没有活动的连接,或者未完成的连接
LISTEN
服务器正在等待进来的连接请求
SYN_RCVD
一个连接请求已经到达;等待ACK
SYN_SENT
应用程序已经开始打开连接
ESTABLISHED
正常的数据传输状态
FIN_WAIT_1
一方请求释放连接
FIN_WAIT_2
另一方已经同意释放连接
TIME_WAIT
等待所有的分组逐渐消失
CLOSING
双方试图同时关闭连接
CLOSE_WAIT
另一方已经发起了释放连接的过程
LAST_ACK
等待所有的分组逐渐消失
计算机网络--刘桂江
TCP
CLOSED
有
限
状
态
机
中
存
在
的
状
态
41/87
7.2.5 TCP连接管理(7/8)
每个连接都从CLOSED状态开始。当它执行了一
个被动的打开操作(LISTEN),或者一个主动的打
开操作(CONNECT)的时候,它就离开CLOSED状
态。如果另一端执行了相对应的操作,则连接被建
立起来,当前状态变成ESTABLISHED;连接的释放
过程可以由任何一方发起,当释放完成的时候,状
态又回到了CLOSED。
计算机网络--刘桂江
42/87
CLOSED
被动打开
关闭
收到 SYN
发送 SYN, ACK
LISTEN
被动打开
收到 RST
发送 SYN
收到 SYN,发送 SYN, ACK
同时打开
收到 ACK
SYN_RCVD
关闭
发送 FIN
主动关闭
收到 FIN
发送 ACK
同时关闭
CLOSING
收到 FIN, ACK
发送 ACK
收到 ACK
FIN_WAIT_2
SYN_SENT
关闭
或超时
主动打开
收到 SYN, ACK
发送 ACK
数据传送
收到 FIN
阶段
发送 ACK
ESTABLISHED
关闭
发送 FIN
FIN_WAIT_1
主动打开
发送 SYN
被动关闭
CLOSE_WAIT
关闭
发送 FIN
收到 ACK
TCP
的
有
限
状
态
机
LAST_ACK
收到 ACK
收到 FIN
发送 ACK
TIME_WAIT
定时经过两倍报文段寿命后
计算机网络--刘桂江
43/87
7.2.6 TCP传输策略(1 /5)



TCP 协议是面向字节流的。TCP 将所要传送的报文看成是字节组成
的数据流,并使每一个字节对应于一个序号。
在连接建立时,双方要商定初始序号。TCP 每次发送的报文段的首
部中的序号字段数值表示该报文段中的数据部分的第一个字节的序
号。
TCP 发送的确认报文段是对接收到的数据的最高序号表示确认。
接收端返回的确认序号是已收到的数据的最高序号加 1。也就是说,
确认序号表示接收端期望下次收到的数据中的第一个数据字节的序
号。
计算机网络--刘桂江
44/87
7.2.6 TCP传输策略(2 /5)
TCP传输的可靠就是由于使用了序号和确认机制:
在TCP发送一个报文段时,它同时也在自己的重传队
列中存放一个副本,并启动一个计时器。若收到该报
文段的确认,则删除此副本;若在计时器超时之前没
有收到确认,则重传此报文段的副本。TCP的确认并
不保证数据已由应用层交付给了端用户,而只是表明
在接收方的TCP收到了发送方所发送的报文段。
计算机网络--刘桂江
45/87
7.2.6 TCP传输策略(3 /5)
TCP的发送和确认机制
在发送方,TCP一般是根据以下三种基本机制来控制报文段的
发送时机。第一种机制是TCP维持一个变量,它等于接收方确
认报文段中的最大报文长度MSS,这个数值给出了接收方的最
大数据接收能力,因此只要发送方发送缓存从发送进程中得到
的数据已达到MSS字节时,就组装成一个TCP报文段,然后发送
出去。第二种机制是当发送方的应用进程指明要求发送一个报
文段时,即使用了TCP的推送(PUSH)操作,则TCP立即将这个
报文段单独发送出去。第三种机制是当发送方的一个计时器期
限到了,这说明某一个已发送出去的报文段在规定时限之内没
有收到确认,于是发送方就把该计时器所对应的报文段副本从
重传队列中取出再次发送出去。
计算机网络--刘桂江
46/87
7.2.6 TCP传输策略(4 /5)
在接收方,当接收方的接收缓存已经装满数据,就会返
回一个确认,并设置窗口(WIN)的值为0,这时发送
方是不能够再正常地发送数据段了。但这里有两种意外
情形允许发送方继续发送报文段。第一,紧急数据仍可
以发送,例如要中断远程机器上运行的某一个进程。第
二,发送方可以发送一个1字节的数据段,要求接收方
重申窗口大小及下一个准备接收的数据字节序号。这是
避免当一个返回窗口信息的确认丢失之后发生死锁的情
形。
计算机网络--刘桂江
47/87
7.2.6 TCP传输策略(5/5)
Nagle算法
Clark算法(糊涂窗口综合症)
Nagle算法和Clark算法针对糊涂窗口综合症的解决方
案是相互补充的。Nagle算法试图解决由于发送方每
次向TCP只传送一个字节而引起的问题;Clark算法则
试图解决由于接收方每次从TCP流中只读取一个字节
而引起的问题。这两种算法都是有效的,而且可以一
起工作。它们要达到的目标是:发送方不要发送太小
的数据段,接收方也不要请求太小的数据段。
计算机网络--刘桂江
48/87
7.2.7 TCP流量控制和拥塞控制(1/14)
1.TCP流量控制

TCP 采用大小可变的滑动窗口进行流量控制。窗口大小的单位是
字节。
RecvWindow
网络来的数据
空闲缓冲区
缓冲的TCP数
据
用户进程
RecvBuffer
计算机网络--刘桂江
49/87
7.2.7 TCP流量控制和拥塞控制(2/14)


在 TCP 报文段首部的窗口(WIN)字段写入的数值就是当前给对
方设置的发送窗口数值的上限。
发送窗口在连接建立时由双方商定。但在通信的过程中,接收端
可根据自己的资源情况,随时动态地调整对方的发送窗口上限值
(可增大或减小)。
计算机网络--刘桂江
50/87
设主机A和B的连接已经建立完毕,双方商定的初始窗口值是500。再设每
一个报文段的数据字段的长度为100字节,数据报文段序号的初始值为1。
主机 A
主机 B
seq = 1,DATA
A 还能发送 400 字节
seq = 101,DATA
seq = 201,DATA
A 还能发送 300 字节
丢失!
ACK = 1,ack = 201,win=300
seq = 301,DATA
seq = 401,DATA
seq = 201,DATA
ACK =1,ack=501,win = 200
seq = 501,DATA
ACK=1,ack = 601,win = 0
允许 A 再发送 300 字节(序号 201 至 500)
A 还能发送 200 字节(序号 301 至 500)
A 还能发送 100 字节(序号 401 至 500)
A 超时重发,但不能发送序号 500 以后的数据
允许 A 再发送 200 字节(序号 501 至 700)
A 还能发送 100 字节(序号 501 至 700)
不允许 A 再发送(到序号 600 的数据都已收到)
计算机网络--刘桂江
51/87
7.2.7 TCP流量控制和拥塞控制(4/14)
2.TCP拥塞控制


发送端的主机在确定发送报文段的速率时,既要根据接收端的接收
能力,又要从全局考虑不要使网络发生拥塞。
因此,每一个 TCP 连接需要维护以下两个状态变量:


接收窗口 rwnd (receiver window) 又称为通知窗口
(advertised window)。
拥塞窗口 cwnd (congestion window)。
计算机网络--刘桂江
52/87
7.2.7 TCP流量控制和拥塞控制(5/14)


(1) 接收窗口 rwnd
这是接收端根据其目前的接收缓存大小所
许诺的最新的窗口值,是来自接收端的流量控制。接收端将此窗口
值放在 TCP 报文的首部中的窗口字段,传送给发送端。
(2) 拥塞窗口 cwnd (congestion window)
是发送端根据自己估
计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制。
计算机网络--刘桂江
53/87
7.2.7 TCP流量控制和拥塞控制(6/14)
发送窗口的上限值

发送端的发送窗口的上限值应当取为接收端窗口 rwnd 和拥塞窗口 cwnd
这两个变量中较小的一个,即应按以下公式确定:
发送窗口的上限值  Min(rwnd, cwnd)

当 rwnd < cwnd 时,是接收端的接收能力限制发送窗口的最大值。

当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值。
计算机网络--刘桂江
54/87
7.2.7 TCP流量控制和拥塞控制(7/14)
为了在传输层进行拥塞控制,1999年公布的互
联网建议标准[RFC 2581]定义了四种算法,即慢
开始(slow-start)、拥塞避免(congestion
avoidance)、快重传(fast retransmit)和快
恢复(fast recovery)。
计算机网络--刘桂江
55/87
7.2.7 TCP流量控制和拥塞控制(8/14)
慢开始算法的原理




在主机刚刚开始发送报文段时可先将拥塞窗口 cwnd
设置为一个最大报文段 MSS 的数值。
在每收到一个对新的报文段的确认后,将拥塞窗口增
加至多一个 MSS 的数值。
用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以
使分组注入到网络的速率更加合理。
实际上,每一批被确认的报文段都会使拥塞窗口加倍。
拥塞窗口一直呈指数增长,直至发生超时,或者达到
接收窗口的大小。
计算机网络--刘桂江
56/87
7.2.7 TCP流量控制和拥塞控制(9/14)
实际中慢开始算法往往还未出现超时就已停止使用,而
改用拥塞避免算法。因此TCP连接还需要设置另一个状态
参数,称之为慢开始门限ssthresh。它的用法如下:
当cwnd<ssthresh时,使用上述的慢开始算法;
当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞
避免算法;
当cwnd=ssthresh时,或者使用慢开始算法,或者使用
拥塞避免算法。
计算机网络--刘桂江
57/87
7.2.7 TCP流量控制和拥塞控制(10/14)
拥塞避免算法的原理
使发送方的拥塞窗口cwnd每经过一个往返时延RTT
就增加一个MSS的大小(而不管在时间RTT内收到了几
个ACK)。这样,拥塞窗口cwnd将是按线性规律缓慢
增长,比慢开始算法中拥塞窗口的增长速率要缓慢的
多了。
计算机网络--刘桂江
58/87
慢开始和拥塞避免算法的实现举例(1/10)
拥塞窗口 cwnd
发生超时
线性规律增长
24
进入拥塞避免
20
进入拥塞避免
ssthresh = 16
16
12
8
4
更新后的 ssthresh = 12
指数规律增长
传输次数
0
0
2
慢开始
4
6
8
10
12 14 16
拥塞避免
慢开始
18 20 22
拥塞避免
当 TCP 连接进行初始化时,将拥塞窗口置为 1。图中的窗口单
位不使用字节而使用报文段。
慢开始门限的初始值设置为 16 个报文段,即 ssthresh = 16。
计算机网络--刘桂江
59/87
慢开始和拥塞避免算法的实现举例(2 /10)
拥塞窗口 cwnd
发生超时
线性规律增长
24
进入拥塞避免
20
进入拥塞避免
ssthresh = 16
16
12
8
4
更新后的 ssthresh = 12
指数规律增长
传输次数
0
0
2
慢开始
4
6
8
10
12 14 16
拥塞避免
慢开始
18 20 22
拥塞避免
发送端的发送窗口不能超过拥塞窗口 cwnd 和接收端窗口 rwnd
中的最小值。我们假定接收端窗口足够大,因此现在发送窗口
的数值等于拥塞窗口的数值。
计算机网络--刘桂江
60/87
慢开始和拥塞避免算法的实现举例(3 /10)
拥塞窗口 cwnd
发生超时
线性规律增长
24
进入拥塞避免
20
进入拥塞避免
ssthresh = 16
16
12
8
4
更新后的 ssthresh = 12
指数规律增长
传输次数
0
0
2
慢开始
4
6
8
10
12 14 16
拥塞避免
慢开始
18 20 22
拥塞避免
在执行慢开始算法时,拥塞窗口 cwnd 的初始值为 1,发送第一
个报文段 M0。
计算机网络--刘桂江
61/87
慢开始和拥塞避免算法的实现举例(4 /10)
拥塞窗口 cwnd
发生超时
线性规律增长
24
进入拥塞避免
20
进入拥塞避免
ssthresh = 16
16
12
8
4
更新后的 ssthresh = 12
指数规律增长
传输次数
0
0
2
慢开始
4
6
8
10
12 14 16
拥塞避免
慢开始
18 20 22
拥塞避免
发送端收到 ACK1 (确认 M0,期望收到 M1)后,将 cwnd 从 1
增大到 2,于是发送端可以接着发送 M1 和 M2 两个报文段。
计算机网络--刘桂江
62/87
慢开始和拥塞避免算法的实现举例(5 /10)
拥塞窗口 cwnd
发生超时
线性规律增长
24
进入拥塞避免
20
进入拥塞避免
ssthresh = 16
16
12
8
4
更新后的 ssthresh = 12
指数规律增长
传输次数
0
0
2
慢开始
4
6
8
10
12 14 16
拥塞避免
慢开始
18 20 22
拥塞避免
接收端发回 ACK2 和 ACK3。发送端每收到一个对新报文段的确
认 ACK,就把发送端的拥塞窗口加 1。现在发送端的 cwnd 从
2 增大到 4,并可发送 M4 ~ M6共 4个报文段。
计算机网络--刘桂江
63/87
慢开始和拥塞避免算法的实现举例(6 /10)
拥塞窗口 cwnd
发生超时
线性规律增长
24
进入拥塞避免
20
进入拥塞避免
ssthresh = 16
16
12
8
4
更新后的 ssthresh = 12
指数规律增长
传输次数
0
0
2
慢开始
4
6
8
10
12 14 16
拥塞避免
慢开始
18 20 22
拥塞避免
发送端每收到一个对新报文段的确认 ACK,就把发送端的拥塞
窗口加 1,因此拥塞窗口 cwnd 随着传输次数按指数规律增长。
计算机网络--刘桂江
64/87
慢开始和拥塞避免算法的实现举例(7 /10)
拥塞窗口 cwnd
发生超时
线性规律增长
24
进入拥塞避免
20
进入拥塞避免
ssthresh = 16
16
12
8
4
更新后的 ssthresh = 12
指数规律增长
传输次数
0
0
2
慢开始
4
6
8
10
12 14 16
拥塞避免
慢开始
18 20 22
拥塞避免
当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时(即当
cwnd = 16 时),就改为执行拥塞避免算法,拥塞窗口按线性
规律增长。
计算机网络--刘桂江
65/87
慢开始和拥塞避免算法的实现举例(8 /10)
拥塞窗口 cwnd
发生超时
线性规律增长
24
进入拥塞避免
20
进入拥塞避免
ssthresh = 16
16
12
8
4
更新后的 ssthresh = 12
指数规律增长
传输次数
0
0
2
慢开始
4
6
8
10
12 14 16
拥塞避免
慢开始
18 20 22
拥塞避免
假定拥塞窗口的数值增长到 24 时,网络出现超时(表明网络拥
塞了)。
计算机网络--刘桂江
66/87
慢开始和拥塞避免算法的实现举例(9 /10)
拥塞窗口 cwnd
发生超时
线性规律增长
24
进入拥塞避免
20
进入拥塞避免
ssthresh = 16
16
12
8
4
更新后的 ssthresh = 12
指数规律增长
传输次数
0
0
2
慢开始
4
6
8
10
12 14 16
拥塞避免
慢开始
18 20 22
拥塞避免
更新后的 ssthresh 值变为 12(即发送窗口数值 24 的一半),
拥塞窗口再重新设置为 1,并执行慢开始算法。
计算机网络--刘桂江
67/87
慢开始和拥塞避免算法的实现举例(10 /10)
拥塞窗口 cwnd
发生超时
线性规律增长
24
进入拥塞避免
20
进入拥塞避免
ssthresh = 16
16
12
8
4
更新后的 ssthresh = 12
指数规律增长
传输次数
0
0
2
慢开始
4
6
8
10
12 14 16
拥塞避免
慢开始
18 20 22
拥塞避免
当 cwnd = 12 时改为执行拥塞避免算法,拥塞窗口按按线性
规律增长,每经过一个往返时延就增加一个 MSS 的大小。
计算机网络--刘桂江
68/87
7.2.7 TCP流量控制和拥塞控制(11/14)
必须强调指出


“拥塞避免”并非指完全能够避免了拥塞。利
用以上的措施要完全避免网络拥塞还是不可能
的。
“拥塞避免”是说在拥塞避免阶段把拥塞窗口
控制为按线性规律增长,使网络比较不容易出
现拥塞。
计算机网络--刘桂江
69/87
7.2.7 TCP流量控制和拥塞控制(12/14)
慢开始和拥塞避免算法是在TCP中最早
使用的拥塞控制算法。但后来人们发现
这种拥塞控制算法还需要改进,因为有
时一条TCP连接会因为等待重传计时器
的超时而空闲较长的时间。为此后来又
增加了两个新的拥塞控制算法,这就是
快重传和快恢复。
计算机网络--刘桂江
70/87
7.2.7 TCP流量控制和拥塞控制(13/14)
快重传算法的原理


快重传算法规定,发送端只要一连收到三个重复的 ACK 即
可断定有分组丢失了,就应立即重传丢失的报文段而不必
继续等待为该报文段设置的重传计时器的超时。
不难看出,快重传并非取消重传计时器,而是在某些情况
下可更早地重传丢失的报文段。
计算机网络--刘桂江
71/87
快重传举例
主机 A
M1, M2
ACK2, ACK3
M3
M4
ACK3
M5
ACK3
M6
ACK3
M3
主机 B
A 发送 M1 和 M2
B 确认 M1 和 M2
丢失! A 发送 M3 但丢失了
A 发送 M4
B 只能再次确认 M2(因为 M3 没有收到)
A 发送 M5
B 发送第二个重复确认 ACK3
A 发送 M6
B 发送第三个重复确认 ACK3
A 收到了三个重复的确认 ACK3,就立即重传
M3,而不必等待超时重传。
计算机网络--刘桂江
72/87
7.2.7 TCP流量控制和拥塞控制(14/14)
快恢复算法的原理
(1) 当发送端收到连续三个重复的 ACK 时,就重新设置慢开始门限
ssthresh。
(2) 与慢开始不同之处是拥塞窗口 cwnd 不是设置为 1,而是设置为
ssthresh + 3  MSS。
(3) 若收到的重复的 ACK 为 n 个(n > 3),则将 cwnd 设置为
ssthresh + n  MSS。
(4) 若发送窗口值还容许发送报文段,就按拥塞避免算法继续发送报
文段。
(5) 若收到了确认新的报文段的 ACK,就将 cwnd 缩小到 ssthresh。
计算机网络--刘桂江
73/87
7.2.8 TCP计时器(1 /8)
 TCP使用多个定时器来辅助其完成工作,其中最重
要的是重传定时器。
 当TCP实体每发送一个TCP报文段的时候,它同时
也启动一个重传定时器:如果在定时器超时之前该报
文段被确认,则定时器被停止;否则重发该报文段,
并重新启动定时器。
计算机网络--刘桂江
74/87
7.2.8 TCP计时器(2 /8)

由于 TCP 的下层是一个互连网环境,IP 数据报所选择的路由变
化很大。因而传输层的往返时延的方差也很大。
往返时延的
概率分布
往返时延的
概率分布
往返时间
往返时间
T1
T
数据链路层中往返时延的概率密度
T2
TCP中往返时延的概率密度
计算机网络--刘桂江
75/87
7.2.8 TCP计时器(3 /8)
TCP采用了一种自适应算法



记录每一个报文段发出的时间,以及收到相应的确认报文段的时间。
这两个时间之差就是报文段的往返时延。
将各个报文段的往返时延样本加权平均,就得出报文段的平均往返时
延 RTT。
每测量到一个新的往返时延样本,就按下式重新计算一次平均往返时
延 RTT:
平均往返时延RTT
   (旧的RTT)  (1  )  (新的往返时延样本)
在上式中, 是修正因子,取值范围为:0≤  < 1。它决定RTT的历史
值在计算中所占的比例,一般取 =7/8。
计算机网络--刘桂江
76/87
7.2.8 TCP计时器(4 /8)
即使有了一个好的平均RTT值,要选择一个合适的超
时重传时间间隔仍然不是一件很容易的事情。
正常情况下,TCP使用β·RTT作为超时重传间隔,但难
点在于如何选择β。在历史上最初的实现中,总是取β
为2,但经验表明常数值是不够灵活的,因为当发生
变化时它不能够灵活地做出反应。
计算机网络--刘桂江
77/87
7.2.8 TCP计时器(5 /8)
Jacobson算法
在1988年,Jacobson提出来让β与确认到达时间概率密度
函数的标准偏差成正比,即大的变化意味着大的β,反之亦
然。尤其是,他建议使用平均偏差作为标准偏差的粗略估
计。在他的算法中要求TCP实体维护一个被平滑的偏差变量
D,它为来回时间的测定值与估计值之间的偏差。当得到
RTT的最新估计值之后,用以下公式修正变量D:
D = αD + (1-α)|RTT - M|
最后按以下公式设置超时重传时间间隔:
timeout = RTT + 4×D
计算机网络--刘桂江
78/87
7.2.8 TCP计时器(6 /8)
往返时间的确认二义性


TCP 报文段 1 没有收到确认。重传(即报文段 2)后,收到了
确认报文段 ACK。
如何判定此确认报文段是对原来的报文段 1 的确认,还是对重
传的报文段 2 的确认?
发送一个
TCP 报文段
1
超时重传
TCP 报文段
2
是对哪一个报文段
的确认?
收到 ACK
时间
往返时延 RTT?
往返时延 RTT?
计算机网络--刘桂江
79/87
7.2.8 TCP计时器(7 /8)
Karn 算法


在计算平均往返时延 RTT 时,只要报文段重传了,就
不采用其往返时延样本。
这样得出的平均往返时延 RTT 和重传时间就较准确。
计算机网络--刘桂江
80/87
7.2.8 TCP计时器(8/8)
修正的 Karn 算法

报文段每重传一次,就将重传时间增大一些:
新的重传时间    (旧的重传时间)



系数  的典型值是2 。
当不再发生报文段的重传时,才根据报文段的往返时延更
新平均往返时延 RTT 和重传时间的数值。
实践证明,这种策略较为合理。
计算机网络--刘桂江
81/87
7.2.9 UDP协议简介(1/6)



UDP和TCP不同,它是一种无连接方式的、不可靠的传
输协议,也就是说不需要连接建立和连接释放过程,
没有流量控制、拥塞控制,UDP数据报在传输过程中
可能会丢失,可能会失序,可能会延迟等等。
它是一个非常简单的传输层协议。
UDP仅仅是在IP提供的服务基础上增添了多路复用和
分用的功能。
计算机网络--刘桂江
82/87
7.2.9 UDP协议简介(2/6)
UDP的优点:
 UDP是无连接的,减少了开销和发送数据之前的时延。
 UDP是尽最大努力交付,即不保证可靠交付,同时也不使
用拥塞控制,因此主机上不需要维持具有许多参数的、
复杂的连接状态表。
 由于UDP没有拥塞控制,因此网络出现的拥塞也不会使源
主机的发送速率降低。这对某些实时应用是很重要的。
 UDP是面向报文的。也就是说,UDP对应用程序交下来的
报文不再划分成若干个分组来发送,也不会把收到的若
干个报文合并后再交付给应用程序。
 UDP用户数据报的首部只有8个字节,比TCP报文段的首部
至少是20个字节要短,大大减小了网络开销。
计算机网络--刘桂江
83/87
7.2.9 UDP协议简介(3/6)
UDP用户数据报的首部和伪首部
字节
4
4
1
源 IP 地址
目的 IP 地址
0
字节
12
伪首部
2
源端口
UDP 用户数据报
2
目的端口
1
17 UDP长度
2
长 度
首 部
2
2
检验和
数
据
发送在前
首 部
数
据
IP 数据报
计算机网络--刘桂江
84/87
7.2.9 UDP协议简介(4/6)
用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段有 8
个字节,由 4 个字段组成,每个字段都是两个字节。
4
4
1 1
2
字节
0 17 UDP长度
源 IP 地址
目的 IP 地址
字节
12
伪首部
2
源端口
UDP 用户数据报
2
目的端口
2
长 度
首 部
2
检验和
数
据
发送在前
首 部
数
据
IP 数据报
计算机网络--刘桂江
85/87
7.2.9 UDP协议简介(5/6)
在计算检验和时,临时把“伪首部”和 UDP 用户数据报连接在
一起。伪首部仅仅是为了计算检验和。
字节
4
4
1
源 IP 地址
目的 IP 地址
0
字节
12
伪首部
2
源端口
UDP 用户数据报
2
目的端口
1
17 UDP长度
2
长 度
首 部
2
2
检验和
数
据
发送在前
首 部
数
据
IP 数据报
计算机网络--刘桂江
86/87
计算 UDP 检验和的例子
12 字节
伪首部
8 字节
UDP 首部
7 字节
数据
10011001 00010011
00001000 01101000
153.19.8.104
10101011 00000011
171.3.14.11
00001110 00001011
全 0 17
15
00000000 00010001
1087
13
00000000 00001111
15
全0
数据 数据 数据 数据 00000100 00111111
00000000 00001101
数据 数据 数据 全 0
00000000 00001111
00000000 00000000
填充
01010100 01000101
01010011 01010100
01001001 01001110
01000111 00000000
→
→
→
→
→
→
→
→
→
→
→
→
→
→
153.19
8.104
171.3
14.11
0 和 17
15
1087
13
15
0(检验和)
数据
数据
数据
数据和 0(填充)
按二进制反码运算求和 10010110 11101011 → 求和得出的结果
将得出的结果求反码 01101001 00010100 → 检验和
计算机网络--刘桂江
87/87