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=y1
三次握手法
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