tcp

55
TCP 概概 概概概概 概概概概 TCP 概概概 概 概概概概概概概 概概概概 (Timer)

Upload: armani

Post on 05-Jan-2016

82 views

Category:

Documents


4 download

DESCRIPTION

TCP. √. 概述 报文格式 连接管理 TCP 的数据传输 流控与拥塞控制 错误控制 (Timer). √. √. √. Congestion Control vs Flow Control. Congestion control is a global issue – involves every router and host within the subnet: keep sender from overrunning network - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: TCP

TCP

概述 报文格式 连接管理 TCP 的数据传输 流控与拥塞控制 错误控制 (Timer)

√√

√√

Page 2: TCP

网络

(a) Flow controlFlow control

(b) Congestion controlCongestion control

Congestion Control vs Flow Control•Congestion control is a global issue – involves every router Congestion control is a global issue – involves every router and host within the subnet: keep sender from overrunning and host within the subnet: keep sender from overrunning networknetwork•Flow control – scope is point-to-point; involves just sender Flow control – scope is point-to-point; involves just sender and receiver: keep sender from overrunning receiver.and receiver: keep sender from overrunning receiver.

Page 3: TCP

流控与阻塞控制• Flow Control 常用的流量控制方法有:漏桶 (leaky bucket) 技术、停 -- 等( Stop and Wait )协议、滑动窗口( Sliding Window )协议、 ON/OFF ,端 - 端流量控制等

• Congestion Control 常用的拥塞控制方法有:资源预分配、数据包丢弃、定数拥塞控制法和抑制数据包法。

Page 4: TCP

图 拥塞控制所起的作用 图 拥塞控制所起的作用

输入负载

吞吐量

子网的最大传输容量

理想的拥塞控制

理想的拥塞控制

实际的拥塞控制

实际的拥塞控制

0

网络吞吐量= 网络负载

网络吞吐量= 网络负载

吞吐量饱和吞吐量饱和

无拥塞控制

无拥塞控制

轻度拥塞 拥塞

死锁

死锁

拥塞控制

Page 5: TCP

TCP 流量控制

Page 6: TCP

TCP 流控

接收方 : 明确通知发送方空闲缓存空间 TCP 报文段中的

接收窗口域发送方 : 保持已发

送但未确认的数据少于当前的接收窗口

发送方传输数据不能太多太快以致于淹没接收方的缓存

流控

接收方缓存

RcvBuffer = size or TCP Receive Buffer

RcvWindow = amount of spare room in Buffer

Page 7: TCP

acknowledged sent can be sent outside window

源端口源端口 目的端口目的端口

序列号序列号

确认号确认号

首部长度 / 码元比特首部长度 / 码元比特 窗口窗口

校验和校验和 紧急指针紧急指针

选项 ..选项 ..

源端口源端口 目的端口目的端口

序列号序列号

确认号确认号

首部长度 / 码元比特首部长度 / 码元比特 接收窗口接收窗口

校验和校验和 紧急指针紧急指针

选项 ..选项 ..

Packet Sent Packet Received

App write

滑动流量控制 : 发送方

Page 8: TCP

利用可变窗口进行流量控制举例

主机 A 向主机 B 发送数据,双方商定的窗口值是 400 ,每一个报文段为 100 字节,序号的初始值为 1 。主机 B 进行了 3 次流量控制。

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 丢失!

Page 9: TCP

TCP 拥塞控制

Page 10: TCP

拥塞问题问题 : 对资源的需求超过了可用资源( < )

1

n

可用容量需求

n

1

User 1

User 2

User n

x1

x2

xn

xi>Xgoal

y

解决方法 : 避免用户的发送量超过网络的能力

Page 11: TCP

拥塞控制的基本方法 通信量整形法。把主机向网络输出数据的速率调整到一个

固定的平均速率,以使路由器能够以现有资源平稳地处理它。通信量整形法的两个代表是漏桶算法 (leaky bucket algorithm) 和令牌桶算法 (token bucket algorithm) 。

拥塞预警法。其原理是 : 路由器建立一种拥塞预警机制,当轻度拥塞发生时,通知源主机减少发送数据的数量,避免拥塞加剧。 ICMP(internet control message protocol)协议的源抑制报文就采用拥塞预警原理。

TCP implements host-based, feedback-based, window-based congestion control.

基于路由器的主动队列管理 (AQM) 。

Page 12: TCP

ICMP Choke Packets

图 基于数据报服务的拥塞控制策略图 基于数据报服务的拥塞控制策略

源主机 目的主机

警告警告!!

抑制分组

抑制分组

抑制分组

抑制分组

主机收到抑制分组后,逐步减少发送给目的主机的分组数量,一般改变发送窗口或采用漏桶输出

率等。

主机收到抑制分组后,逐步减少发送给目的主机的分组数量,一般改变发送窗口或采用漏桶输出

率等。

Page 13: TCP

轻度拥塞 – 该点后 吞吐量增长缓慢 延迟增加加快

完全拥塞 – 该点后 吞吐量快速下降直至零

( 拥塞崩溃 ) 无穷大延迟

对于 M/M/1 排队模型 延时 = 1/(1 – 利用率 )

负载

负载

吞吐

量延

轻度拥塞 完全拥塞

拥塞崩溃

丢弃报文

拥塞 : A Close-up View

Page 14: TCP

阻塞控制的目标 控制在悬崖( cliff )的左边

阻塞避免的目标 控制在拐点( knee )的左

边 悬崖的右边 :

由于拥塞导致崩溃

Load

Th

rou

ghp

ut knee cliff

congestioncollapse

拥塞控制与拥塞避免

Page 15: TCP

拥塞检测 发生报文丢失时表示发生了拥塞, TCP 发送方通过以下方式

检测丢包 传输定时器超时 收到重复的 ACK( 至少三个 ) ECN ( 显式拥塞通知 )

Src DstPacket

AckDrop

Timeout! No Ack = Congestion!

Page 16: TCP

Controlling Congestion

Reduce window less packets in the network

Increase window more packets in the network

Idea: Concept of a congestion window – window is smaller when congestion is larger and vice versa

Page 17: TCP

TCP 拥塞控制

• TCP 拥塞控制机制。由发送方实现• 发送方的发送窗口大小设置如下 : 发送窗口 = MIN ( 流控窗口 , 拥塞窗口 )其中• 流控窗口:由接收方通报 ( 即 TCP 报头中的窗

口字段的值 ) • 拥塞窗口:由发送端根据网络的反馈来动态调

整• rwnd prevents the sender from overwhelming th

e receiver and cwnd prevents the data from overwhelming the network.

Page 18: TCP

TCP 拥塞控制

• 发送方有两个附加的参数:– 拥塞窗口 (cwnd)

初值是 1 MSS (=maximum segment size)

– 慢启动阀值 Slow-start threshhold Value (ssthresh)

初值设置为接收方通报窗口的大小 • 拥塞控制的两种工作状态 :

– 慢启动 (cwnd < ssthresh)

– 阻塞避免 (cwnd >= ssthresh)

Page 19: TCP

慢启动

慢启动:快速增加拥塞窗口• 初值 :

– cwnd = MSS bytes (=1 segment)

• 每收到一个确认就把 cwnd 翻倍 (cwnd++).

• 直到 cwnd >= ssthresh ,进入拥塞避免工作状态。

Page 20: TCP

拥塞避免

目标 : 通过慢慢增加拥塞窗口的大小,保持工作在完全拥塞点( cliff) 的左边 :

如何实现 ? (AIMD) Additive increase: 从一个较粗的估计值 (s

sthresh)开始 , 缓慢增加 cwnd 以探测额外的可用带宽

Multicative decrease: 一旦发现丢失报文( 拥塞发生 ) 立即将拥塞窗口的大小减半 .

Page 21: TCP

TCP 拥塞控制总结 : 伪码Initially:

cwnd = 1;ssthresh = infinite;

New ack received:if (cwnd < ssthresh) /* Slow Start*/ cwnd = cwnd + +;else /* Congestion Avoidance */ cwnd = cwnd + 1;

Timeout: (loss detection)/* Multiplicative decrease */ssthresh = win/2;cwnd = 1;

while (next < unack + win)

transmit next packet;

where win = min(cwnd, flow_win);

unack next

win

seq #

cwnd:additive increase / multiplicative decrease (AIMD)

Page 22: TCP

慢开始和拥塞避免算法的实现举例

当 TCP 连接进行初始化时,将拥塞窗口置为 1 。图中的窗口单位不使用字节而使用报文段。假定慢启动门限的初始值设置为 16 个报文段,即 ssthresh = 16 。

2 4 6 8 10 12 14 16 18 20 2200

4

8

12

16

20

24

传输次数

拥塞窗口 cwnd

进入拥塞避免

发生超时

指数规律增长

线性规律增长

ssthresh = 16

慢启动 慢启动拥塞避免 拥塞避免

更新后的 ssthresh = 12

进入拥塞避免

Page 23: TCP

慢启动始和拥塞避免算法的实现举例

发送端的发送窗口不能超过拥塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我们假定接收端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值。

2 4 6 8 10 12 14 16 18 20 2200

4

8

12

16

20

24

传输次数

拥塞窗口 cwnd

进入拥塞避免

发生超时

指数规律增长

线性规律增长

ssthresh = 16

慢启动 慢启动拥塞避免 拥塞避免

更新后的 ssthresh = 12

进入拥塞避免

Page 24: TCP

慢启动和拥塞避免算法的实现举例

在执行慢启动算法时,拥塞窗口 cwnd 的初始值为 1,发送第一个报文段 M0 。

2 4 6 8 10 12 14 16 18 20 2200

4

8

12

16

20

24

传输次数

拥塞窗口 cwnd

进入拥塞避免

发生超时

指数规律增长

线性规律增长

ssthresh = 16

慢启动 慢启动拥塞避免 拥塞避免

更新后的 ssthresh = 12

进入拥塞避免

Page 25: TCP

慢启动和拥塞避免算法的实现举例

2 4 6 8 10 12 14 16 18 20 2200

4

8

12

16

20

24

传输次数

拥塞窗口 cwnd

进入拥塞避免

发生超时

指数规律增长

线性规律增长

ssthresh = 16

慢启动 慢启动拥塞避免 拥塞避免

更新后的 ssthresh = 12

进入拥塞避免

发送端收到 ACK1 (确认 M0 ,期望收到 M1 )后,将 cwnd 从 1 增大到 2 ,于是发送端可以接着发送 M1 和 M2 两个报文段。

Page 26: TCP

慢启动和拥塞避免算法的实现举例

接收端发回 ACK2 和 ACK3 。发送端每收到一个对新报文段的确认 ACK ,就把发送端的拥塞窗口翻倍。现在发送端的 cwnd 从 2 增大到 4 ,并可发送 M4 ~ M

6共 4 个报文段。

2 4 6 8 10 12 14 16 18 20 2200

4

8

12

16

20

24

传输次数

拥塞窗口 cwnd

进入拥塞避免

发生超时

指数规律增长

线性规律增长

ssthresh = 16

慢启动 慢启动拥塞避免 拥塞避免

更新后的 ssthresh = 12

进入拥塞避免

Page 27: TCP

慢启动和拥塞避免算法的实现举例

发送端收到一个对新报文段的确认 ACK ,再一次把发送端的拥塞窗口翻倍,因此拥塞窗口 cwnd 随着传输次数按指数规律增长。

2 4 6 8 10 12 14 16 18 20 2200

4

8

12

16

20

24

传输次数

拥塞窗口 cwnd

进入拥塞避免

发生超时

指数规律增长

线性规律增长

ssthresh = 16

慢启动 慢启动拥塞避免 拥塞避免

更新后的 ssthresh = 12

进入拥塞避免

Page 28: TCP

慢启动和拥塞避免算法的实现举例

当拥塞窗口 cwnd 增长到慢启动门限值 ssthresh 时(即当 cwnd = 16 时),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。

2 4 6 8 10 12 14 16 18 20 2200

4

8

12

16

20

24

传输次数

拥塞窗口 cwnd

进入拥塞避免

发生超时

指数规律增长

ssthresh = 16

慢启动 慢启动

线性规律增长

拥塞避免 拥塞避免

更新后的 ssthresh = 12

进入拥塞避免

Page 29: TCP

慢启动和拥塞避免算法的实现举例

假定拥塞窗口的数值增长到 24 时,网络出现超时(表明网络拥塞了)重新开始慢启动。

2 4 6 8 10 12 14 16 18 20 2200

4

8

12

16

20

24

传输次数

拥塞窗口 cwnd

进入拥塞避免

发生超时

指数规律增长

线性规律增长

ssthresh = 16

慢启动 慢启动拥塞避免 拥塞避免

更新后的 ssthresh = 12

进入拥塞避免

Page 30: TCP

慢启动和拥塞避免算法的实现举例

更新后的 ssthresh 值变为 12 (即发送窗口数值 24 的一半),拥塞窗口再重新设置为 1 ,并重新执行慢启动算法 ,从 1开始指数地增加发送量。

2 4 6 8 10 12 14 16 18 20 2200

4

8

12

16

20

24

传输次数

拥塞窗口 cwnd

进入拥塞避免

发生超时

指数规律增长

线性规律增长

ssthresh = 16

慢启动 慢启动拥塞避免 拥塞避免

更新后的 ssthresh = 12

进入拥塞避免

Page 31: TCP

慢启动和拥塞避免算法的实现举例

当 cwnd = 12 时改为执行拥塞避免算法,拥塞窗口按按线性规律增长,每经过一个往返时延就增加一个 MSS 的大小。

2 4 6 8 10 12 14 16 18 20 2200

4

8

12

16

20

24

传输次数

拥塞窗口 cwnd

进入拥塞避免

发生超时

指数规律增长

线性规律增长

ssthresh = 16

慢启动 慢启动拥塞避免 拥塞避免

更新后的 ssthresh = 12

进入拥塞避免

Page 32: TCP

拥塞响应

• TCP 采用不同的算法来处理阻塞问题– Tahoe TCP – 基本算法(前面介绍的方法)– Reno TCP -Tahoe + 快速恢复– New Reno TCP – 改进的 Reno• 其它的 :– SACK TCP– Fack TCP–TCP Vegas

Page 33: TCP

TCP Reno

• Tahoe 的问题 : 如果一个报文分组丢失了 , 直到超时才能被发现 ---- 时延大

• Reno 增加了快速重传和快速恢复机制• 如果接收到 3 个重复的确认重发估计已经丢失的报文分组 (“ 快速重传” )设置 cwnd = cwnd / 2设置 ssthresh = cwnd即,不进入慢启动 , 而是直接进入拥塞避免 (“ 快速恢复” )

Page 34: TCP

M1, M2

ACK2, ACK3

M4

主机 A 主机 B

B 确认 M1 和 M2

A 发送 M1 和 M2

A 收到了三个重复的确认 ACK3 ,就立即重传 M3 ,而不必等待超时重传。

M3 丢失! A 发送 M3 但丢失了A 发送 M4

ACK3

M5 A 发送 M5

ACK3 B 发送第二个重复确认 ACK3M6 A 发送 M6

ACK3

M3

B 发送第三个重复确认 ACK3

B 只能再次确认 M2(因为 M3 没有收到)

快重传举例

ACK7

Page 35: TCP

快速重传后把 cwnd 设为 ssthresh/2 i.e., 不把 cwnd 重置 1

但当 RTO (重传超时)时还是要把 cwnd 置 1

快速恢复

Page 36: TCP

三个重复的 ACK 后 ,开始快速重传 避免了代价高昂的超时

不必再次慢启动 在稳定状态 , cwnd 在最优窗口大小附近振荡

Time

cwnd

Slow Start

CongestionAvoidance

快速重传与快速恢复

Page 37: TCP

重新组包( repacketization)

• TCP 重传时 , 报文大小不一定与重发前相同

Page 38: TCP

New Reno

• 与 Reno TCP 类似,但在收到新的确认后,修正完善所采取的行动

• New Reno 对 Reno 中“快速恢复”算法进行了补充。它考虑了一个发送窗口内多个报文丢失的情况。在 Reno 的“快速恢复”算法中,发送方收到一个不重复的应答后就退出“快速恢复”状态。而在 New Reno 中,只有当所有报文都被应答后才退出“快速恢复”状态。

Page 39: TCP

SACK SACK 也关注一个窗口内多个报文的丢失,它使

用“选择性重复” (selective repeat)策略。 SACK TCP 通过在 TCP 报文段头部增加 SACK选项,通知另外一方本方的数据接收信息。根据这些信息发送方可以发现多个报文段丢失的现象。避免了之前版本的 TCP 重传一个窗口内所有数据包的情况,而只是重传那些被丢弃的数据包。

但是 SACKTCP 需要收发双方都支持 SACK选项,如果连接的一方不支持该选项,其工作方式与 Reno TCP相同。

Page 40: TCP

TCP Vegas

Uses congestion avoidance instead of congestion control Reno: Congestion control React to congesti

on after it occurs Vegas: Congestion avoidance Predict and av

oid congestion before it occurs

Page 41: TCP

Bottleneck LinkOverloadedRouter

Sending Rate

cwnd

Sending Rate = cwnd / RTT

Observation Packet accumulation in the network can be

inferred by monitoring RTT and sending rate

Page 42: TCP

TCP Vegas Congestion Control BaseRTT is the minimum of all measured RTTs (c

ommonly the RTT of the first packet) If not overflowing the connection, then

ExpectRate = CongestionWindow/BaseRTT Source calculates ActualRate once per RTT Source compares ActualRate with ExpectRate

Diff = ExpectedRate - ActualRateif Diff <

increase CongestionWindow linearlyelse if Diff >

decrease CongestionWindow linearlyelse

leave CongestionWindow unchanged

Page 43: TCP

随机早期丢弃 RED (Random Early Discard) 基于路由器的拥塞控制方法 使路由器的队列维持两个参数,即队列长度最小门限 THmin 和最大门限 THmax。

RED 对每一个到达的数据报都先计算平均队列长度 LAV。 若平均队列长度小于最小门限 THmin ,则将新到达的数据报放入队列进行排队。

若平均队列长度超过最大门限 THmax,则将新到达的数据报丢弃。 若平均队列长度在最小门限 THmin 和最大门限 THmax 之间,则按照某

一概率 p 将新到达的数据报丢弃。

从队首发送

最小门限 THmin

最大门限 THmin

数据报到达

平均队列长度 La

v

排队丢弃 以概率 p 丢弃

Page 44: TCP

最小门限 THmin最大门限 THmax

平均队列长度 Lav

数据报丢弃概率 p1.0

0

pmax

丢弃概率 p 与 THmin 和 Thmax 的关系当 LAV Thmin 时,丢弃概率 p = 0 。

当 LAV Thmax 时,丢弃概率 p = 1 。当 THmin LAV THmax 时, 0 p 1 。 例如,按线性规律变化,从 0 变到 pmax 。

Page 45: TCP

TCP

概述 报文格式 连接管理 TCP层的数据传输 流控和拥塞控制 错误控制 (Timer)

√√

√√

Page 46: TCP

TCP 错误控制

• TCP 实现了回退 N帧重传机制• TCP 为每个连接维持了四个定时器• TCP 同时进行错误控制和拥塞控制 (TCP假定错误是由拥塞引起的 )

• TCP 允许加速重发 ( 快速重传 )

Page 47: TCP

TCP 使用 4个定时器来完成各种功能,其中有: 重发定时器 (retransmission timer)

发送每个段的同时启动此定时器。在时钟超时前,收到该段确认,关闭此定时器。在时钟超时前,没有收到该段确认,重发该段。

问题:超时间隔设为多长合理??? 持续定时器 (persistence timer)

用于解决死锁。在发送接收双方由于某种原因(例如丢包)而相互等待,产生死锁时。如果持续定时器超时,发送方向接收方发送一个探测数据,打破死锁。

keepalive timer 当一个连接被长时间闲置时,如果 keepalive 定时器超时,就发送一个段去检测连

接的另一方是否依旧存在。如果没有得到相应,就中止该连接。 TIMED WAIT timer

在取消连接的操作中使用此 TIMED WAIT 定时器。时间长度为分组 TTL的两倍,以确保当一个连接断开之后,所有被此连接创建的分组都完全消失。

TCP 的定时管理

Page 48: TCP

TCP 重发定时器

– 重发定时器的设定对效率至关重要 超时值过小 -> 导致不必要的重传 超时值过大 -> 导致过长的等待时间

– 问题在于网络中的延迟不是固定的

– 因此 , 重传定时器必须能够自适应

Page 49: TCP

Karn 算法无重传时, TCP根据下列( 1 ),( 2 )重传时间TIMEOUT=β*RTT ( 1 )其中, β>1 的常数( TCP推荐 β=2 )RTT :估算的往返时间,是一个加权平均值。RTT=α*Old_RTT+ ( 1-α ) *New_Round_Trip_Sample (2)其中, 0≤α≤1 常数加权因子Old_RTT :上一个往返时间估算值。New_Round_Trip_Sample :实际测出的前一个段的往返时间(样本)。当发生重传时,用下列公式计算新的重传时间New_Timeout=γ*Timeout (3)其中, γ>1 ,典型值为 γ=2 ,即每重传一次,超时值加倍。

Page 50: TCP

TCP 持续定时器

• 假定窗口大小变小为零,启动窗口的确认信息丢失

两边都将阻塞( blocked ) .

持续定时器 : 促使发送方周期性地询问接收方接收窗口的大小 ( 即,接收窗口大小探测 )

Page 51: TCP

TCP 持续定时器

• 持续定时器在滑动窗口变为零时由发送方启动

持续定时器使用指数后退 ( 初始值为 5 秒 ) , 变化区间 [5s, 60s] 。两次超时之间的时间间隔为 :

5, 5, 6, 12, 24, 48, 60, 60, ...

窗口探测报文只有一个字节的数据 ( 窗口大小为零时 TCP 也要发送窗口探测报文 )

Page 52: TCP

TCP Persist Timer

Page 53: TCP

TCP 存活期定时器

• 当一个 TCP 连接闲置了一段时间后 , 存活期定时器会自动提醒站点检查另一方是否还存在 .

• 如果一个连接已经处于空闲状态 2 个小时,探测信息包将会被发送

• 假定一个探测包从 A 发到 B:(1) B is up and running: B 以 ACK应答(2) B has crashed and is down: A 将每 75秒发送一个探测

包,共发 10 个 . 如果 A 仍然没有收到确认 , 连接将会被关闭

(3) B has rebooted: B 会发送一个 RST 报文分组(4) B is up, but unreachable: 参照 (2)

Page 54: TCP

TCP 性能优化

选择性确认( SACK ) : 指定目的站接收的分组块

随机早期丢弃 (RED) 策略:使丢包率更均匀,减少平均排队长度 和丢报率 .

调度机制保护正常的信息流,拒绝不良的信息流.

显式拥塞通告 (ECN): 路由器明确通过拥塞指示位来通报拥塞,而不是通过丢包来判断 .

Page 55: TCP

Thanks !